SqlDataAdapter 更新带有自增种子的数据表

LGame 2015-01-14 05:16:24
因为需要将后台数据更新到前台数据库,但数据表中的主件事自增ID

抛出了下面的异常
{System.Data.SqlClient.SqlException (0x80131904): 当 IDENTITY_INSERT 设置为 ON 或某个复制用户向 NOT FOR REPLICATION 标识列中插入内容时,必须为表 't_MultipleSale' 中的标识列指定显式值。

不能修改前台数据库的表结构,

谢谢大家

数据表:

CREATE TABLE [dbo].[t_MultipleSale](
[F_ID] [bigint] IDENTITY(1,1) NOT NULL,
[F_Name] [nvarchar](60) NULL,
[F_Start] [datetime] NULL,
[F_End] [datetime] NULL,
CONSTRAINT [PK_t_MultipleSale] PRIMARY KEY CLUSTERED
(
[F_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]


测试代码.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Collections;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
DataSet dsData = GetDs("SELECT F_ID,F_Name,F_Start,F_End FROM t_MultipleSale where 1=2");

Hashtable htParm = new Hashtable();
htParm.Add("1", "SELECT F_ID,F_Name,F_Start,F_End FROM t_MultipleSale where 1=2 ");

DataTable dtUpd = dsData.Tables[0].Copy();

DataRow drNew = dtUpd.NewRow();
drNew["F_ID"] = 11;
drNew["F_Name"] = "test";
dtUpd.Rows.Add(drNew);

DataSet dsSync = new DataSet();
dtUpd.TableName = "1";
dsSync.Tables.Add(dtUpd.Copy());
dsSync.Tables[0].TableName = "1";

SaveData(dsSync, htParm);

}

/// <summary>
/// 取得连接字符串
/// </summary>
/// <returns></returns>
public string GetConStr()
{
string strCon = "";
string strFile = AppDomain.CurrentDomain.BaseDirectory + "Set.ini";
string strServer = @"DBSERVER\SQL2008R2";
string strLogID = "sa";
string strLogPsw = "Avail8941";
string strDB = "NewCloth_Sync";

//Data Source=20090911-1332\OK;Initial Catalog=water;Persist Security Info=True;User ID=sa;Password=1

strCon = @"Data Source=" + strServer + ";Initial Catalog=" + strDB + ";User ID=" + strLogID + ";Password=" + strLogPsw;
//strCon = "Data Source=" + strServer + ";Initial Catalog=" + strDB + ";Persist Security Info=True;User ID=" + strLogID + ";Password=" + strLogPsw + ";Network Library=dbnmpntw";
return strCon;
}

public string SaveData(DataSet ds, Hashtable htParm)
{
string sSQL;
int iCnt = 0;
SqlConnection con = new SqlConnection(GetConStr());
con.Open();
SqlTransaction tran = con.BeginTransaction();
try
{
iCnt = htParm.Count;

for (int i = 1; i <= iCnt; i++)
{
sSQL = htParm[i.ToString()].ToString();

DataTable dt = ds.Tables[i.ToString()];

SqlCommand myComm = new SqlCommand();
myComm.Connection = con;
myComm.Transaction = tran;


myComm.CommandText = " SET IDENTITY_INSERT t_MultipleSale ON ";
myComm.ExecuteNonQuery();

//myComm.CommandText = " SET IDENTITY_INSERT t_MultipleSale ON ; " + sSQL;
myComm.CommandText = sSQL;

myComm.CommandTimeout = 3000;

SqlDataAdapter myAdt = new SqlDataAdapter();
myAdt.SelectCommand = myComm;

SqlCommandBuilder bd = new SqlCommandBuilder(myAdt);
myAdt.Update(dt);

myComm.CommandText = " SET IDENTITY_INSERT t_MultipleSale OFF ";
myComm.ExecuteNonQuery();
}
tran.Commit();
return "";
}
catch (SqlException ex)
{
tran.Rollback();
if (ex.Number == 2627)
return "数据重复,请检查!!";
else
return ex.Message;
}
}


public DataSet GetDs(string strSQL)
{
SqlConnection con = new SqlConnection(GetConStr());
SqlDataAdapter adt = new SqlDataAdapter(strSQL, con);
DataSet ds = new DataSet();
adt.Fill(ds);
return ds;
// DataSet ds = SqlHelper.ExecuteDataset(GetConStr(), CommandType.Text, strSQL);
// return ds;
}
}
}
...全文
240 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
LGame 2015-03-07
  • 打赏
  • 举报
回复
用了,可以保持种子 SqlBulkCopy(con, SqlBulkCopyOptions.KeepIdentity, tran))
LGame 2015-01-14
  • 打赏
  • 举报
回复
因为需要让内部数据库和外部数据库的key一样!
  • 打赏
  • 举报
回复
Insert语句要传递自增主键干嘛,传递的100%报错 画蛇添足就是讲这事
kangkang08 2015-01-14
  • 打赏
  • 举报
回复
其实NewRow完全不需要指定自增ID(F_ID)值嘛,插入时会自己添加值的。 drNew["F_ID"] = 11; F_ID

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