Zum Inhalt springen

Datenbankzugriff / SQL Abfragen


korea1

Empfohlene Beiträge

Hallo,

ich muss mittels Visual Basic ( neueste Version ) einen Zugriff auf eine IBM DB2 machen.

Normallerweise programmiere ich nur in php und hab mal ein bischen in VB programmiert. Allerdings nix mit Datenbanken.

Daher hab ich jetzt ein paar Fragen.

So viel ich weiß gibt es 2 Möglichkeiten eine Datenbankverbindung mittels VB aufzubauen. Die eine is ADO und die andere fällt mir grad nicht mehr ein.

Kann ich das ähnlich wie in php realisieren? Das heisst ich habe eine Datei, in der stehen die Verbindungsinformationen zur DB. Also User, Passwort, Adresse usw. Was muss diese Datei für eine Endung haben und wo muss ich diese ablegen?

In dem VB Script hab ich dann einen Connect String, der mir die Verbindung zur DB aufbaut.

Allerdings weiß ich nicht so recht, wie das in VB aussieht. Kann mir jemand ein kleines Beispiel geben, wie so eine Datei inklusive Datenbankverbindung aussieht.

Und dann sollte ich noch wissen, wie ich SQL statements absetzen kann.

Geht das auch ähnlich wie in PHP. Das heisst, ich hab einen String, in dem steht mein SQL Befehl drin und der wird dann weiter verarbeitet.

In php/mysql sieht das ja ungefähr wie folgt aus:

mysql_result -> liefert die Ergebnisse einer Abfrage

mysql_num_rows->mit diesem befehl kann ich Datensatz für Datensatz, also mit einer Schleife durch mein Ergebnis gehen.

Da ich mich in VB und DB-Zugriff nicht auskenne, bräuchte ich auch hier ein Beispiel für eine einfache SELECT Abfrage und wie ich auf das Ergebnis zugreifen kann.

Und dann wärs noch ganz praktisch, wenn Ihr mir ne gute Seite empfehlen könntet, dass ich mich dann auch selbst tiefer in die Materie einlesen kann.

Jetzt schon mal vielen Dank für Eure Hilfe.

MfG

korea1

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi!

was Du vorhast ist Teil meines Abschlussprojektes für FISI.

Ich progge auch mit PHP und SQL rum, will Daten mittels VBS in die Datenbank hauen.

Guck Dir mal folgenden Quellcode an:

Const adOpenStatic = 3

Const adLockOptimistic = 3

Const adUseClient = 3

Set objConnection = CreateObject("ADODB.Connection")

Set objRecordset = CreateObject("ADODB.Recordset")

objConnection.Open "DSN=Inventory;"

objRecordset.CursorLocation = adUseClient

objRecordset.Open "SELECT * FROM Hardware" , objConnection, _

adOpenStatic, adLockOptimistic

Set colSoundCards = GetObject("winmgmts:").ExecQuery _

("Select * from Win32_SoundDevice")

For Each objSoundCard in colSoundCards

objRecordset.AddNew

objRecordset("ComputerName") = objSoundCard.SystemName

objRecordset("Manufacturer") = objSoundCard.Manufacturer

objRecordset("ProductName") = objSoundCard.ProductName

objRecordset.Update

Next

objRecordset.Close

objConnection.Close

Wie Du siehst ist das VBS mit SQL gemixt. Wenn Du SQL kannst, ist dies ja kein Problem.

Bei Microsoft gibt es gute Seiten. U.A. auch das Scriptcenter, wo dieser Teil draus ist: http://www.microsoft.com/technet/scriptcenter/default.mspx

Und auch: http://www.activevb.de/tutorials/tut_mysqldb/mysqldb.html

Ich glaub Du verwechselst den Ausdruck String (Zeichenkette) mit einer Variabel.

mysql_num_rows() gibt Dir die Zeilenanzahl als Ganzzahl zurück. Das Ergebnis kannst Du dann tatsächlich in einer while oder for-Schleife benutzen.

Meld Dich wieder.

Gruß,

Andy

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo.

WICHTIG: Microsoft ActiveX Data Objects Recordset 2.6 Library und Microsoft ActiveX Data Objects 2.6 Library unter "Projekt"->"Verweise" hinzufügen.

Beispiel einer modDatenbank.bas (Zugriff auf Datenbanken)


Option Explicit

Public strDatenbankname As String

Private connAktiv As Connection

Public rsOne As Recordset

Public rsTwo As Recordset

Public sqlQuery As New Command

Private lngFehler As Long


Public Function connect_db(ByVal strDatenbank As String) As Boolean

