更新语句的SqlBulkCopy之类的东西?

时间:2016-01-07 15:45:52

标签: c# sql-server winforms

我正在开发的这个应用程序将读取一堆记录,验证/修改数据,然后将数据发送回数据库。

我需要用“全部或全部”方法来做到这一点;要么更新所有行,要么不修改数据库中的任何数据。

我找到了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填充它

0 个答案:

没有答案