使用DataTable插入或更新SQL表格

问题描述:

首先,我不能使用任何存储过程或视图。
我知道这看起来可能适得其反,但那些不是我的规定。使用DataTable插入或更新SQL表格

我有一个DataTable,填充数据。它有一个复制结构到我的SQL表。

ID - NAME

SQL表目前有一个数据位,但我需要现在我DataTable的所有数据更新。如果ID匹配,它需要更新SQl表,或者将ADD添加到唯一的列表中。

有没有什么办法只是在我的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] 
+0

您当前的代码应该做的伎俩。它是否因错误而失败,或者失败?这是ASP.NET吗? – Renan

+0

你可以使用LINQ吗? – user1477388

+0

@Ranan,它目前只是将值添加到前一个表的末尾。 - 是的,我可以使用linq – TheGeekZn

既然你要更新现有的值,并从该数据表中插入新的无论如何拥有所有的数据我认为以下方法可能对您最有效:

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

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

+0

易于编程,但可能无法很好地扩展。如果有史以来没有太多的记录,这应该工作得很好。 –

+1

@MichaelTodd true,但我相信TRUNCATE/Bulk copy组合应该可以保持数十万条记录。但它应该不会出现这种情况,因为OP会将所有数据保存在内存中的DataTable中,并且(希望)不会太多。 –

+0

这是一个非常不雅,粗暴的强制解决方案。 – Renan

这是我的尝试,我至少能够更新数据库中的记录。它与目前的解决方案有所不同,它在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(); 
       } 
      } 
     } 
    } 
}