2017-07-08 22 views
4

テーブルに 'molasses_analysis'という名前の列が98あり、私のC#デスクトップアプリケーションを使ってレコードを挿入する必要があります。
サンプルコードは以下の通りです。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); 
     } 

は、ここで私はちょうど7フィールド/列のみ使用されるが、98個の列のようなコードを書いて、列ごとにSQLのパラメータを割り当てるために、非常に多忙と苦痛になります。 私の質問は、C#コードを使用して複数の列を挿入するクリーナーと良いコードはありますか?

+0

そうではありません。列とその値のリストを持たせることで、全体を動的にすることができますが、やはり同様のものとして実行する必要があります。 –

+0

いいえAFAIKがありません。 EntityFrameworkまたは同様のライブラリを調べる必要があります。あなたのためにすべてのものを管理することによって、あなたに多くの時間を節約します。 – stybl

+0

あなたが行うことができる「最良の」方法は、値を追加するために必要な列やディクショナリを持つことで、SQL文を動的に構築し、必要な値を持つ類似のリスト(または同じ辞書/リスト)これらの列に配置するには、このすべてのループを使用して、適切なSQLを連結してすべてのパラメータを追加します。 –

答えて

4

短い答えはいいえです。それぞれのローカル変数を使用して、各SqlParameterを設定しているわけではありません。

これらのローカル変数のそれぞれがDictionary(キーと値のペア)に格納されていた場合、StringBuilderを使用して辞書キーを繰り返してSQLクエリ文字列を作成できます。同じループの間に、それぞれSqlParameterを追加することができます。

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)); 
} 

:上記のコードは、辞書やstringbuildersを用いて実証するあります。それは研究されるべきであり、コピーペーストされるべきではない。

1

プロパティ名と列名が同じ場合は、この回答が役に立ちます。

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

の下に与えられたSQLコードと まず、取得あなたのカラム名は、次に、ループを使用してsqlInsert文字列を作成する列名

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

が含まれているリストするテーブルを割り当てる

foreach (string item in listColNames) { 
    params.Add(new SqlParameter("@" + item, item)); 
} 
関連する問題