数据表和 Sql 服务器之间的数据传输



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

Task AddToDB = Task.Run(() =>
{
for (int i = 0; i < DataTableView.Rows.Count; i++)
{
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.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");
}
}
}
});
return AddToDB;

错误是第一次迭代后我收到一个错误:The variable name '@Value1' has already been declared. Variable names must be unique within a query batch or stored procedure.

我试图仔细研究这个答案 变量名称"@"已被声明。变量名称在查询批处理或存储过程中必须是唯一的。在 C# 中 并添加一行

sqlCommand.Parameters.Clear();

但最后我又遇到了一个错误

Cannot insert the value NULL into column 'Value'

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

您需要重新初始化 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");
}
}

还要确保在INSERT语句中添加TestTable列名和正确的顺序:

sqlCommand.CommandText = @"INSERT INTO TestTable (Column1, Column2, Column3)  VALUES (@Value1, @Value2, @Value3)";

在循环外只调用一次 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 的回答中所倡导的那样

实际上,您应该考虑使用DataAdapter,因为它已经知道如何执行此操作。

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

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

最新更新