DB Auslesen mit VB?

Wo genau liegt denn dein Problem mit den Memofeldern ?
Die werden doch auch nicht anders ausgelesen wie andere
Felder.
In Verbindung mit VB ist ADO sicher die häufigste Zugriffs-
methode auf DB's.

Beim Zugriff auf die Datenfelder sollte aber mögliche NULL
Werte abgefangen werden und dann je nach Fieldtyp ein
Standard zurückgegeben werden.

Das könnte so aussehen.

Wie man das Recordset erzeugt wirst du ja wissen denke ich.

Code:
Dim strFeld   as String

strFeld = GetDBValue(Recordset.Fields(Memofeld))

Public Function GetDBValue(F As ADODB.Field) As Variant
                     
       If IsNull(F) Then
            Select Case F.Type
                   Case adBoolean
                        GetDBValue = 0
                   Case adChar
                        GetDBValue = " "
                   Case adCurrency
                        GetDBValue = 0
                   Case adDate
                        GetDBValue = "01.01.1990 00:00:00"
                   Case adDBTime
                        GetDBValue = "01.01.1990 00:00:00"
                   Case adDBDate
                        GetDBValue = "01.01.1990 00:00:00"
                   Case adDecimal
                        GetDBValue = 0
                   Case adInteger
                        GetDBValue = 0
                   Case adDouble
                        GetDBValue = 0
                   Case adLongVarChar
                        GetDBValue = " "
                   Case adLongVarWChar
                        GetDBValue = " "
                   Case adSingle
                        GetDBValue = 0
                   Case adVarChar
                        GetDBValue = " "
                   Case adVarWChar
                        GetDBValue = " "
                   Case adVarWChar
                        GetDBValue = " "
                   Case adWChar
                        GetDBValue = " "
                       
           End Select
            
End Function
 
Mit benutzung deines Codes sieht mein Programm wie folgt aus. (Ach ja irgendwo fehlte ein end if ... habe mir deine Function noch mal etwas angesehen ...)

.....

REM Erzeugen des Recordset
Dim FOX_Conn, FOX_RS
Set FOX_Conn = CreateObject("ADODB.Connection")
Set FOX_RS = CreateObject("ADODB.Recordset")
FOX_Conn.Provider = "MSDASQL"
FOX_Conn.Mode = adModeRead
FOX_Conn.Open "Driver={Microsoft Visual FoxPro Driver}; SourceDB=G:\AMS32DB\datendb;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=MACHINE;Null=Yes;Deleted=Yes;"

REM Auslesen aller Daten aus der DB (hier noch ne kleine DB so das es machbar ist)
FOX_RS.Open "Select * from anmerk", FOX_Conn, adOpenKeyset, adLockReadOnly

REM für alle Elemente wird algorithmus angewandt
Do Until FOX_RS.EOF
FOX_RS.MoveFirst
MsgBox FOX_RS.Fields(5)
strFeld = GetDBValue(FOX_RS.Fields(5)) ' Feld 5 ist das Memofeld !
MsgBox strFeld
FOX_RS.MoveNext
Loop
......

Public Function GetDBValue(F As ADODB.Field) As Variant

If IsNull(F) Then
Else
Select Case F.Type
Case adBoolean
GetDBValue = 0
Case adChar
GetDBValue = " "
Case adCurrency
GetDBValue = 0
Case adDate
GetDBValue = "01.01.1990 00:00:00"
Case adDBTime
GetDBValue = "01.01.1990 00:00:00"
Case adDBDate
GetDBValue = "01.01.1990 00:00:00"
Case adDecimal
GetDBValue = 0
Case adInteger
GetDBValue = 0
Case adDouble
GetDBValue = 0
Case adLongVarChar
GetDBValue = " "
Case adLongVarWChar
GetDBValue = " "
Case adSingle
GetDBValue = 0
Case adVarChar
GetDBValue = " "
Case adVarWChar
GetDBValue = " "
Case adVarWChar
GetDBValue = " "
Case adWChar
GetDBValue = " "

End Select
End If

End Function



-------------------

Auch mit deiner Funktion ist die Rückgabe eine Leere Menge.

sulkifix
 
Heißt das

MsgBox FOX_RS.Fields(5) --> ist leer

MsgBox strFeld --> ist auch leer ?


Was müsste den drin stehen .

Hast irgendwo vorher die Anweisung
On Error resume next stehen ?

Du könntest mal versuchen strFeld als
Variant zu deklarieren. Allerdings wenn
MsgBox FOX_RS.Fields(5).Value schon leer
ist bringt das sicher nix.
 
Hi,

das Feld ist GAAANZ Sicher nicht leer ! Ich bekomme ja wenn ich sage:
MsgBox FOX_RS.Fields(5)
die Ausgabe:
"4?"
oder so ähnlich. (naja es sind fast aussschlisslich Fragezeichen mit gelegentlich anderen symbolen dazwischen.)

Naja mit CDBF kann ich die Memofelder lesen. Und sie haben einen sinnvollen Inhalt.
 
Übrigens , ich würde den Code zum herstellen der Verbindung
lieber so schreiben:

Code:
Dim FOX_Conn as ADODB.Connection
Dim FOX_RS     as ADODB.Recordset

Set FOX_Conn = new ADODB.Connection
Set FOX_RS = new ADODB.Recordset

With FOX_Conn
        .Provider = "MSDASQL"
        .Mode = adModeRead
        .Open "Driver={Microsoft Visual FoxPro Driver};  SourceDB=G:\AMS32DB\datendb;SourceType=DBF;  Exclusive=No;BackgroundFetch=Yes;Collate=MACHINE;Null=Yes

End With

With FOX_RS
       . Activeconnection = FOX_Conn
       .Cursortype = adOpenKeyset
       .LockType = adLockReadOnly
       .Source "Select * from anmerk"
       .Open
End With

Mir ist noch was aufgefallen.
Warum benutzt du als Cursortype adOpenKeyset
Damit werden keine ganzen Datensätze sondern nur
Keys geladen !

Versuche es mit adOpenStatic.
 
Hi,

naja ich finde with construkte einfach blöd ... (warscheinlich leigt es daran das ich noch nicht so lange VB benutze ... )



adOpenStatic. hilft auch nicht weiter :(
 
Hi,

ich habe noch was gefunden. F.Type ist in meinem Fall 205 was auf immer dem entstpricht.
Ich weiss es nicht. Weisst du wie ich das herrausfinden kann ?

Sulkifix
 
Es geht auch nicht um das With sondern
eher um early Binding.
Dadurch wird dir schon beim schreiben des
Codes die Eigenschaften, Methoden von
FOX_Conn usw. angezeigt.
Das Debuggen wird so auch leichter.


205
adLongVarBinary
Zeigt einen Binärwert vom Datentyp Long (nur Parameter-Objekt) an.

Ein Text MEMO Feld müsste eigentlich
adLongVarWChar also 203 sein.
 
Du könntest versuchen den Feldtyp zu ändern.

FOX_Conn.execute("Alter Table deineTabelle Alter Column deinMemoFeld LONGTEXT")

In Access geht das so.
Ich weiß allerdings nicht wie der Datentyp in FOXPRO angegeben wird,
d.h. wenn es nicht funktioniert dann liegt es am LONGTEXT.
 

Neue Beiträge

Zurück