我正在开发的这个应用程序将读取一堆记录,验证/修改数据,然后将数据发送回数据库。
我需要用“全部或全部”方法来做到这一点;要么更新所有行,要么不修改数据库中的任何数据。
我找到了SqlBulkCopy类,它有一个将DataTable
中的所有行写入数据库的方法,但这对我来说是不可接受的。我刚写了一个快速的应用程序,它向数据库写了几行,从该数据库填充DataTable
,修改数据,然后再次调用WriteToServer(DataTable dt)
。即使DataTable
具有所有主键信息,它也只是添加了包含数据和新主键的新行,而不是更新具有匹配主键的行的数据。
那么,如何从C#Winforms应用程序向MSSQL数据库执行批量更新语句?
我认为这不是真的相关,但我还是会包含我的代码。在与数据库交互时我不是很好,所以我很可能只做一些愚蠢和错误的事情。
static void Main(string[] args)
{
using (SqlConnection conn = new SqlConnection("myConnectionInfo"))
{
//DataTable dt = MakeTable();
DataTable dt = FillDataTable(conn);
using (SqlBulkCopy sbc = new SqlBulkCopy(conn))
{
sbc.DestinationTableName = "TestTbl";
try
{
for (int i = 0; i < dt.Rows.Count; i++)
{
dt.Rows[i][1] = i;
dt.Rows[i][2] = i+1;
dt.Rows[i][3] = i+2;
}
sbc.WriteToServer(dt);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("Press Any Key To Continue");
Console.ReadKey();
}
}
}
}
private static DataTable MakeTable()
{
DataTable newProducts = new DataTable("TestTbl");
DataColumn TestPk = new DataColumn();
TestPk.DataType = System.Type.GetType("System.Int32");
TestPk.ColumnName = "TestPk";
TestPk.AllowDBNull = false;
TestPk.AutoIncrement = true;
TestPk.Unique = true;
newProducts.Columns.Add(TestPk);
DataColumn Col1 = new DataColumn();
Col1.DataType = System.Type.GetType("System.String");
Col1.ColumnName = "Col1";
Col1.AllowDBNull = false;
newProducts.Columns.Add(Col1);
// Add 2 more columns like the above block
DataRow row = newProducts.NewRow();
row["Col1"] = "CC-101-WH";
row["Col2"] = "Cyclocomputer - White";
row["Col3"] = DBNull.Value;
newProducts.Rows.Add(row);
// Add 2 more rows like the above block
newProducts.AcceptChanges();
return newProducts;
}
private static DataTable FillDataTable(SqlConnection conn)
{
string query = "SELECT * FROM NYMS.dbo.TestTbl";
using (SqlCommand cmd = new SqlCommand(query, conn))
{
conn.Open();
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
return dt;
}
}
对MakeTable()
的调用已被注释掉,因为我在第一次运行应用程序时使用它来插入一些数据,然后在尝试更新测试数据时我只使用FillDataTable
填充它