generelle Frage: SQL oder nicht

  • VB6

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von picoflop.

    generelle Frage: SQL oder nicht

    Hallo,

    ich bin gerade dabei ein kleines Programm zu basteln welches mit eine txt datei auswertet. Diese hat um die 200.000 Zeilen.

    Als erstes hab ich diese in ein mehrdimensionales Array eingelesen und mich gewundert dass der speicher noch nicht voll ist ^^
    Das Problem dabei war allerdings, dass diese Array schlecht zu verwalten ist.

    Deshalb habe ich mir gedacht ich nehm ne lokale .mdb und schiebe die Daten da rein. Dann kann ich mit SELECT ... FROM ... WHERE schon meine Daten aufbereiten. Diese Variante dauert aber länger beim einlesen. Das ist der erste Punkt.

    Der zweite Punkt ist, dass ich eine SELECT abfrage keinem Recordset zuweisen kann.

    Hier mal ein CodeSchnipsel (Datenbank erstellen):

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public DB As Database
    3. Public DBCon As ADODB.Connection
    4. Public Table As TableDef
    5. Public Sub CreateDB(Path As String, header() As String, unit() As String)
    6. Dim fs As New FileSystemObject
    7. Dim i As Long
    8. Dim fld1 As DAO.Field
    9. ' Delete DB if exists
    10. If (fs.FileExists(Path)) Then
    11. fs.DeleteFile Path
    12. End If
    13. ' Create database
    14. Set DB = CreateDatabase(Path, dbLangGeneral)
    15. ' Create a table
    16. Set Table = DB.CreateTableDef("tbl_data")
    17. ' Add some fields to the table
    18. Set fld1 = Table.CreateField("id", dbLong)
    19. fld1.Attributes = fld1.Attributes + dbAutoIncrField
    20. Table.Fields.Append fld1
    21. For i = 0 To UBound(header) - 1
    22. Table.Fields.Append Table.CreateField(LCase(header(i)), dbText)
    23. Next i
    24. Table.Fields.Append Table.CreateField("_date", dbDate)
    25. ' Add the table to our database
    26. DB.TableDefs.Append Table
    27. ' Create a table
    28. Set Table = DB.CreateTableDef("tbl_unit")
    29. ' Add some fields to the table
    30. Set fld1 = Table.CreateField("id", dbLong)
    31. fld1.Attributes = fld1.Attributes + dbAutoIncrField
    32. Table.Fields.Append fld1
    33. For i = 0 To UBound(header)
    34. If LCase(header(i)) Like "date" Then
    35. Table.Fields.Append Table.CreateField("_date", dbText)
    36. Else
    37. Table.Fields.Append Table.CreateField(LCase(header(i)), dbText)
    38. End If
    39. Next i
    40. ' Add the table to our database
    41. DB.TableDefs.Append Table
    42. Set Table = Nothing
    43. Call fill_unit(header, unit)
    44. End Sub


    wenn ich jetzt irgendwo:

    Visual Basic-Quellcode

    1. DB.Execute(str_sql)


    aufrufe mit einem INSERT befehl dann funktioniert das.

    wenn ich allerding

    Visual Basic-Quellcode

    1. Dim rs as ADODB.Recordset
    2. Set rs = DB.Execute(str_sql)


    aufrufe kommt der Fehler "Function oder Variable erwartet" und ".Execute" ist markiert.

    Was mache ich falsch ... ich bin mir sicher ich habe das in einem anderen Programm so schonmal gemacht ...

    ist es überhaupt ratsam das Problem mit einer SQL DB anzugehen?

    Die daten werden nur für eine sitzung gebraucht und werden danach wieder gelöscht ... ich glaube dass ich da in VB6 aber keine andere wahl habe ...

    in VB.NET könnte ich mit einer Collation oder wie die teile heißen arbeiten oder ?


    Gruß
    Pascal

    _PASCAL_ schrieb:

    in VB.NET könnte ich mit einer Collation oder wie die teile heißen arbeiten oder ?

    Auf jeden Fall könntest du mit VB.Net mit LINQ arbeiten, so dass dein ursprünglicher Ansatz - komplett in Array einlesen - deutlich einfacher zu handeln ist. Wobei es natürlich Sinn machen würde, das ganze in Objekte einzulesen, die "Sinn" machen.

    Sei deine Textdatei von diesem Aufbau:
    Name;Vorname;Alter;Beruf

    Dann könntest du es einlesen in eine Klasse:
    Public Class Person
    Public Property Name as string
    Public Property Vorname as string
    Public Property Alter as integer
    Public Property Beruf as string
    end class

    einlesen:
    ' "globale" List: lstPerson as new list(of Person)
    for each line as string in ...ReadLines(path)
    dim a() as string = line.split(";"c)
    lstPerson.Add(new Person with {.Name=a(0),...,Alter=Integer.Parse(a(2)) usw)
    next

    Abfragen sind dann zb so:
    dim result1 = from p as person in lstPerson where p.Alter>18 andalso p.alter<65 select p
    dim result2 = from p as person in lstPerson where p.name.contains("berger") select p
    usw

    Im Zweifel sicherlich etwas sinnvoller als nur für Abfragen eine temporäre Datenbank/Tabelle zu erzeugen. Wie gesagt: .Net bring eine SQL ähnliche Abfragesprache für interne Objekte bereits mit: LINQ = Language Integrated Query
    Das hört sich sehr interessant an ...

    genau so habe ich mir das vorgestellt

    danke für den tipp jetzt muss ich hier erst noch ne lizenz bekommen ^^ und nen besser PC weil der aktuelle packt das nicht :D

    habe vorhin versehentlich das thema als gelöst markiert aber ist es jetzt auch
    hab mir VB2010 drauf gemacht ... ach gefällt mir das gut ... ^^

    läuft auch einigermaßen auf dem laptop hier


    ich hab allerdings ein Problem:

    ich kann nicht sauber eine Klasse programmieren, da ich erst nach dem öffnen der txt datei weis wieviele "private Strings" die Klasse haben müsste ... oder kann ich auch eine Klasse dynamisch machen iwie ... kanns mir grad nicht vorstellen

    Gruß
    vlt. solltestemal genauer erklären, was sache ist (sein soll).
    Mir scheint, du hast ein TextFile (oder mehrere?) mit vielen Zeilen, du weißt aber nicht wieviele. In jeder Zeile stehen viele Strings, du weißt aber nicht wieviele.
    Stehen in allen Zeilen gleichviele Strings? Das könnte einen ermutigen, hier von einer Tabelle zu sprechen.
    Bedeuten die Strings nur Text, oder auch Zahlen, Datumse, oder evtl. noch ganz was anneres?

    Oder überhaupt: was sollen die Strings bedeuten?

    Bitte jede Frage beantworten.