SqlDataAdapter批量插入的主键冲突异常

时间:2009-12-14 21:39:35

标签: c# sql-server-2005

我有一个WinForm 2.0应用程序,它使用标准的DataGridView控件来允许插入,更新和删除。

我正在通过SqlDataAdapter批量插入功能实现批量插入,但是我正在尝试插入我的表的主键约束违规。

  

违反PRIMARY KEY约束   'PK_tblLIDCustomersAddresses'。
无法   在对象中插入重复键   'tblLIDCustomersAddresses'

以下是实现此目的的代码:

我可能遗漏了一些简单的东西,但如果有人有解决方案,请回复。

提前致谢!

StringBuilder insertSQL = new StringBuilder();
insertSQL.Append("INSERT INTO tblLIDCustomersAddresses(");
insertSQL.Append("lngLIDCustomerID,strAddressType,strCustomerAddress,strCustomerLocation,");
insertSQL.Append("strCustomerStreetName,strCustomerSuite,strCustomerStreetTypes,");
insertSQL.Append("strCustomerCity,strCustomerState,strCustomerZip,dtmUpdated,strUserUpdated)");
insertSQL.Append("VALUES(@lngLIDCustomerID,@strAddressType,@strCustomerAddress,");
insertSQL.Append("@strCustomerLocation,@strCustomerStreetName,");
insertSQL.Append("@strCustomerSuite,@strCustomerStreetTypes,@strCustomerCity,");
insertSQL.Append("@strCustomerState,@strCustomerZip,@dtmUpdated,@strUserUpdated)");
insertSQL.AppendLine("SET @CustomerAddressID = SCOPE_IDENTITY()");

using (SqlConnection cn = Utilities.CreateSQLConnection(Properties.Settings.Default.DBConnection))
{
    da = new SqlDataAdapter();
    da.InsertCommand = new SqlCommand(insertSQL.ToString(), cn);
    da.InsertCommand.Parameters.Add("@lngLIDCustomerID", SqlDbType.Int, 4, "lngLIDCustomerID");
    da.InsertCommand.Parameters.Add("@strAddressType", SqlDbType.VarChar, 20, "strAddressType");
    da.InsertCommand.Parameters.Add("@strCustomerAddress", SqlDbType.VarChar, 25, "strCustomerAddress");
    da.InsertCommand.Parameters.Add("@strCustomerLocation", SqlDbType.VarChar, 2, "strCustomerLocation");
    da.InsertCommand.Parameters.Add("@strCustomerStreetName", SqlDbType.VarChar, 50, "strCustomerStreetName");
    da.InsertCommand.Parameters.Add("@strCustomerSuite", SqlDbType.VarChar, 10, "strCustomerSuite");
    da.InsertCommand.Parameters.Add("@strCustomerStreetTypes", SqlDbType.VarChar, 4, "strCustomerStreetTypes");
    da.InsertCommand.Parameters.Add("@strCustomerCity", SqlDbType.VarChar, 35, "strCustomerCity");
    da.InsertCommand.Parameters.Add("@strCustomerState", SqlDbType.VarChar, 2, "strCustomerState");
    da.InsertCommand.Parameters.Add("@strCustomerZip", SqlDbType.VarChar, 10, "strCustomerZip");
    da.InsertCommand.Parameters.AddWithValue("@dtmUpdated", DateTime.Now.ToString());
    da.InsertCommand.Parameters.AddWithValue("@strUserUpdated", this._user.Name);
    da.InsertCommand.Parameters.Add("@CustomerAddressID", SqlDbType.Int, 4, "CustomerAddressID");
    da.InsertCommand.Parameters["@CustomerAddressID"].Direction = ParameterDirection.Output;                    
    da.InsertCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
    da.UpdateBatchSize = 0; // set batch size to maximum value possible
    da.Update(addressChanges);
}

2 个答案:

答案 0 :(得分:0)

我会在运行您的应用程序之前仔细检查您的表格 - 是否已经有一些数据可能会尝试再次单独插入?通常就是这种情况。 现在,如果您知道将来有时会出现重复,您可以捕获错误并忽略它或对这些值执行某些操作。

答案 1 :(得分:0)

感谢您的回复。你的回答让我思考SQL Server真正抱怨的是什么。

我检查了tblLIDCustomersAddresses表的主键约束定义,约束是lngLIDCustomerID和strAddressType字段的组合。

如果您尝试使用相同的“地址类型”值从DataGridView控件中再插入两行,您确实会遇到主键约束违规。

一直以来,我一直认为使用Scope_Identity()函数存在一些问题,但它确实是主键约束定义,这是罪魁祸首。

再次感谢...