C# DataTable和Sql server之间的数据传输

C# DataTable和Sql server之间的数据传输,c#,sql-server,C#,Sql Server,我有一个用DataTable实现的数据表。任务是将每个单元格的数据传递到Sql Server表。我试图用下面的代码实现这一点: Task AddToDB=Task.Run(()=> { 对于(int i=0;i

我有一个用DataTable实现的数据表。任务是将每个单元格的数据传递到Sql Server表。我试图用下面的代码实现这一点:

Task AddToDB=Task.Run(()=>
{
对于(int i=0;i
错误是在第一次迭代后,我得到一个错误:
变量名'@Value1'已声明。在查询批处理或存储过程中,变量名必须是唯一的。

我试图仔细研究这个答案 并添加一行

sqlCommand.Parameters.Clear();
但最后我又犯了一个错误

Cannot insert the value NULL into column 'Value'

变量的值为零,并且在数据库设置中指定单元格的值不能为空。如何绕过这些限制并将数据写入数据库?

在循环外只调用AddWithValue一次(或者更好),然后在循环内只设置值:

cmd.Parameters.AddWithValue("id", -1); //dummy value of same type as ID is
foreach(var ro in table.Rows){
  cmd.Parameters["id"].Value = (int)ro["PersonID"];
  cmd.ExecuteNonQuery();
}
这是一个简单的例子来说明这一点。我不建议像EzLo的回答中所提倡的那样,每次清除参数并重新添加它们

实际上,您应该考虑使用DATA适配器,因为它知道如何做到这一点。

…然后,您可能应该实际使用强类型数据集和TableAdapter来持久化对数据库的更改。生成与db表链接的强类型DataTable时,它附带一个专用的TableAdapter,负责填充db中的行并更新更改。读取、更新、写入周期可能如下所示:

var ta = new PersonTableAdapter();
var dt = ta.GetDataById(123);
dt.Rows[0].Name = "John Smith";
ta.Update(dt); //it saves the changes to the db; new rows are Inserted, changed rows UPDATEd and removed rows are DELETEd

您需要在for循环内重新初始化
sqlCommand.Parameters
。当前的问题是,该特定命令(
sqlCommand.parameters
)的参数数组在第二次迭代时获得了重复的参数名,因为它仍然具有以前的参数名

您链接的解决方案应该足够了。只需在设置参数之前立即清除这些参数:

for (int j = 0; j < DataTableView.Columns.Count - 1; j++)
{

    try
    {
        sqlCommand.CommandText = @"INSERT INTO TestTable  VALUES (@Value1, @Value2, @Value3)";
        sqlCommand.Connection = sqlConnection;

        sqlCommand.Parameters.Clear();
        sqlCommand.Parameters.AddWithValue("@Value1",  DataTableView.Rows[i][j]);
        sqlCommand.Parameters.AddWithValue("@Value2",  DataTableView.Rows[i][j]);
        sqlCommand.Parameters.AddWithValue("@Value3",  DataTableView.Rows[i][j]);

        sqlConnection.Open();
        sqlCommand.ExecuteNonQuery();
        sqlConnection.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error");
    }
}

我保证会得到一个错误,因为服务器会假定我插入了一个空值
c#无法将值NULL插入“value”列
然后删除表上的
NOT NULL
定义,或者在单元格值为NULL时跳过该行。用户定义的表类型非常适合您的要求。你不需要循环。整个数据集可以一次发送go@ChathurangaRanasinghe我可以要求一个与用户定义的良好描述的链接?谷歌最初的一些链接并没有让我对它的工作原理有一个清晰的了解
sqlCommand.CommandText = @"INSERT INTO TestTable (Column1, Column2, Column3)  VALUES (@Value1, @Value2, @Value3)";