我的数据库在SQL Server中,我使用Linq-to-SQL。我用SP(保存卡)。
我把断点放在我的代码中,到达rdr = cmm.ExecuteReader();
时让我异常!!!
private void btnSave_Click(object sender, EventArgs e)
{
PersianCalendar jc = new PersianCalendar();
string SaveDate = jc.GetYear(DateTime.Now).ToString();
int from=Convert.ToInt32(txt_barcode_f.Text);
int to=Convert.ToInt32(txt_barcode_t .Text);
int quantity=Convert.ToInt32(to-from);
int card_Type_ID=Convert.ToInt32(cmb_BracodeType .SelectedValue);
int[] arrCardNum = new int[quantity];
arrCardNum[0]=from;
for (int i = from; i < to;i++ )
{
for(int j=0; j<quantity ;j++)
{
arrCardNum[j]=from+j;
int r = arrCardNum[j];
sp.SaveCards(r, 2, card_Type_ID, SaveDate, 2);
}
}
}
public void SaveCards(int Barcode_Num, int Card_Status_ID, int Card_Type_ID, string Save_Date, int Save_User_ID)
{
IDbCommand cmm;
cmm = Linq.Connection.CreateCommand();
try
{
cmm.Parameters.Add(new SqlParameter("@Barcode_Num", Barcode_Num));
cmm.Parameters.Add(new SqlParameter("@Card_Status_ID", 2));
cmm.Parameters.Add(new SqlParameter("@Card_Type_ID", Card_Type_ID));
cmm.Parameters.Add(new SqlParameter("@SaveDate", Save_Date));
cmm.Parameters.Add(new SqlParameter("@Save_User_ID", Save_User_ID));
cmm.CommandText = "SaveCards";
cmm.Connection.Open();
cmm.Connection = Linq.Connection;
cmm.CommandType = CommandType.StoredProcedure;
IDataReader rdr = null;
**rdr = cmm.ExecuteReader();**
while (rdr.Read())
{
Console.Write(" All Insert ! " + "\n");
}
}
catch (SqlException ex)
{
SqlExceptionHandler(ex, Save_User_ID);
}
catch (Exception ex)
{
PopularEexceptionHandler(ex, Save_User_ID);
}
finally
{ cmm.Connection.Close(); }
}
当执行sp时,显示无结果并显示:
when execute sp , display this:The INSERT statement conflicted with the CHECK constraint "CK_BarCode_Num". The conflict occurred in database "Parking", table "dbo.TBL_Cards", column 'BarCode_Num'. The statement has been terminated. No rows affected. (0 row(s) returned) @RETURN_VALUE = -6
答案 0 :(得分:0)
关于如何设置连接和命令,你有点混乱..... 打开连接之前你甚至分配了它!这是怎么回事?
我的建议是这个订单(根据原则首先执行所有设置 打开连接,然后尽可能晚地打开连接,尽快关闭):
IDbCommand cmm = Linq.Connection.CreateCommand();
try
{
// define name and type of command
cmm.CommandText = "SaveCards";
cmm.CommandType = CommandType.StoredProcedure;
// assign connection
cmm.Connection = Linq.Connection;
// define parameters
cmm.Parameters.Add(new SqlParameter("@Barcode_Num", Barcode_Num));
cmm.Parameters.Add(new SqlParameter("@Card_Status_ID", 2));
cmm.Parameters.Add(new SqlParameter("@Card_Type_ID", Card_Type_ID));
cmm.Parameters.Add(new SqlParameter("@SaveDate", Save_Date));
cmm.Parameters.Add(new SqlParameter("@Save_User_ID", Save_User_ID));
// only now - after all the setup - open the connection, read the data
cmm.Connection.Open();
IDataReader rdr = rdr = cmm.ExecuteReader();
while (rdr.Read())
{
....
}
}
要捕获执行引发的错误,请将catch
SqlException
块替换为catch (SqlException ex)
{
StringBuilder sbErrors = new StringBuilder();
foreach (SqlError error in ex.Errors)
{
sbErrors.AppendLine(error.Message);
}
string allErrors = sbErrors.ToString();
}
:
allErrors
并调试到该catch块 - 最后的{{1}}字符串是什么?
聊天会话后更新:,我们终于知道SQL异常中的消息是什么:
INSERT语句与CHECK约束“CK_BarCode_Num”冲突。冲突发生在数据库“Parking”,表“dbo.TBL_Cards”,列'BarCode_Num'。
现在我们正试图找出这个约束是什么/做什么以及它被违反的原因....
答案 1 :(得分:0)
我认为在执行阅读器之前你可能有open the connection and assigning another connection
。
cmm.CommandText = "SaveCards";
//cmm.Connection.Open(); You should open the connection after assigning it
cmm.Connection = Linq.Connection;
cmm.CommandType = CommandType.StoredProcedure;
cmm.Connection.Open(); //Open it here
SqlDataReader rdr = cmm.ExecuteReader();