korea1 Geschrieben 3. Januar 2005 Geschrieben 3. Januar 2005 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 Zitieren
peer_g Geschrieben 3. Januar 2005 Geschrieben 3. Januar 2005 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 Zitieren
Gast Geschrieben 3. Januar 2005 Geschrieben 3. Januar 2005 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 Zitieren
korea1 Geschrieben 5. Januar 2005 Autor Geschrieben 5. Januar 2005 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 Zitieren
Gast Geschrieben 5. Januar 2005 Geschrieben 5. Januar 2005 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 Zitieren
korea1 Geschrieben 19. Januar 2005 Autor Geschrieben 19. Januar 2005 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 Zitieren
korea1 Geschrieben 19. Januar 2005 Autor Geschrieben 19. Januar 2005 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 Zitieren
Empfohlene Beiträge
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.