On Error Resume Next

    Set connAktiv = New Connection

    connAktiv.CursorLocation = adUseClient

    connAktiv.Mode = adModeShareDenyNone

    connAktiv.Provider = "Microsoft.Jet.OLEDB.3.51"

    connAktiv.ConnectionString = strDatenbank

    connAktiv.Open

    sqlQuery.ActiveConnection = connAktiv

    sqlQuery.CommandType = adCmdText

    lngFehler = Err.Number

On Error GoTo 0

    If lngFehler = 0 Then connect_db = True Else connect_db = False

End Function


Public Function connect_db_odbc(ByVal strDatenbank As String, ByVal strUser As String, strPassword As String) As Boolean

On Error Resume Next

    Set connAktiv = New Connection

    connAktiv.CursorLocation = adUseClient

    connAktiv.Open "Data Source=" & strDatenbank & "; User ID=" & strUser & "; PWD=" & strPassword

    strPassword = ""

    sqlQuery.ActiveConnection = connAktiv

    sqlQuery.CommandType = adCmdText

    lngFehler = Err.Number

On Error GoTo 0

    If lngFehler = 0 Then connect_db_odbc = True Else connect_db_odbc = False

End Function


Public Sub disconnect_db()

On Error Resume Next

    connAktiv.Close

On Error GoTo 0

End Sub


Public Sub kill_db_objects()

    Set connAktiv = Nothing

    Set rsOne = Nothing

    Set rsTwo = Nothing

    Set sqlQuery = Nothing

End Sub

Beispiel einer modIni.bas (Zugriff auf INI-Dateien)

Option Explicit

Declare Function GetPrivateProfileStringByKeyName& Lib "kernel32" Alias _

    "GetPrivateProfileStringA" (ByVal lpApplicationName$, ByVal lpszKey$, ByVal lpszDefault$, ByVal lpszReturnBuffer$, ByVal cchReturnBuffer&, ByVal lpszFile$)

Declare Function WritePrivateProfileStringByKeyName& Lib "kernel32" Alias _

    "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lplFileName As String)

Public Const READ_BUFF As Long = 255


Function ReadFromFile(strFileSection As String, strKey As String, Dateiname As String) As String

Dim strValue As String

Dim lngRetLen As Long

    'Liest einen Eintrag aus der angegebenen .ini Datei

    strValue = String(READ_BUFF + 1, Space(1))

    lngRetLen = GetPrivateProfileStringByKeyName(strFileSection, strKey, "", strValue, READ_BUFF, Dateiname)

    If lngRetLen > 0 Then

        ReadFromFile = Left(strValue, lngRetLen)

    Else

        ReadFromFile = ""

    End If

End Function


Function WriteToFile(strFileSection As String, strKey As String, strValue As String, Dateiname As String) As Long

    'Schreibt einen Eintrag in die angegebene .ini Datei

    If Len(strKey) > READ_BUFF Or Len(strValue) > READ_BUFF Then

        MsgBox "Can't write more than " & READ_BUFF & " characters for key or value."

        WriteToFile = -1

        Exit Function

    End If

    WriteToFile = WritePrivateProfileStringByKeyName(strFileSection, strKey, strValue, Dateiname)

End Function

Beispiel einer Hauptform:

Option Explicit


