在Linq-to-SQL中添加到数据库时获取异常

时间:2012-11-17 13:28:54

标签: c# sql sql-server winforms linq-to-sql

我的数据库在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

2 个答案:

答案 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();