Datenbankname in SELECT-Befehl zu lang?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von floxnet.

    Datenbankname in SELECT-Befehl zu lang?

    Hallo Ihr,

    ich brauche mal Euren Beistand, weil ich partout nicht mehr weiter komme.

    In VBA hatte ich eine Routine geschrieben, die durch bestimmte Pfade durchgeht und nacheinander alle *dbf Dateien öffnet, die dort liegen.
    In VBA funktioniert das supi.

    Und weil das gut funktioniert habe ich mich daran gemacht dass endlich mal auf VB.Net zu portieren.

    Nur das öffnen der Datenbanken macht mir echte Schwierigkeiten. Ich konnte schon herausfinden das es daran liegt, weil die Benamungen der dbf Dateien zu lang sind.

    Jetzt habe ich versucht die entsprechend der 8+3 Konventionen zu kürzen aber leider funktioniert das ebenfalls nicht. Ich vermute das Datenbankbezeichnungen wirklich ausgeschrieben werden müssen und nicht gekürzt werden dürfen - weiss das aber nicht genau.
    (Datenbankname war dann XYZ123~1.dbf)

    Beim Debuggen erhalte ich die Fehlermeldung "The microsoft office Access database engine could not find the object "xyz123123.dbf" Make sure the object exists and that you spell the path name correctly".


    Hier mal der entsprechende Sourceteil:

    VB.NET-Quellcode

    1. Dim output As String
    2. Dim adoConnection As Object
    3. adoCnnection = CreateObject("ADODB.Connection")
    4. Dim adoRecordset As Object
    5. adoRecordset = CreateObject("ADODB.Recordset")
    6. Dim strSQL As String
    7. Try
    8. With adoConnection
    9. .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;;Data Source=C:\1\;Extended Properties = dBase IV"
    10. .Open()
    11. .strSQL = "SELECT COUNT(VAL) FROM 123XYZXYZ.dbf"
    12. adoRecordset.Open(strSQL, adoConnection)
    13. output = adoRecordset.GetString
    14. .Close()
    15. End With
    16. Catch ex As Exception
    17. ...
    18. End Try



    Interessant:
    Der gleiche Sourcecode funktioniert in VBA wunderbar.

    Es tut mir leid, falls diese Frage schon irgendwo gestellt worden ist. Ich habe wirklich 3h in verschiedenen Foren gesucht und verschiedene Möglichkeiten probiert - aber leider alles ohne Erfolg, was mich wirklich ratlos macht.

    Danke schon jetzt an denjenigen, der sich die Mühe macht mir zu helfen.

    PS.
    Leider kann das Datenbankformat nicht geändert werden. (falls die Frage auftreten sollte)

    Viele Grüße,
    Flo
    Ich kenne mich in keiner Weise mit dBase aus und bin in VB.NET, zumindest was Datenbanken angeht, auch noch totaler Neuling. Aber mir kommt es sehr seltsam vor, dass der Datenbankname, also die Datei, nicht im Connectionstring ist. Sicher, dass die da nicht reingehört?

    Und in eine SELECT-Anweisung kommt normalerweise der Tabellenname rein, nicht der Datenbankname (und schon gar nicht der Dateiname).

    Oder machst du das in VBA exakt so?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hallo und danke erstmal für Eure Antworten.

    Ah, ne. Mir ist beim kopieren ein Fehler unterlaufen. Ich brauche das für die Arbeit, da kann ich ja schlecht die komplette Select-Anweisungen öffentlich abschicken, in welcher Arbeitsdaten abgefragt werden.

    Das originäre Select ist schon okay und lautet in etwa so:

    "SELECT COUNT(VAL) FROM xyz.dbf WHERE S = irgendeinwert"

    Es geht tatsächlich nur darum, dass der Datenbankname zu lang ist (mehr als 8 Zeichen)

    @Marcus:
    Bei dBase-Dateien ist das so schon richtig. Schau mal in den Connect. Dort ist der Pfad zur .dbf angegeben während im Select selbst die Datenbank genannt wird, auf welche dann der Select ausgeführt wird.

    Hab Dir hier mal was rausgesucht:
    dbf-software.com/sql-dbf.html

    Oder hier:
    (ist zwar C# und ein völlig anderes Thema)

    C#-Quellcode

    1. OdbcCommand cmd = new OdbcCommand();
    2. OdbcDataAdapter da = new OdbcDataAdapter();
    3. DataTable dt = new DataTable();
    4. using (OdbcConnection connection = new OdbcConnection(connstring))
    5. {
    6. connection.Open();
    7. cmd = new OdbcCommand(@"SELECT * FROM D:\DBFreader\file.dbf where [RDATE] between 2/16/2006 12:00:00 AM and 2/20/2006 12:00:00 AM", connection);
    8. cmd.CommandType = CommandType.Text;
    9. da.SelectCommand = cmd;
    10. da.Fill(dt);
    11. }


    Eventuell habe ich mich im Frust bei meiner Fragestellung idiotisch ausgedrückt - Sorry, das ist echt unabsichtlich passiert... aber das kennt der ein oder andere vielleicht von sich, wenn man mehrere Stunden an einem trivial erscheinenden Problem sitzt und nicht nennenswert voran kommt. :/

    Das Problem ist, wie gesagt, nicht der Connect oder der Select-Befehl, sondern das beim benennen der Datenbank eine Zeichenbegrenzung auf 8 Zeichen vorliegt - an der ich nicht vorbei komme. Auch das reduzieren auf 8+3 Zeichen (xyz123~1.dbf) funktioniert nicht. Und das Problem besteht echt nur in VB.Net und nicht in VBA - was ich nicht nachvollziehen kann.

    Bitte verwechselt das Reduzieren des Datenbanknamens nicht mit dem umschreiben auf 8 Zeichen. Würde die Datenbank XYZ12345.dbf lauten, dann wäre alles fein, weil der DB-Name nur 8 Zeichen hat (ohne Typ). Die Reduzierung wirft dann die Shortpaths aus die wir aus MS-DOS kennen - was aber blöderweise nicht funktioniert :/ (zumindest nicht bei mir)

    Und zu allem Übel können die Datenbankbezeichnungen nicht umgeschrieben werden, weil die genau so benötigt werden^^


    @Friedel:

    SQL-Abfrage

    1. SELECT Count (*) AS AnzahlFROM Tabellenname


    Damit zählst du allerdings die Anzahl an Datensätze innerhalb der Tabelle.
    Wenn du nur bestimmte Werte gezählt haben willst, dann ist z.B. sowas richtig.

    SQL-Abfrage

    1. SELECT COUNT( DATE_FORMAT( `customers_date_added` , '%m.%Y' ) ) AS "Registrationsmenge", DATE_FORMAT( `customers_date_added` , '%m.%Y' ) AS Registrationsdatum
    2. FROM `customers`
    3. WHERE 1
    4. GROUP BY DATE_FORMAT( `customers_date_added` , '%m.%Y' )
    5. ORDER BY DATE_FORMAT( `customers_date_added` , '%m.%Y' ) ASC
    6. LIMIT 0 , 3992


    In einem XT:C-Shop würde das zB die Kunden-Registration der letzten Jahre, sortiert nach Anmeldedatum und begrenzt auf 3992 Treffer, auflisten.

    Mein Problem betrifft aber leider nicht PHP / MySQL sondern VB.Net mit .dbf :/

    Ich wälze jetzt nochmal mein Buch, in der Hoffnung eine Idee zu bekommen. :(

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „floxnet“ ()

    @Erfinder des Rades

    das könnte natürlich echt sein und habe ich, glaube ich, noch nicht ausprobiert.

    Ich habe dummerweise hier Zuhause keinen Zugang zum TFS und kann das jetzt nicht testen.
    Aber ich notiere mir das und werde es morgen versuchen.

    Danke erstmal für den Hinweis! :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „floxnet“ ()

    dein String ist falsch
    hinter OLEDB.12.0 ist ein semicolon zuviel, und hinter IV fehlt ein semicolon

    Try
    With adoConnection
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;;Data Source=C:\1\;Extended Properties = dBase IV"


    versuche es so

    VB.NET-Quellcode

    1. "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\1\;Extended Properties=dBase IV;"





    ausserdem schreibts du.....
    Und weil das gut funktioniert habe ich mich daran gemacht dass endlich mal auf VB.Net zu portieren.


    dann solltest du zumindest eine Access Datanbank verwenden statt DBase-Files
    du kannst die DBase-Files doch einfach in Access importieren


    oder gibt es einen bestimmten Grund das du DBase verwenden musst ?

    zum Importieren...

    VB.NET-Quellcode

    1. sSQL = "Select * Into [" & sTable & "] " & _
    2. "From [" & sFile & "] In '' " & _
    3. "[dBase IV;DATABASE=" & sPath & ";Characterset=Ascii;]"

    Neu

    Hallo,

    tut mir leid das ich jetzt längere Zeit abwesend gewesen bin, hatte tagsüber keine Zeit und abends dann nicht wirklich Lust noch irgendwas am Rechner zu tun.

    Letzten Freitag habe ich herausgefunden was der Fehler gewesen ist.
    Wie Kasi richtig schreibt, ohne es zu explizit zu erwähnen, muss der Datenbankname von Eckklammern eingeschlossen sein wenn er auf 8+3-Zeichenlänge gekürzt wurde.
    Ich habe, wegen meiner Erfahrungen in MySQL Hochkommatas genutzt - wobei es da auch keine Probleme mit der DB-Namenslänge gibt (bei MySQL).
    Naja... ist eine Erfahrung mehr.

    Theoretisch würde das nun auch funktionieren. Praktisch scheint es noch Probleme mit dem Pfad zu geben, weil das ganze über das Netzwerk abgefragt wird (je .dbf eben). Lokal funktioniert es.
    Daran arbeite ich dann, wenn ich in der Arbeit wieder mehr Luft habe.

    @Kasi,
    ja. Der Grund warum dBase verwendet wird, obwohl das von MS als "deprecated" deklariert wird, ist dass es sich hierbei um einen Firmenstandard handelt der über viele Jahre erwachsen ist.
    Ich persönlich würde auch viel lieber MySQL / MSSQL nutzen. Dazu müsste man aber erstmal mehrere hundert Projekte umschreiben.

    Mei... ist halt so, muss ich mit leben. Lokal funktioniert das zumindest schonmal - ist ein echter Lichtblick