Chlochou Geschrieben 16. Januar 2012 Geschrieben 16. Januar 2012 (bearbeitet) Guten Morgen zusammen! Ich verzweifle und hoffe das ihr mir helfen könnt Und zwar habe ich eine Windows Form in VB.NET (Visual Studio 2010) in die ich verschiedene Daten schreibe (Textbox, Checkbox und RichTextBox). Diese Daten sollten daraufhin in eine Access 2010 Datenbank geschrieben werden. Habe nun schon mehrere Befehle zum befüllen der Datenbank ausprobiert aber habe immer die gleichen Fehler, komme jedoch nicht auf die Lösung des Problems: Fehlermeldung: Invalid SQL statement; expected 'Delete', 'Insert', 'Procedure', 'Selet', or 'Update'. 1. Versuch: Dim conn As New OleDbConnection("Provider =" & "Microsoft.ACE.OLEDB.12.0;Data Source = P:\garantien.accdb") Dim sqlString As String = "INSERT INTO Erfassung (Bearbeiter, Fehlerbeschreibung, Erledigt)" & "VALUES ('" & Me.txtZeichen.Text & "', '" & Me.rtxFehlerbeschreibung.Text & "', '" & Me.chxErledigt.Checked = True & "')" Dim cmd As New OleDbCommand(sqlString, conn) Try conn.Open() cmd.ExecuteNonQuery() Catch ex As Exception MessageBox.Show(ex.Message) End Try conn.Close() MessageBox.Show("Neuer Datensatz eingetragen") 2. Versuch: Dim con As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=P:\garantien.accdb") Dim cmd As New OleDb.OleDbCommand cmd.Connection = con cmd.CommandText = "INSERT INTO Erfassung (Bearbeiter, Fehlerbeschreibung, Erledigt) VALUES ('" & Me.txtZeichen.Text & "', '" & Me.rtxFehlerbeschreibung.Text & "', '" & Me.chxErledigt.Checked = True & "')" Dim data As New OleDb.OleDbDataAdapter(cmd) Dim ds As New DataSet data.Fill(ds) MsgBox("Gespeichert") Me.Close() Zuoberst habe ich noch folgende Imports durchgeführt: Imports System.Data.OleDb Imports System.Data.SqlClient Imports System.Data Ich hoffe echt ihr könnt mir helfen. Es wird sicher nur wieder ein kleiner Fehler sein aber ich seh ihn :upps EDIT: Uups hab grad gesehen das es hier in eigenes Forum für .NET gibt. Kann man das noch dahin verschieben? Bearbeitet 16. Januar 2012 von Chlochou Zitieren
trollr Geschrieben 16. Januar 2012 Geschrieben 16. Januar 2012 Was spricht dagegen ein Access Formular zu verwenden? Ansonsten kann ich nur davon abraten Access zu nutzen. Wenn du es in .Net machen willst nimm eine ordentliche Datenbank (MySQL, MSSQL, Postgres, Oracle) oder falls es eine Single-User Anwendung ist nimm eine embedded DB. Zitieren
Chlochou Geschrieben 16. Januar 2012 Autor Geschrieben 16. Januar 2012 Hm dagegen? Es sollte so gemacht werden damit ich was lerne und damit ich etwas zu programmieren habe Es ist einfach so das es eine interne Applikation werden sollte worauf ca. 4 Leute Zugriff haben (lokal installiert). Mit der Software kann man neue Garantien von Geräten eintragen, Garantiefälle auslösen, Suchen und ähnliches. Das komische ist eben das ich den genau gleichen Code in einem anderen Projekt verwendet habe (Einfach andere Übergabe Texte) und es da funktioniert hat Die Verbindung zur Datenbank funktioniert. Zitieren
biu Geschrieben 16. Januar 2012 Geschrieben 16. Januar 2012 er sagt dir doch das der SQL-string falsch ist. den kannst ja beim debuggen einfach mal rauskopieren und in Access einfügen Zitieren
Chlochou Geschrieben 16. Januar 2012 Autor Geschrieben 16. Januar 2012 inwiefern in Access reinkopieren? steh wohl auf dem Schlauch^^ Zitieren
trollr Geschrieben 16. Januar 2012 Geschrieben 16. Januar 2012 Natürlich habe ich nichts dagegen. Für das Szenario ist Access allerdings trotzdem ungünstig, da es eine Single-User Datenbank ist (vllt haben sie es bei 2010 endlich geändert - aber ich bezweifel es). Sprich: Greift jemand drauf zu ist es für die anderen gesperrt. Bei 4 Leuten wohl vernachlässigbar aber sollte man trotzdem beachten. Zum lernen gehört aber nicht nur das programmieren, sondern auch das konzipieren. Meines Erachtens sogar der wichtigere Part. Lass dir das erstellte Statement aus der Variable komplett ausgeben. Kopier es in den Access SQL Editor und er sollte dir eine genauere Fehlermeldung geben. Ansonsten gib uns das generierte Statement. Im Code finde ich keinen Fehler. Könnte höchstens an '' oder "" liegen. Zitieren
Chlochou Geschrieben 16. Januar 2012 Autor Geschrieben 16. Januar 2012 Hm klar. Es ist eben so das theoretisch wirklich nur jmd drauf sein sollte. Ist es denn möglich es auch relativ simpel mit MySQL oder so zu lösen? Mit MySQL hab ich noch recht wenig Erfahrung, kann da nur eben Datenbanken erfassen etc. Und die Verbindung ist da auch wieder so "kompliziert"? Zitieren
trollr Geschrieben 16. Januar 2012 Geschrieben 16. Januar 2012 (bearbeitet) Imports MySql Imports MySql.Data Imports MySql.Data.MySqlClient '... Dim conn As New MySqlConnection Dim myConnectionString As String myConnectionString = "server=host;uid=user;pwd=pw;database=db; " conn.ConnectionString = myConnectionString Try conn.Open() Catch ex As Exception MessageBox.Show(ex.Message) End Try conn.close Quelle: http://www.vb-paradise.de/allgemeines/tipps-tricks-und-tutorials/datenbanken/6300-mysql-datenbanken-mit-vb-net-vb2005-vb2008/ Würde fast sagen es ist leichter als zu einer Access DB. Das arbeiten mit MySQL ist ähnlich wie bei Access, da die "Datenbanksprache" bei allen gängigen Datenbank fast identisch ist. Bearbeitet 16. Januar 2012 von trollr Zitieren
Chlochou Geschrieben 16. Januar 2012 Autor Geschrieben 16. Januar 2012 Okay ich versuch das mal Danke Und zum anderen Problem weisst du sonst nichts? Zitieren
trollr Geschrieben 16. Januar 2012 Geschrieben 16. Januar 2012 Lass dir mal aus Bsp. 1. sqlString ausgeben und poste das Ergebnis. Zitieren
Chlochou Geschrieben 16. Januar 2012 Autor Geschrieben 16. Januar 2012 okay.. jetzt schäm ich mich grad ein wenig vor euch :floet: Mein Fehler liegt bei der Checkbox.. Hab jetzt alles nur mit textbox und RichTextBox getestet -> Wunderbare Daten in meiner DB.. Also muss wohl was an meiner Checkbox nicht passen Tut mir echt verdammt Leid das ich euch damit belästigt hab. Aber kannst du mir noch dabei helfen? Ich hab ne normale Checkbox die bei mir chxErledigt heisst. In der Access Datenbank hab ich Wahr oder Falsch genommen. Wenn die Checkbox angehäckelt ist, dann ist der Fall erledigt, sonst eben nicht. Hab mal zur Übersicht die Textboxen etc. rausgenommen.. Nun mach ich den Insert so: Dim sqlString As String = "INSERT INTO Erfassung (Erledigt)" & "VALUES ('" & chxErledigt.Checked & "')" Dann kommt die Fehlermeldung: Data type mismatch in criteria expression Zitieren
streffin Geschrieben 16. Januar 2012 Geschrieben 16. Januar 2012 (bearbeitet) Me.chxErledigt.Checked = True und Me.chxErledigt.Checked sollte eigentlich beides den selben Bool Wert ergeben. Das erste ist ne Expression, aber Wert ist der gleiche. Ich würd jetzt mal ungesehen, ungestestet, raten (educated guess) dass der OLEDB Treiber das nicht sauber zu Access Boolean übersetzt. In Access wäre checkbox.checked ein -1 statt einer 1... Offen gesagt, bevor ich freiwillig Access verwend, parse und schreib ich mir XML.... selbst das ist imo besser als Access. Ps.: Schäm dich nich, wirklich nich. Da gabs schon GANZ andere Fragen. Gruß Sven Bearbeitet 16. Januar 2012 von streffin Zitieren
Chlochou Geschrieben 17. Januar 2012 Autor Geschrieben 17. Januar 2012 Me.chxErledigt.Checked = True Also wenn ich das nehme kommt wieder folgender Fehler: Invalid SQL statement; expected Delete, insert, procedure, select or update und Me.chxErledigt.Checked Und hier bekomme ich wieder den Fehler: Data type mismatch in criteria expression Zitieren
HJST1979 Geschrieben 17. Januar 2012 Geschrieben 17. Januar 2012 Hallo so wie es aussieht weißt du deinem Boolean in der Access- DB einen String zu Dein Code Dim sqlString As String = "INSERT INTO Erfassung (Erledigt)" & "VALUES ([COLOR="red"]'[/COLOR]" & chxErledigt.Checked & "[COLOR="red"]'[/COLOR])" So denke ich sollte es gehen Code Dim sqlString As String = "INSERT INTO Erfassung (Erledigt)" & "VALUES (" & chxErledigt.Checked & ")" Und schämen braucht man sich nie, man sieht ja, dass du dir schon vorab deine gedanken gemacht hast, HILFE bekommt man in diesem Fall hier eigentlich immer. Gruß Hans-Jörg Zitieren
Chlochou Geschrieben 17. Januar 2012 Autor Geschrieben 17. Januar 2012 Wooow danke viel viel mals!! Es funktioniert nun endlich Was so ein doofes Hochkomma nicht alles anrichten kann :floet: Da ist bei mir noch eine Frage aufgetaucht. Und zwar sind das ja eig. SQL Statements, oder? Jetzt wäre es doch möglich eig. den Code zu "kopieren" und einfach statt Insert into eine Suche daraus zu generieren (Select * from..)? Zitieren
HJST1979 Geschrieben 17. Januar 2012 Geschrieben 17. Januar 2012 Hallo ja das sind SQL- Statements und man könnte diese entsprechend anpassen und alle möglichen SQL- Statements draus "basteln". Ich würde dir aber empfehlen die SQL- Statements mit PARAMETERN zusammen zu bauen, das erhöht die Leserlichkeit, ich weiß aber nicht ob ACCESS das unterstützt. Dim sqlString As String = "INSERT INTO Erfassung (Erledigt) VALUES ([COLOR="red"]@WERT[/COLOR])" Dim cmd As New OleDbCommand(sqlString, conn) cmd.Parameters.AddWithValue("[COLOR="red"]@Wert[/COLOR]", [COLOR="blue"]SqlDbType.Bit[/COLOR]).Value = chxErledigt.Checked Die rote Markierung muss jeweils Identische sein, soll heißen wenn du mehrere Parameter brauchst einfach immer unterschiedlichen Namen geben Die blaue Markierung musst du vielleicht an ACCESS anpassen. Wie du auch siehst, ist der SQL- String komplett ein String ohne "&" auch die ' brauchst nicht setzen da der TYP mitgegeben wird. Viel Spass beim ausprobieren Gruß Hans-Jörg Zitieren
Chlochou Geschrieben 17. Januar 2012 Autor Geschrieben 17. Januar 2012 Ah danke dann werde ich das so versuchen. Und bei dem @Wert kann ich auch eine Textbox eintragen? Mir ist nämlich eingefallen das ich auch ein Formular habe bei dem ich auslesen muss mit einem DatagridView. Da müssen jedoch abfragen gemacht werden Einfache Abfragen wie Select Datum, Verfasser from Erfassung where Verfasser = txtVerfasser.Text geht nämlich auch nicht Mit dem Abfragen Generator kann ich zwar alles rausfiltern aber keinen Textbox Wert vergleichen. Schon jetzt Danke für die vielen Tipps und Lösungen Galileo Openbook hilft eben doch nicht überall Zitieren
HJST1979 Geschrieben 18. Januar 2012 Geschrieben 18. Januar 2012 Welcher Datentyp benutzt wird definierst du ja in unten angegebenen Code- Teil, kann also alles sein, also auch txtVerfasser.Text cmd.Parameters.AddWithValue("@Wert", [COLOR="red"]SqlDbType.Bit[/COLOR]).Value = <Wert ensprechend dem Datentyp> Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.