SQL 添加主键时出错
SQL Error when adding primary key
当我尝试添加新记录并因此添加主键时,出现错误:
System.Data.SqlClient.SqlException occurred
HResult=0x80131904
Message=Violation of PRIMARY KEY constraint 'PK__Stock__BEAEB27A2652D17F'. Cannot insert duplicate key in object 'dbo.Stock'. The duplicate key value is (39).
我确定当前的记录总数是 38。主键是从一个数组中添加的,数组中的数字都在 39-44 之间。
我附上了下面的代码:
int y = 0;
SqlCommand orderCommand3 = new SqlCommand();
string conString3 = Properties.Settings.Default.DatabaseEventsUnlimitedConnectionString;
using (SqlConnection connection3 = new SqlConnection(conString3))
{
connection3.Open();
while (ArrayCourseName[y] != "" && y <=5)
{
SqlCommand commandEvent = new SqlCommand("INSERT INTO STOCK (IngredientID, IngredientName, StorageType, QuantityInStock, MinimumRequired) VALUES (@p1, @p2, @p3, @p4, @p5)", connection3);
commandEvent.Parameters.AddWithValue("@p1", ArrayIngredientID[y]);
commandEvent.Parameters.AddWithValue("@p2", ArrayCourseName[y]);
commandEvent.Parameters.AddWithValue("@p3", ArrayStorage[y]);
commandEvent.Parameters.AddWithValue("@p4", ArrayQuantity[y]);
commandEvent.Parameters.AddWithValue("@p5", ArrayMinimum[y]);
int m = commandEvent.ExecuteNonQuery();
if (m != 1)
{
throw new Exception("Too many records changed");
}
i++;
}
connection3.Close();
}
在您的代码中,您需要增加 y
而不是 i
的值,因为您使用 y
作为索引值。
我建议您使用 for
循环将降低代码的复杂性
for(int i=0;i<=5;i++) {
if(string.IsNullOrWhiteSpace(ArrayCourseName[i] ))
break;
///rest of the code
using (SqlConnection connection3 = new SqlConnection(conString3))
{
connection3.Open();
// code for sql non execute
}
}
我建议您每次都使用 using
连接并创建连接对象,因为连接池每次都会处理池化连接对象。
参考:Is it better to execute many sql commands with one connection, or reconnect every time?
当我尝试添加新记录并因此添加主键时,出现错误:
System.Data.SqlClient.SqlException occurred
HResult=0x80131904
Message=Violation of PRIMARY KEY constraint 'PK__Stock__BEAEB27A2652D17F'. Cannot insert duplicate key in object 'dbo.Stock'. The duplicate key value is (39).
我确定当前的记录总数是 38。主键是从一个数组中添加的,数组中的数字都在 39-44 之间。
我附上了下面的代码:
int y = 0;
SqlCommand orderCommand3 = new SqlCommand();
string conString3 = Properties.Settings.Default.DatabaseEventsUnlimitedConnectionString;
using (SqlConnection connection3 = new SqlConnection(conString3))
{
connection3.Open();
while (ArrayCourseName[y] != "" && y <=5)
{
SqlCommand commandEvent = new SqlCommand("INSERT INTO STOCK (IngredientID, IngredientName, StorageType, QuantityInStock, MinimumRequired) VALUES (@p1, @p2, @p3, @p4, @p5)", connection3);
commandEvent.Parameters.AddWithValue("@p1", ArrayIngredientID[y]);
commandEvent.Parameters.AddWithValue("@p2", ArrayCourseName[y]);
commandEvent.Parameters.AddWithValue("@p3", ArrayStorage[y]);
commandEvent.Parameters.AddWithValue("@p4", ArrayQuantity[y]);
commandEvent.Parameters.AddWithValue("@p5", ArrayMinimum[y]);
int m = commandEvent.ExecuteNonQuery();
if (m != 1)
{
throw new Exception("Too many records changed");
}
i++;
}
connection3.Close();
}
在您的代码中,您需要增加 y
而不是 i
的值,因为您使用 y
作为索引值。
我建议您使用 for
循环将降低代码的复杂性
for(int i=0;i<=5;i++) {
if(string.IsNullOrWhiteSpace(ArrayCourseName[i] ))
break;
///rest of the code
using (SqlConnection connection3 = new SqlConnection(conString3))
{
connection3.Open();
// code for sql non execute
}
}
我建议您每次都使用 using
连接并创建连接对象,因为连接池每次都会处理池化连接对象。
参考:Is it better to execute many sql commands with one connection, or reconnect every time?