0

C# の初心者。foreach ループの結果をどのように使用できますか。結果をデータ テーブルに挿入します。

挿入する列に名前を付けます

foreach (DataRow row in objDataset1.Tables[0].Rows)
{
    string strValue = row["code"].ToString();        
}

sc.Open();
cmd = new SqlCommand("Insert into Table (Code, v1, v2, v3) values('" + strValue + "','" + ckv1.IsChecked.ToString() + "','" + ckv2.IsChecked.ToString() + "', '" + txtv3.Text + "')", sc);
cmd.ExecuteNonQuery();
4

4 に答える 4

4

パラメータ化されたクエリを使用すると、より安全になります。そして、それを使用する場合はusing block、最後に接続を確実に破棄します。

using(SqlConnection sc = new SqlConnection("yourConnectionString"))
{

   cmd = new SqlCommand("Insert into [tbl] (Code, v1, v2, v3) Values(@code, @v1, @v2, @v3)", sc);

   cmd.Parameters.Add(new SqlParameter("@code", SqlDbType.VarChar));
   cmd.Parameters.Add(new SqlParameter("@v1", SqlDbType.Bit));
   cmd.Parameters.Add(new SqlParameter("@v2", SqlDbType.Bit));
   cmd.Parameters.Add(new SqlParameter("@v3", SqlDbType.Bit));
   sc.Open();

   foreach (DataRow row in objDataset1.Tables[0].Rows)
   {

        //Assign the values for above parameters here.
        cmd.Parameters["@code"].Value = row["code"].ToString();
        cmd.Parameters["@v1"].Value = valueForV1;
        cmd.Parameters["@v2"].Value = valueForV2;
        cmd.Parameters["@v3"].Value = valueForV3;

        //Execute the command
        cmd.ExecuteNonQuery(); 
   }
}

注: v1、v2、および v3 がデータベースのビット フィールドである場合は、.ToString() メソッドを使用せずにブール値として渡す必要があります。

于 2013-10-02T16:02:19.613 に答える
0
var codes = objDataset1.Tables[0].AsEnumerable()
                       .Select(r => r.Field<string>("code"));

if (!code.Any())
    return;


var sql = "INSERT INTO Table (Code, v1, v2, v3) VALUES (@code, @v1, @v2, @v3)";
sc.Open();

foreach(var code in codes)
{        
    cmd = new SqlCommand(sql, sc);
    cmd.Parameters.AddWithValue("@code", code);
    cmd.Parameters.AddWithValue("@v1", ckv1.IsChecked);
    cmd.Parameters.AddWithValue("@v2", ckv2.IsChecked);
    cmd.Parameters.AddWithValue("@v3", txtv3.Text);
    cmd.ExecuteNonQuery();
}

また、コマンドを作成してパラメータを自動的に追加するDapperの使用も検討してください。

var v1 = ckv1.IsChecked;
var v2 = ckv2.IsChecked;
var v3 = txtv3.Text;

foreach(var code in codes)
    sc.Execute(sql, new { code, v1, v2, v3 });
于 2013-10-02T16:08:06.467 に答える
0

'new SqlCommand' をループ内に置くのは非効率的です。これらのコマンド オブジェクトはすべて、プロシージャの有効期間を通じて存在するため、SQL Server で問題が発生する可能性があります。試してください:

(1)ループの外側でSqlCommandを作成します
(2)ループの外側でSQLParameterを再度作成します:

SqlParameter myParam = cmd.Parameters.Add("@myValue", SqlDbType.VarChar);

(3)あなたのループで:

myParam.Value = strValue;
cmd.ExecuteNonQuery();
于 2013-10-02T16:11:01.137 に答える