Also ich versuche, meine Liste in eine Datenbank zu schreiben und ich habe ein paar Fragen. Vor allem scheint nichts werden in der Datenbank gespeichert, aber es gibt keinen Fehler, die einen Absturz sofar und ich weiß für eine Tatsache, dass dieses Stück Code in der Vergangenheit für mich gearbeitet hat, verursachen würde:Liste <T> zur Datenbank und wieder zurück
public void saveToDb(int var1, string var2)
{
SqlCommand cmd = new SqlCommand("Insert into [table] (col1, col2) VALUES (@param1, @param2)", conn);
cmd.Parameters.AddWithValue("@param1", var1);
cmd.Parameters.AddWithValue("@param2", var2);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
Ich habe ein dreiteilige Schicht geht weiter, ui, Logik und DAL. Erstens funktionierte es nicht mit der Datenbank und den app.config-Dateien in der DAL-Klassenbibliothek, so dass diese in die Hauptklassenbibliothek verschoben wurden, und jetzt jammert es nicht über die bereits existierende Datenbank und es findet meine Verbindungszeichenfolge.
Um die Daten in dieses Verfahren im schickt es auf diese Weise tun:
for (int i = 0; i < myList.Count; i++)
{
da.saveToDb(myList.val1, myList.val2);
}
Sein gibt mir keinen Fehler im Code, aber nichts scheint gerettet zu werden oder zurückgesetzt wird, wenn ich das Programm zu stoppen, aber ich nicht weiß, welche, aber ich kann sehen, dass die Variable korrekt übergeben wird, indem Sie sie vor der Einfügung drucken, so dass ich denke, dass der DB zurückgesetzt wird? Setzen Sie meine db in den Debug-Ordner und spülen sie jedes Mal oder was?
Eine andere Sache ist das letzte Mal, dass ich dies tat, es war ein Formular, so dass es immer nur einen Einsatz zu einer Zeit geben würde, im Moment könnte meine Liste von Objekten irgendwo von 1 bis viele Objekte enthalten und damit ich würde die db-verbindung einmal für jedes objekt in meiner liste öffnen oder schließen oder? Wie machst du Masseneinsätze? Ich habe über Datasets gelesen, aber sie scheinen alle aus einer Datenbank zu lesen, die nicht schreibt, also bin ich mir nicht sicher. Ich habe aus einer Datenbank in einem anderen Projekt mit Dataset und Adapter gelesen, so dass dies kein Problem sein sollte, aber wie sende ich eine Liste in eine Tabelle? Um es etwas schwieriger zu machen, kann ich nicht einfach die gesamte Liste konvertieren, weil 10 propertys 8 in eine Tabelle gehen und die verbleibenden 2 in eine zweite Tabelle gehen müssen, also müsste ich sie loopen und die entsprechende Eigenschaft hinzufügen jeweiligen Datensatz (oder was Sie verwenden).
bearbeiten
Nun ive jetzt einige Anpassungen und im Versuch, zwei Methoden und von denen keine Arbeit gemacht, aber weder gibt entweder einen Fehler, der frustrierend erhält.
Erste Methode:
public void saveToDb(int val1, string val2)
{
SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["[MyConnectionString]"].ConnectionString);
SqlCommand cmd = new SqlCommand("Insert into [table] (val1, val2) VALUES (@param1, @param2)", conn);
cmd.Parameters.AddWithValue("@param1", val1);
cmd.Parameters.AddWithValue("@param2", val2);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
Und der zweite Versuch, eine Tabelle SqlBulkCopy:
public void SaveToDb()
{
using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["[MyConnectionString]"].ConnectionString))
{
conn.Open();
using (SqlBulkCopy bulk = new SqlBulkCopy(conn))
{
bulk.ColumnMappings.Add("col1", "col1");
bulk.ColumnMappings.Add("col2", "col1");
bulk.DestinationTableName = "[table]";
System.Diagnostics.Debug.Print("Open");
bulk.WriteToServer(tab);
foreach (DataRow row in tab.Rows)
{
foreach (var item in row.ItemArray)
{
System.Diagnostics.Debug.Print(item.ToString());
}
}
System.Diagnostics.Debug.Print("sending");
}
System.Diagnostics.Debug.Print("closing");
}
}
ich sollte es nicht zur Karte haben, da die Tabelle exakt die gleichen Spalten wie die Tabelle enthält mit der die gleiche Benennung (Groß-/Kleinschreibung), aber es wird komisch mit dem Primärschlüssel, der inkrementiert, so dass ich es zugeordnet, so dass es das Inkrement automatisch hinzufügen sollte, aber nichts eingefügt wird, der Druck zeigt genug die Werte, aber wenn ich das Mapping kommentieren ein Fehler, der besagt, dass null nicht zugewiesen werden kann ed (was wahr ist, wird meine Tabelle keine Nullen annehmen), aber der Wert sollte nicht Null sein, da er in der Tabelle ist?
Ich gehe davon aus, dass Sie in der Datenbank gesucht haben, um sicherzustellen, dass diese Datensätze nicht eingefügt werden, richtig? –
Verwenden Sie keine globale Verbindung, sondern verwenden Sie stattdessen die 'using-Anweisung' für die' Verbindung' und die 'SqlCommand', die die Verbindung implizit schließen. Dies funktioniert auch im Falle einer Ausnahme. Deine Verbindung würde offen bleiben. –
Ich habe mir die DB angeschaut und das ist ein guter Rat, danke Tim. – nejs