使用DataTable插入或更新SQL表
本文关键字:SQL 更新 DataTable 插入 使用 | 更新日期: 2023-09-27 18:24:35
首先,我不能使用任何存储过程或视图
我知道这可能会适得其反,但这不是我的规则。
我有一个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]
由于您要更新现有值,并从包含所有数据的数据表中插入新值,我认为以下方法可能最适合您:
- 从SQL表中删除所有现有数据(为了提高速度和效率,可以使用TSQLTRUNCATE语句
- 使用ADO.NET
SqlBulcCopy
类使用WriteToServer方法将数据从ADO.NET表大容量插入到SQL表
不涉及视图或存储过程,只涉及纯TSQL和.NET代码。
这是我的尝试,通过它我至少可以更新数据库中的记录。到目前为止,它与您的解决方案的不同之处在于,它在执行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();
}
}
}
}
}