-1

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

2 回答 2

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();
}

并调试到那个 catch 块 - 最后的allErrors字符串是什么?

更新:经过一次聊天,我们终于知道SQL异常中的消息是什么:

INSERT 语句与 CHECK 约束“CK_BarCode_Num”冲突。冲突发生在数据库“Parking”、表“dbo.TBL_Cards”、列“BarCode_Num”中。

现在我们正试图找出该约束是/做什么以及它被违反的原因......

于 2012-11-17T13:43:38.453 回答
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();
于 2012-11-17T13:44:40.957 回答