【问题标题】:Insert or Update SQL Table with DataTable使用 DataTable 插入或更新 SQL 表
【发布时间】:2013-07-23 14:41:37
【问题描述】:

首先,我不能使用任何存储过程或视图。
我知道这可能会适得其反,但这些不是我的规则。

我有一个DataTable,里面装满了数据。它有一个复制到我的 SQL 表的结构。

ID - NAME

SQL 表当前有一些数据,但我现在需要用我的DataTable 的所有数据更新它。如果 ID 匹配,则需要更新 SQl 表,或者添加到唯一的列表中。

有没有办法只在我的 WinForm 应用程序中简单地做到这一点?

到目前为止,我有:

SqlConnection sqlConn = new SqlConnection(ConnectionString);
            SqlDataAdapter adapter = new SqlDataAdapter(string.Format("SELECT * FROM {0}", cmboTableOne.SelectedItem), sqlConn);
            using (new SqlCommandBuilder(adapter))
            {
                try
                {
                    adapter.Fill(DtPrimary);
                    sqlConn.Open();
                    adapter.Update(DtPrimary);
                    sqlConn.Close();
                }
                catch (Exception es)
                {
                    MessageBox.Show(es.Message, @"SQL Connection", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }

数据表:

        DataTable dtPrimary = new DataTable();

        dtPrimary.Columns.Add("pv_id");
        dtPrimary.Columns.Add("pv_name");

        foreach (KeyValuePair<int, string> valuePair in primaryList)
        {
            DataRow dataRow = dtPrimary.NewRow();

            dataRow["pv_id"] = valuePair.Key;
            dataRow["pv_name"] = valuePair.Value;

            dtPrimary.Rows.Add(dataRow);

SQL:

CREATE TABLE [dbo].[ice_provinces](
    [pv_id] [int] IDENTITY(1,1) NOT NULL,
    [pv_name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_ice_provinces] PRIMARY KEY CLUSTERED 
(
    [pv_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

【问题讨论】:

标签: c# asp.net sql-server


【解决方案1】:

由于您要更新现有值并从包含所有数据的数据表中插入新值,我认为以下方法可能最适合您:

  1. 从 SQL 表中删除所有现有数据(您可以使用 TSQL TRUNCATE 语句来提高速度和效率
  2. 使用 ADO.NET SqlBulcCopy 类通过 WriteToServer 方法将 ADO.NET 表中的数据批量插入到 SQL 表中。

不涉及视图或存储过程,只是纯 TSQL 和 .NET 代码。

【讨论】:

  • 易于编程,但可能无法很好地扩展。如果没有太多记录,这应该可以正常工作。
  • @MichaelTodd 是的,但我相信 TRUNCATE/批量复制组合应该可以很好地保存数十万条记录。但它甚至不应该出现这种情况,因为 OP 将所有数据保存在内存 DataTable 中,并且(希望)不应该太多。
  • 这是一个非常不优雅的蛮力解决方案。
  • @YuriyGalanter 呵呵。为您的实用主义 +1。
  • @MichaelTodd - 最大条目约为 1500 ..此解决方案是否可行:)
【解决方案2】:

这是我的尝试,通过它我至少能够更新数据库中的记录。到目前为止,它与您的解决方案不同,它在 Fill() 执行后将值应用于 DataTable。如果有您必须更新的记录,您将不得不在 DataTable 中手动搜索,这就是缺点。 另一件事是,我意识到,如果您没有正确设置 MissingSchemaAction,DataTable 不会从数据库继承表架构。

下面是示例代码(完整的 ConsoleApplication):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace SQLCommandBuilder
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnectionStringBuilder ConnStringBuilder = new SqlConnectionStringBuilder();
            ConnStringBuilder.DataSource = @"(local)\SQLEXPRESS";
            ConnStringBuilder.InitialCatalog = "TestUndSpiel";
            ConnStringBuilder.IntegratedSecurity = true;

            SqlConnection sqlConn = new SqlConnection(ConnStringBuilder.ConnectionString);

            SqlDataAdapter adapter = new SqlDataAdapter(string.Format("SELECT * FROM {0}", "ice_provinces"), sqlConn);
            adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;   // needs to be set to apply table schema from db to datatable

            using (new SqlCommandBuilder(adapter))
            {
                try
                {
                    DataTable dtPrimary = new DataTable();                                   

                    adapter.Fill(dtPrimary);

                    // this would be a record you identified as to update:
                    dtPrimary.Rows[1]["pv_name"] = "value";

                    sqlConn.Open();
                    adapter.Update(dtPrimary);
                    sqlConn.Close();
                }
                catch (Exception es)
                {
                    Console.WriteLine(es.Message);
                    Console.Read();
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 2011-01-17
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2011-12-31
    相关资源
    最近更新 更多