2017-07-08 8 views
4

Ich habe 98 Spalten in einer Tabelle mit dem Namen 'Molasses_Analysis' und ich muss Datensätze mit meiner C# Desktop-Anwendung einfügen.
Beispiel meines Codes ist wie folgt.Mehrere Werte in eine Tabelle einfügen, in C#

string insert_sql = @"insert into molasses_analysis(mo_entry_date, mo_entry_time, mo_code, mo_brix, mo_pol, mo_purity, mo_crtd_by) " + 
    " values(@entry_date, @entry_time, @mol_code, @brix, @pol, @purity, @crtd_by)"; 
    try 
     { 
     List<SqlParameter> param = new List<SqlParameter>(); 
     param.Add(new SqlParameter("@entry_date", entry_date)); 
     param.Add(new SqlParameter("@entry_time", entry_time)); 
     param.Add(new SqlParameter("@mol_code", mol_code)); 
     param.Add(new SqlParameter("@brix", brix)); 
     param.Add(new SqlParameter("@pol", pol)); 
     param.Add(new SqlParameter("@purity", purity)); 
     param.Add(new SqlParameter("@crtd_by", crtd_by)); 
     int inserted_rows = SqlHelper.ExecuteNonQuery(dbConn.sqlConn(),CommandType.Text, insert_sql, param.ToArray()); 
     } 
catch (Exception ex) 
     { 
     MessageBox.Show("Data not saved!\nError message - "+ex.Message, "Error!!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 

Hier habe ich nur sieben Felder/Spalten nur, aber es wird ziemlich hektisch und schmerzhaft ein solcher Code für 98 Spalten zu schreiben und Sql Parameter für jede Spalte zuordnen. Meine Frage ist, gibt es einen saubereren und guten Code zum Einfügen mehrerer Spalten mit C# -Code?

+0

Nicht wirklich, nein. Sie können die ganze Sache dynamisch machen, indem Sie eine Liste von Spalten und ihren Werten haben, aber Sie müssen immer noch ausführen, was als etwas Ähnliches endet. –

+0

Nein, es gibt kein AFAIK. Sie sollten in EntityFramework oder eine ähnliche Bibliothek schauen. Spart Ihnen viel Zeit, indem es all diese Dinge für Sie verwaltet. – stybl

+0

Das Beste, was Sie tun können, ist, Ihre SQL-Anweisung dynamisch aufzubauen, indem Sie ein Verzeichnis oder eine Liste der Spalten, denen Sie Werte hinzufügen müssen, und eine ähnliche Liste (oder das gleiche Wörterbuch/Liste) mit den Werten, die Sie benötigen Um in diese Spalten zu platzieren, kombinieren Sie all dies mithilfe von Schleifen, um die richtige SQL zu verketten und alle Parameter hinzuzufügen. –

Antwort

4

Die kurze Antwort ist nein; Nicht mit der Art, wie Sie lokale Variablen verwenden, um alle SqlParameter zu füllen.

Eine Lösung wäre, wenn jede dieser lokalen Variablen stattdessen in einer Dictionary (Schlüssel/Wert-Paare) gespeichert wurde, könnten Sie eine StringBuilder verwenden und iterieren Sie Ihre Wörterbuchschlüssel zum Erstellen der SQL-Abfragezeichenfolge. Während dieser Schleife können Sie jede SqlParameter hinzufügen.

using System.Collections.Generic; // for dictionary 
using System.Text; // for stringbuilder 

// ... 

// create a dictionary then use a literal to make it easier to populate 
Dictionary<string, string> data = new Dictionary<string, string> 
{ 
    { "entry_date", "SOMEVALUE1" }, 
    { "entry_time", "SOMEVALUE2" } 
    // add more params and values here... 
}; 

// start our query and params list 
StringBuilder query = new StringBuilder("YOUR QUERY STARTS HERE"); 
List<SqlParameter> params = new List<SqlParameter>(); 

// iterate over each key/value pair, appending to the query and params list 
foreach (KeyValuePair<string, string> pair in data) { 
    query.Append("@" + pair.Key); 
    params.Add(new SqlParameter(pair.Key, pair.Value)); 
} 

HINWEIS: Der obige Code ist ein Beispiel zu demonstrieren, Wörterbücher und Stringbuilders verwendet wird; Es sollte studiert werden, nicht kopiert werden.

1

Wenn Ihre Namen und Spaltennamen gleich sind, wird Ihnen diese Antwort helfen. Zunächst holen Sie Ihre Spaltennamen mit SQL-Code, der dann unter

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'molasses_analysis'; 
//this returns column names and column types 

gegeben zuweisen Tabelle aufzulisten, die Spaltennamen enthält

List<string> listColNames = new List<string>(); 

dann mit Schleife Ihre sqlInsert Zeichenfolge erstellen

foreach (string item in listColNames) { 
    params.Add(new SqlParameter("@" + item, item)); 
} 
Verwandte Themen