Private Sub btnSQLAbsetzen_Click()

    modDatenbank.sqlQuery.CommandText = "SELECT * FROM TABLE;"

    Set modDatenbank.rsOne = modDatenbank.sqlQuery.Execute

    modDatenbank.rsOne.MoveFirst

    While Not modDatenbank.rsOne.EOF

        AUSGABE(modDatenbank.rsOne.Fields(0).Value

        AUSGABE(modDatenbank.rsOne.Fields(1).Value

        modDatenbank.rsOne.MoveNext

    Wend

End Sub


Private Sub btnVerbinden_Click()

    If modDatenbank.connect_db_odbc(modIni.ReadFromFile("Datenbank", "Datenbankname", App.Path & "\Datenbank.ini"), modIni.ReadFromFile("Datenbank", "User", App.Path & "\Datenbank.ini"), modIni.ReadFromFile("Datenbank", "Passwort", App.Path & "\Datenbank.ini")) Then

        MsgBox "Verbindungsaufbau erfolgreich"

    Else

        MsgBox "Verbindugnsaufbau fehlgeschlagen"

    End If

End Sub

Beispiel der INI-Datei (Datenbank.ini):

[Datenbank]

Datenbankname = Testdatenbank

User = Hugo

Passwort = geheim

Links:

VB-Fun.de

ActiveVB.de

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

also erst mal vielen dank für Eure schnellen und ausführlichen Antworten.

Ich werd mich da jetzt mal langsam einlesen.

Das blöde is nur, dass ich wie gesagt nur sehr kurz mal in VB programmiert hab und wir das neue VB noch nicht gekauft haben.

Das heißt ich muss jetzt zwar eine Lösung erstellen, das aber leider komplett theoretisch und muss sie dann in kürzester Zeit programmiert haben.

Das ist sehr bescheiden, weil ich so nicht mal debuggen kann.

Aber ich werd mich hier im Forum auch sicher nochmal melden.

Kann mir jemand noch eine gutes VB Buch empfehlen?

Ich bräuchte auf jeden Fall noch Infos zum Schreiben in Dateien.

Läuft das z.B. ähnlich wie in Perl? Datei zum schreiben und anhängen öffnen.

Und zwar soll es so aussehen, dass ich die Daten, die ich aus der Datenbank ausgelesen hab in eine Datei schreiben muss. Z.B. in eine Text Datei.

Ich hab mir das so vorgestellt, dass ich eine Datei zum Schreiben öffne und dann nach jedem Wert, den ich aus der Datenbank gelesen habe ein Semikolon schreibe und am Ende des Datensatzes ein Enter.

Brauche ich in VB auch den ASCII Wert des Satzzeichens?

Soweit danke und MfG

korea1

Link zu diesem Kommentar
Auf anderen Seiten teilen

Modul modDateizugriff.bas (Unter "Projekt"->"Verweise" die Microsoft Scripting Runtime hinzufügen.


Option Explicit

Private fsoDateihandling As FileSystemObject

Private tsInput As TextStream


Public Sub neue_Datei_erzeugen(strDateiname as String)

    Set fsoDateihandling = New FileSystemObject

    fsoDateihandling.CreateTextFile (strDateiname)

    Set fsoDateihandling = Nothing

End Sub


Public Sub Datei_loeschen(strDateiname as String)

    Set fsoDateihandling = New FileSystemObject

    fsoDateihandling.DeleteFile(strDateiname)

    Set fsoDateihandling = Nothing

End Sub


Public Function Datei_vorhanden(strDateiname as String)

Dim boolTemp As Boolean

    boolTemp = false

    Set fsoDateihandling = New FileSystemObject

    boolTemp = fsoDateihandling.FileExists(strDateiname)

    Set fsoDateihandling = Nothing

    Datei_vorhanden = boolTemp

End Function


Public Sub Eintrag_hinzufuegen(strEintrag As String, strDateiname as String)

    Set fsoDateihandling = New FileSystemObject

    Set tsInput = fsoDateihandling.OpenTextFile(strDateiname, ForAppending)

    tsInput.WriteLine strEintrag & vbNewLine

    Set tsEingabe = Nothing

    Set fsoDateihandling = Nothing

End Sub

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Hi,

nun ist es soweit, das Programm wurde geliefert. Scheinbar unterscheidet es sich schon von VB 6, welches ich auch nur flüchtig kenne.

Zitat LoneGunman:

WICHTIG: Microsoft ActiveX Data Objects Recordset 2.6 Library und Microsoft ActiveX Data Objects 2.6 Library unter "Projekt"->"Verweise" hinzufügen.

Ich habe unter Projekt nirgends die Möglichkeit gesehen, irgendwo Verweise einzutragen.

Ich wollte Deinen Code aus dem ersten Beispiel ( modDatenbank.bas ) in das neue Projekt, das ich angelegt habe kopieren. Als ich F5 gedrück hab, bekam ich folgende Fehler:

Visual Studio kann debuggen nicht starten, da exe nicht vorhanden ist.

Erstellen Sie das Projekt und wiederholen Sie den Vorgang.

Was hab ich da falsch gemacht. Liegt es daran, dass ich die Verweise nicht eingetragen habe?

Wäre es in meinem Fall nicht besser eine Konsolenanwendung zu programmieren? Eine Oberfläche benötige ich nicht.

Das Tool soll nur die Verbindung zur Datenbank herstellen und dort dann die Daten von der Datenbank abziehen. Wenn es fertig ist soll es in der Jobverwaltung von Windows automatisch jeden Tag um 6:00 gestartet werden.

Danke und MfG

korea1

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

die Verweise hab ich jetzt gefunden und eingefügt.

Und ich hab angefangen das ganze in ner Konsole zu entwickeln.

Wenn ich jetzt Dein Script(modDatenbank.bas ) laufen lasse, bekomme ich folgende Fehlermeldungen von der Variablendeklaration:

Der Typ "Command" ist nicht definiert.

Der Typ "Recordset ist nicht definiert.

Wo liegt hier das Problem?

Hat der Code bei Dir funktioniert?

Danke und MfG

korea1

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...