ExecuteNonQuery() nicht speichern beliebiger Datensätze
Arbeite ich eine WinForms-basierten C# - tool, das hat eine angeschlossene MDF-Datei-Datenbank. Ich versuche, die SqlCommand.ExecuteNonQuery()
Methode, einen Datensatz zu speichern, um das angeschlossene MDF-Datenbank, aber der Eintrag wird nicht gespeichert. Kein Fehler oder eine exception Auftritt; problem ist nur, dass der Datensatz ist nicht wirklich gespeichert.
Ich habe eine Console.WriteLine
an der Spitze, was zeigt die Abfrage, die ich bin versucht zu laufen. Seine korrekte syntax und Weise, und wenn ich kopieren und einfügen aus der Ausgabe von windows und führen Sie es separat, es funktioniert.
Habe ich korrekt definiert die Verbindungszeichenfolge als die folgenden, und es funktioniert gut für das abrufen von Datensätzen:
public static String connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\TestBuildDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
Hier die Funktion, die ich zum speichern von Datensätzen:
public static void PerformDBWriteTransaction(string inputSQLStatement)
{
Console.WriteLine(inputSQLStatement);
DataTable returnDataTable = new DataTable();
SqlConnection sqlConnection = new SqlConnection();
sqlConnection.ConnectionString = connectionString;
SqlCommand cmd = new SqlCommand();
cmd.Connection = sqlConnection;
cmd.CommandType = CommandType.Text;
cmd.CommandText = inputSQLStatement;
cmd.Connection.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
errorMessages.Clear();
errorMessages.Append("The following errors were found in the SQL statement:\n\n");
for (int i = 0; i < ex.Errors.Count; i++)
{
errorMessages.Append("Index #" + i + "\n" +
"Message: " + ex.Errors[i].Message + "\n" +
"LineNumber: " + ex.Errors[i].LineNumber + "\n" +
"Source: " + ex.Errors[i].Source + "\n" +
"Procedure: " + ex.Errors[i].Procedure + "\n");
}
MessageBox.Show(errorMessages.ToString());
}
finally
{
cmd.Connection.Close();
}
}
Kann mir jemand sagen, was das problem sein könnte ? Brauche ich zum ausführen eines 'commit' irgendwie ?
EDIT:
Ich hab das problem gefunden, und geschrieben haben, bis eine Lösung unten .. Danke an alle die mir geholfen obwohl 🙂
- Was ist in
inputSQLStatement
? - Die SQL-Anweisung, die ich versuche auszuführen .. im Grunde ist es eine insert-Anweisung ..
- Sie sind nicht machen einen .Öffnen Sie auf Ihrem Anschluss. - Sry gerade gesehen das es das Letzte ist, was genannt wird auf die Verbindung.
- Ich bin, genau vor die try-Anweisung ..
- don ' T sehen ein problem mit dem code, was ist die SQL-Sie passieren?
- Ein Beispiel inputSQLStatement kommen in dieser Funktion ist diese:
INSERT INTO Products (Name, Barcode, TypeID, Region, Comments, Enabled) VALUES ('werew', 'rew', 1, 'werwer', 'wer', 1)
- Versuchen Sie, die .open-Anweisung innerhalb des try-catch - ich denke, sollte es dort trotzdem.
- funktioniert immer noch nicht .. keine Fehler/Ausnahmen, aber die Aufzeichnung wird nicht gespeichert .. Jup du hast Recht, logisch sollte es dort ..
- Ich bin nicht zu sehen, ein direktes problem. Versuchen Sie das einwickeln der gesamte Inhalt der Methode in einem try/catch und sehen, ob es eine Exception geworfen, die du nicht fangen.
- habe gerade versucht, dass so gut .. Versucht wickeln den gesamten code in einem try-catch-und debuggt durch Sie Zeile für Zeile ... keine Ausnahmen erkannt ..
- Letzte, was ich weiß, zu prüfen, ist, dass die db-Datei ist nicht schreibgeschützt.
- Wie kann ich das überprüfen ?
- Rechtsklick auf die Datei, wählen Sie Eigenschaften aus. Stellen Sie sicher, dass das Attribut schreibgeschützt nicht aktiviert ist.
- Ich sehe nicht, dass die option irgendwo .. EDIT: ich denke, du meintest die eigentliche MDF-Datei-Eigenschaften .. keine seiner nicht überprüft, und auch das, was ist, wenn ich versuche die Abfrage separat, es speichert .. es nur nicht speichern wenn ich es in meiner Anwendung ..
- Wie werden Sie überprüfen, ob Ihr Datensatz eingefügt wurde? Die Beurteilung durch Ihre Verbindungszeichenfolge, die Sie verwenden, user-Instanzen msdn.microsoft.com/en-us/library/bb264564(v=sql.90).aspx
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe das problem gefunden ! Es war sehr einfach, und es war dumm, wirklich 🙂 .. Der code oben ist alles korrekt .. ja, die Leute darauf hingewiesen, Optimierungen, etc, aber immer noch der obige code korrekt war.
War das problem, dass wenn ich importierte die TestDB.MDF-Datei in mein Visual-2010-Projekt, eine Kopie, die gemacht wurde im Projekt-Ordner. Wenn Sie "ausführen/debug" das Programm, anderen Kopie von dieser Datei gemacht wird, und wird in den \bin\Debug\ Ordner. In der Verbindungszeichenfolge, die ich hatte, hatte ich erwähnt:
AttachDbFilename=|DataDirectory|\TestBuildDB.mdf
.. Dies bedeutete, dass alle lese - /Schreibvorgänge auf die Kopie in den Ordner bin\Debug. Jedoch, die TestDB.MDF-Datei, die ich suchte, in zu überprüfen, ob Datensätze eingefügt wurden oder nicht, war in dem Ordner des Projekts ! Also im Grunde gab es zwei MDF-Dateien, und ich war das schreiben der Datensätze in einer Datei, sondern versuchte, Sie zu finden, in der anderen 🙂Beim hinzufügen einer MDF-Datei in der VS2010-Projekt, VS2010 standardmäßig stellt eine Verbindung zu, dass die MDF-Datei, von wo aus Sie können einige der Sachen, die MDF-Datei .. Die MDF-Datei für diesen Zweck verwendet wurde, der einer in dem Ordner des Projekts, NICHT das, in bin\Debug\ Ordner. Und wie ich schon sagte, mein code verwendet, den man in den Ordner bin\Debug-Ordner 🙂
Also was ich jetzt gemacht hab ist, dass ich entfernt den Test.MDF-Datei-Verweis, von meinem Projekt, das entfernt die Kopie vorhanden in dem Ordner des Projekts. Aber ich habe eine Kopie von TestDB.MDF-Datei in den Ordner bin\Debug\ Ordner, in dem ich eine aus meiner Anwendung. Und wenn ich will, durchsuchen Sie die MDf-Datei aus meinem Projekt, ich verwenden Sie SQL Management Studio. Das einzige problem hier ist, dass eine MDF-Datei kann nur von einem Programm zu einem bestimmten Zeitpunkt. Also wenn ich es mit meiner Bewerbung, ich haben, es offline zu dauern, die von SQL Management studio, und Umgekehrt !
Ich hoffe, diese Erklärung hilft jemand da draußen 🙂
Die Lösung dieses Problems ist sehr einfach, nur geben Sie den vollständigen Pfad der ursprünglichen MDF-Datei in den connection-String wie diesen:
Ist es, Ihr problem ist gelöst.
Hatte ich die selbe Herausforderung habe ich einfach geändert, wird die Datenbank-Eigenschaft "Copy to Output Directory" aus "immer Kopieren" auf "nicht kopieren" zog dann meine Datenbank.mdf (drag & drop von meinem IDE) in den Ordner bin\debug.
Tipp:
Das bin-Verzeichnis ist normalerweise versteckt, verwenden Sie die "Alle Dateien Anzeigen", um es anzuzeigen
Eine catch-Klausel, die für alle Ausnahmen. Wenn dort etwas falsch von anderen als SqlException, werden Sie nie sehen, was ist es und deine db wird neved aktualisiert werden. Stell dir vor es gäbe eine FormatException...
Überprüfen Sie auch die Rückkehr von ExecuteNonQuery : es ist die Anzahl der Zeilen von der Abfrage betroffen.
Erste, Sie sollte immer wickeln Sie Ihre
IDisposable
Objekte in einerusing
um sicherzustellen, dass Sie geschlossen sind und ordnungsgemäß entsorgt (und das Verbindungs-pooling kann seine Sache tun). Zweitens, wenn Sie Daten ändern, die wrap up your sql in einer Transaktion pflegen Sie die Integrität der Daten.Versuchen Sie den folgenden code, und sehen Sie, wenn keine Ausnahmen ausgelöst werden. Ich normalerweise nicht empfehlen, Fang
Exception
wie es ist zu allgemein, würde ich lassen, die Blase bis an die aufrufende Mechanismus und behandeln Sie es - aber für dieses Beispiel wird Ihnen zeigen, irgendwelche und alle Fragen. Ich denke, dass Ihr Thema wird am.Open
Phase der Verbindung, so versuchen Sie es schrittweise durch.using
schließt die Verbindung implizit, sehr seltsam, dass ein line-by-line Debuggen nicht alles zeigen - werden ALLE Linien (ohne Ausnahmebehandlung) ausgeführt?Data Source=.\SQLEXPRESS; Initial Catalog=YourDatabaseNameWhenAttached; Integrated Security=True; Connect Timeout=30; User Instance=True
YourDatabaseNameWhenAttached
?Hallo, ich arbeite an der Bibliothek-Datenbank, wenn ich hinzufügen student Aufzeichnung
executionNonQuery
zeigt Fehler wie ungültige Spalte name öffnet sich die Seite aber speichern von Daten geschieht nicht.
Hier habe ich die code-Anweisung