Hallo Peter,
Post by Peter FleischerPost by Elmar BoyePost by Peter FleischerAus meiner persönlichen Erfahrung funktioniert stabil mit der
Jet und der schema.ini nur die Variante mit der Semikolontrennung.
Dafür brauchst Du die gar nicht, solange Dir die Feldnamen
egal und die Datentypen Jet geraten reichen, da reicht die
gezeigt SQL Variante.
Format=Tabdelimited
dann habe ich Probleme eine Datei mit Endung CSV sauber einzulesen.
D. h. es immer zuerst definiere CSV.
Denn für Excel z. B. bedeutet CSV Komma/Listentrennzeichenseparaiert,
d. h. auf deutschem System mit ";" (entsprechend Ländereinstellungen).
Tabdelimited bedeutet Tabulator, und wäre bei Excel das sog.
Text (Tabstop getrennt) Format.
Post by Peter FleischerPost by Elmar BoyePost by Peter FleischerDas beginnt schon mit den Dateiendungen, die in früheren Versionen
der Jet frei wählbar waren, mit der Jet 40 aber recht begrenzt sind.
Lässt sich via Registry ändern - wobei eine Datei umbenennen
einfacher ist.
Auch das habe ich mit recht zweifelhaften Erfolg probiert.
Einigermaßen venüftige Ergebnisse habe ich ohne Änderungen mit der
Endung TXT und CSV erhalte, wobei bei CSV andere Trennzeichen als
Semikolon wieder Probleme bringen, auch wenn die Datei zur schema.ini
passen.
Für alles was Du nicht definierst gelten die Standardannahmen
und was in der Registry unter
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text
steht - bzw. dem im ConnectionString angegebenen Registry Pfad.
Dort findet sich auch DisabledExtensions, das die zulässigen
Dateiendungen festlegt.
Post by Peter FleischerPost by Elmar BoyePost by Peter FleischerDas geht dann weiter mit Formatierungen der Strings in der Datei,
wenn andere Formate als String im Ziel benötigt werden und ein
Typkonvertierung erfordern.
Lässt sich anpassen... siehe Beschreibung in der JETSQL40.CHM
(bei Office 200x).
Hast du das mal mit Datumsdarstellungen probiert?
Sagen wir mal so: Ich hatte mal das zweifelhafte Vergnügen
(kein .Net sondern Office) die Texttreiber auf Datenquellen
verschiedenen Typs anzusetzen. Am "beliebtesten" waren da
bei mir solche die auf Excel-Daten basierten.
Eingesetzt habe ich da am Schluss ein (VBA)Modul, dass die
SCHEMA.INI anhand von Tabellenspezifikationen erzeugte.
Naja, und irgendein Trödel kriegte immer mal wieder einen
Fehler eingebaut, that's life ;-)
Als auch mal Access Spezi empfehle ich da, sich zunächst
den Konvertierungsassitenten von Access anzugucken.
Die Schema.ini am Ende bildet das inhaltlich ab.
Für Datumsformate gelten die Regeln von VB(A).Format.
Post by Peter FleischerPost by Elmar BoyeAm Ende: Ein eigengeschriebener Treiber, der nur die Möglichkeiten
des Jet Text-Treibers bieten soll, kostet zumindest einige Tage
an Programmierung...
Peter Tübben wollte aber die Jet als eierlegende Wollmilchsau
nutzen:-)
Ich habe noch nie eine Wollmilchsau gesehen ;-)
Allerdings halte ich den Texttreiber von Jet schon gut nutzbar.
Vor allem verglichen mit dem was so im .NET Umfeld so rumkreist
Viele mögen nur ihre nationalen Trennzeichen und Dezimaltrennzeichen,
Datumsformate, beim Anführungszeichen im Text kriegen sie fast
alle das Schwimmen. (Galt zumindestens Ende letzten/Anfang diesen
Jahres als ich mal einen gesucht hatte).
Unten mal ein Beispiel für ADODB/ADONET mit Schema.ini und leicht
skurilen Testdaten. Dort ist das Datumsformat bewusst in englisch,
da hier doch meist deutsch Standard und ich die Standards überschreiben
wollte.
Der VB.NET Code ist zwar nicht dolle, da er aus einem VB-Beispiel
stammt und gerade schnell auf VB.NET portiert wurde.
Aber zum Experimentieren sollte es reichen.
Gruss
Elmar
--
Zunächst die SCHEMA.INI:
///
[CSVTest.txt]
ColNameHeader=True
Format=Delimited(;)
CharacterSet=1252
DateTimeFormat=mm\/dd\/yyyy hh\:nn\:ss
DecimalSymbol=,
NumberDigits=2
TextDelimeter="
CurrencySymbol=€
CurrencyDecimalSymbol=,
CurrencyThousandSymbol=.
CurrencyPosFormat=3
CurrencyNegFormat=8
\\\
Die CSVTest.TXT als Input
///
"ID";"TextSpalte";"DatumSpalte";"DoubleSpalte";"CurrencySpalte"
1;"ABC";01/01/2005;1,23;1,23 €
2;"ABC""DEF";12/30/2005;4711,12;4.711,12 €
3;"äöüÄöü;.,""";12/30/1899 14:30:45;-4711,67;-4.711,67 €
\\\
///
Private Sub ReadCSVTextADONet()
' Beispiel zum Lesen einer Text-Datenbank via JET Text-ISAM
Dim jetConnection As ADODB.Connection
Dim textRecordset As ADODB.Recordset
Dim field As ADODB.Field
jetConnection = New ADODB.Connection
With jetConnection
.Provider = "Microsoft.Jet.OLEDB.4.0"
' Weiteres i. a. in der SCHEMA.INI des Verzeichnisses
' siehe auch Online Hilfe zu Text-Treiber
.Properties("Extended Properties").Value = "Text;"
' Erwartet hier ein Verzeichnis
.Properties("Data Source").Value = "F:\Eigene Dateien"
.Open()
End With
textRecordset = New ADODB.Recordset
' Name der Datei = Tabelle
textRecordset.Open("CSVTest.txt", jetConnection, _
ADODB.CursorTypeEnum.adOpenForwardOnly, _
ADODB.LockTypeEnum.adLockReadOnly, _
ADODB.CommandTypeEnum.adCmdTable)
For Each field In textRecordset.Fields
Console.Write("{0}{1}", field.Name, vbTab)
Next field
Console.WriteLine()
Do While Not textRecordset.EOF
For Each field In textRecordset.Fields
Console.Write("{0}{1}", field.Value, vbTab)
Next field
Console.WriteLine()
textRecordset.MoveNext()
Loop
textRecordset.Close()
jetConnection.Close()
End Sub
\\\
///
Private Sub ReadCSVTextNet()
' Beispiel zum Lesen via Jet DataAdapter
Dim jetConnection As OleDb.OleDbConnection
Dim textCommand As OleDb.OleDbCommand
Dim dataReader As OleDb.OleDbDataReader
jetConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Extended Properties='Text;';" & _
"Data Source='F:\Eigene Dateien';")
jetConnection.Open()
textCommand = New OleDbCommand("CSVTest.txt", jetConnection)
textCommand.CommandType = CommandType.TableDirect
dataReader = textCommand.ExecuteReader
If dataReader.HasRows Then
For fieldIndex As Integer = 0 To dataReader.FieldCount - 1
Console.Write("{0}{1}", dataReader.GetName(fieldIndex), vbTab)
Next fieldIndex
Console.WriteLine()
End If
Do While dataReader.Read()
For fieldIndex As Integer = 0 To dataReader.FieldCount - 1
Console.Write("{0}{1}", dataReader.GetValue(fieldIndex), vbTab)
Next fieldIndex
Console.WriteLine()
Loop
dataReader.Close()
jetConnection.Close()
End Sub
\\\