使用foreach循环的结果

时间:2013-10-02 15:56:15

标签: c#

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 个答案:

答案 0 :(得分: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()方法。

答案 1 :(得分:0)

您的C#数据集很可能首先来自Sql数据库。如果是这样,最有效的方法是构建一个查询:

string sql = "Insert into Table (Code, v1, v2, v3) " + 
                " SELECT code, v1, v2, v3 FROM <this part resembles your original query>";

答案 2 :(得分: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 });

答案 3 :(得分:0)

将'new SqlCommand'置于循环中是效率低下的;所有这些命令对象将在整个过程的生命周期中存在,这可能会导致SQL Server出现问题。试试:

(1)在循环外创建SqlCommand
(2)再次在循环外创建一个SQLParameter:

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

(3)在你的循环中:

myParam.Value = strValue;
cmd.ExecuteNonQuery();