SQL Server Compact Codebeispiel

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von djanna.

    SQL Server Compact Codebeispiel

    Ich wollte eine Software Verwaltung programmieren, mit deren Hilfe ich die Programme von meinen diversen Heft-CDs verwalten kann. Dies wollte ich über Visual Basic .NET und SQL Server Compact realisieren, damit ich nicht extra noch Programme installieren muß. (auch falls ich das Programm mal weitergeben will)Ich besitzte kein Access! Benutze Open Office.


    Ich schreib mal auf, was ich bs jetzt gemacht habe:

    - neues Projekt -> Windows Forms-Anwendung
    - Datenquellen -> neue Datenquelle hinzufügen -> Datenbank -> neue Verbindung
    Datenquelle = Microsoft SQL Server Compact (.NET Framework-Datenanbieter)

    Datenbank -> erstellen -> Pfad oben .../base.sdf -> kein Kennwort -> Testverbindung
    erfolgreich -> OK

    - Verbindungszeichenfolge -> Ja, Verbindung speichern Name = baseConnectionString
    - Fertig stellen für leeres DataSet -> DataSet-Name = baseDataSet

    - jetzt im Projekt-Explorer base.sdf doppelt ankgeklickt
    - es öffnet sich der Datenbank-Explorer -> hier auf Tabelle rechte Maustatse -> Tabelle
    erstellen

    - Tabellenname = tabelle, folgende Spalten angelegt:
    Nr -> Primärschlüssel
    Name
    Kategorie (soll ein Auswahlfeld werden)
    Beschreibung
    CD/DVD

    - dann habe ich eine Form erstellt (siehe Anhang)

    Jetzt will ich die Daten eingeben und wenn ich OK klicke,
    sollen die Daten in die jeweiligen Spalten geschrieben werden.

    Dazu muß ich doch erst die Datenbank verbinden, öffnen, Daten schreiben und wieder schließen. Doch ich konnte nirgends ein Beispiel (Quelltext !) finden wie das geht.

    Ich habe auch schon in zich Foren gefragt, aber entweder nimmt keiner den SQL SC oder
    keiner will mir helfen. (Ist ja vielleicht zu simpel)
    Bilder
    • Form1.jpg

      12,64 kB, 318×322, 638 mal angesehen
    Hi!

    Ich glaub hier im Board hat noch keiner mit MS Sql Compact gearbeitet. Ich vermute, dass man genauso wie auf jeden andere Datenbank zugreift (ADO.net, siehe z.B. Galileo Open Book), jedoch sieht der Connection String anders aus. Den hast du ja, wenn ich das richtig gelesen hab. Kannst du das mal versuchen?
    Vielleicht hätte ich erwähnen sollen,
    das ich totaler Anfänger bin was Programmierung betrifft.

    Und erst Recht Datenbank mit Visual Basic .NET.

    Soll heißen, ich bin für alle Informationen dankbar
    und saug sie auf wie ein Schwamm.
    Hi!

    galileocomputing.de/openbook/visual_basic/ <-- das ist das galileo open book 2005
    Da steht irgendwo was über Datenbankprogrammierung (mit ADO.net) drin. Ich vermute, dass du die Code-Beispiele dort beinahe 1:1 übernehmen kannst, solange der Connection String für deine Compact-Datenbank abgerichtet ist.

    Ich muss aber ganz ehrlich dazu sagen, dass ich mich mit dem Thema `Datenbanken´ in VB.net noch nie sonderlich beschäftigt hab.
    Also ich habs mal mit Hilfe des Buches versucht.
    Siehe Quelltext:

    VB.NET-Quellcode

    1. Dim verbindung As New System.Data.SqlServerCe.SqlCeConnection
    2. Dim anweisung As New SqlCeCommand
    3. verbindung = New SqlCeConnection("Data Source=dbase.sdf")
    4. Try
    5. verbindung.Open()
    6. anweisung.CommandText = "INSERT INTO tabelle (nr,kategorie,beschreibung,titel,ort) Values('3','test name','test ort','test text','beschreibung test')"
    7. anweisung.ExecuteNonQuery()
    8. Finally
    9. End Try
    10. verbindung.Close()


    Das funktioniert nicht.

    Der Versuch der Anzahl der Datensätze (auch aus dem Buch)
    funktioniert allerdings:

    VB.NET-Quellcode

    1. verbindung = New SqlCeConnection("Data Source=dbase.sdf")
    2. verbindung.Open()
    3. Dim strSQL As String = "SELECT COUNT(*) FROM tabelle"
    4. Dim cmd As SqlCeCommand = New SqlCeCommand(strSQL, verbindung)
    5. Dim anzahlDS As Integer = cmd.ExecuteScalar()
    6. MsgBox(anzahlDS)

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

    Damit du Fehlermeldungen siehst, musst du das Try und Catch auskommentieren.

    Ich glaub ichs ehe den Fehler, du hast beim Command nirgens eine Connection angegeben.
    So müsste es funktionieren (hoffe ich):

    VB.NET-Quellcode

    1. Dim verbindung As System.Data.SqlServerCe.SqlCeConnection ' kein new, die Instanziierung (new) erfolgt ja weiter unten
    2. Dim cmd As SqlCeCommand ' gleiches gilt hier, ich hab mir mal erlaubt 'anweisung' umzubenennen
    3. Dim sql as String
    4. verbindung = New SqlCeConnection("Data Source=dbase.sdf")
    5. Try
    6. verbindung.Open()
    7. sql = "INSERT INTO tabelle (nr,kategorie,beschreibung,titel,ort) Values('3','test name','test ort','test text','beschreibung test')"
    8. cmd = New SqlCeCommand(sql, verbindung) ' sql-string und verbindung beim new Command gleich übergeben.
    9. cmd.ExecuteNonQuery()
    10. Finally
    11. End Try
    12. verbindung.Close()


    alternativ kannst du auch cmd = New SQLCeCommand ohne Parameter ausführen und dann .Connection und .CommandText in 2 getrennten Zeilen schreiben.

    Das ganze noch eine Spur verkürzt (Deklarationen nach untern verschoben) sieht dann so aus:

    VB.NET-Quellcode

    1. Dim verbindung As System.Data.SqlServerCe.SqlCeConnection _
    2. = New SqlCeConnection("Data Source=dbase.sdf")
    3. Try
    4. verbindung.Open()
    5. Dim sql as String = "INSERT INTO tabelle (nr,kategorie,beschreibung,titel,ort) Values('3','test name','test ort','test text','beschreibung test')"
    6. Dim cmd As SqlCeCommand = New SqlCeCommand(sql, verbindung)
    7. cmd.ExecuteNonQuery()
    8. verbindung.Close() ' das Close in den Try-Block zu schreiben ist nie falsch
    9. Catch ex as Exception
    10. ' Du solltest übrigens in einem Try-Block ein Catch machen und ein Fehlermeldung ausgeben
    11. ' und/oder irgendwo hin als "Error Log" schreiben.
    12. End Try
    Danke für den Quellcode, aber es funktioniert nicht.

    Ich hab mal das Try und Catch rausgenommen und siehe da, folgender Fehler:

    cmd.ExecuteNonQuery() -> Fehler beim Analysieren der Abfrage.
    [ Token line number = 1,Token line offset = 56,Token in error = / ]

    Das SQL Command ist doch so aufgebaut:

    Sql = "INSERT INTO Tabellenname (Spalte1,Spalte2, ..., Spalte n) Values('Wert für Spalte1','Wert für Spalte2',' ...','Wert für Spalte n)"
    Hi,

    ich hab's rausgefunden.

    Es hing wohl irgendwie mit den Spaltennamen zusammen.
    Ich hab ne neue Tabelle erstellt und jetzt funktioniert es.

    Mal sehen ob ich den Rest auch noch hinbekomme.

    Ansonsten weiß ich ja, an wen ich mich wenden kann :D
    Moin,

    ja, der Thread ist schon steinalt.

    Aber ich habe trotzdem eine Frage zu dem Thema. Ich habe nun angefangen mich mit VB für Windows mobile zu beschäftigen.
    Flufft auch ganz gut, da im grunde genommen dieselbe Programmierung wie für MS Access.
    Aber nun will ich auf eine DB zugreifen und weis zum einen nicht, wie ich das Ding auf das Mobile System bekomme, bzw gibt es eine möglichkeit abzufragen, ob ne DB existiert, oder nicht?

    und zum zweiten bekomme ich immer einen interrupt bei folgendem Code, vielleicht sieht ja einer von Euch profis, was ich da falsch gemacht habe.

    VB.NET-Quellcode

    1. Private Sub btn_save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_save.Click
    2. Dim wann As Date
    3. Dim sys As Integer
    4. Dim dia As Integer
    5. Dim pulsier As Integer
    6. Const path As String = "C:\Users\USERKUERZEL\Documents\Visual Studio 2008\Projects\SmartDeviceProject1\SmartDeviceProject1\Blutdruck.sdf"
    7. Dim abfrage As String
    8. Const pwd As String = ""
    9. Dim verbindung As System.Data.SqlServerCe.SqlCeConnection = New SqlCeConnection("Data Source=" & path & ";" & pwd)
    10. wann = CDate(Me.txt_date.Text)
    11. sys = CInt(Me.txt_systolisch.Text)
    12. dia = CInt(Me.txt_diastolisch.Text)
    13. pulsier = CInt(Me.txt_puls.Text)
    14. Try
    15. verbindung.Open()
    16. abfrage = "INSERT INTO t_main (when,systolisch,dias,puls) Values(" & wann & "," & sys & "," & dia & "," & pulsier & ")"
    17. Dim cmd As SqlCeCommand = New SqlCeCommand(abfrage, verbindung)
    18. cmd.ExecuteNonQuery()
    19. verbindung.Close()
    20. Catch ex As Exception
    21. End Try
    22. Close()
    23. End Sub

    Ich danke Euch schonmal im Vorraus für etwaige hilfe.

    Gruss Djanna

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „djanna“ ()

    Ich glaub das hat sich grad erledigt, wenn das klappt, danmn poste ich meine lösung

    EDIT:
    Hier wird, wenn keine ceDB vorhanden ist eine neue erstellt und auch der Table creiert.

    VB.NET-Quellcode

    1. Imports System.Data
    2. Imports System.Data.SqlServerCe
    3. Public Class Form1
    4. Private Sub creating()
    5. Dim engine As SqlCeEngine
    6. Dim conn As SqlCeConnection
    7. Dim cmd As SqlCeCommand
    8. If System.IO.File.Exists("Blutdruck.sdf") = False Then
    9. engine = New SqlCeEngine("Data Source = Blutdruck.sdf")
    10. engine.CreateDatabase()
    11. conn = New SqlCeConnection("Data Source = Blutdruck.sdf")
    12. conn.Open()
    13. cmd = conn.CreateCommand()
    14. cmd.CommandText = "CREATE TABLE t_main(heutedatum DateTime, systolisch int, dias int, puls int)"
    15. cmd.ExecuteNonQuery()
    16. End If