【问题标题】:Get exception when add to database in Linq-to-SQL在 Linq-to-SQL 中添加到数据库时出现异常
【发布时间】:2012-11-17 13:28:53
【问题描述】:

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

【问题讨论】:

  • 还是给我个例外吧!!!它是:“Sql Exception was cugth”

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


【解决方案1】:

您在如何设置连接和命令方面有点混乱......例如你打开连接之前你甚至分配它!这将如何运作??

我的建议是这个顺序(基于原则首先在打开连接之前完成所有设置,然后尽可能晚地打开连接,尽快关闭它):

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”中。

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

【讨论】:

  • 转到:catch (SqlException ex) { SqlExceptionHandler(ex, Save_User_ID); }
  • in line:"IDataReader rdr = rdr = cmm.ExecuteReader();"给予例外
  • 我说什么来解决我的问题?
  • 可能是存储过程的问题?
  • ok.in 查看详细异常:Data:{System.Collections.ListDictionaryInternal}---Errors:{System.Data.SqlClient.SqlErrorCollection}-----Source:.Net SqlClient Data提供者
【解决方案2】:

我认为可能是您在执行阅读器之前拥有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();

【讨论】:

  • in line:"IDataReader rdr = rdr = cmm.ExecuteReader();"给予例外
  • 执行 sp 时,显示如下:INSERT 语句与 CHECK 约束“CK_BarCode_Num”冲突。冲突发生在数据库“Parking”、表“dbo.TBL_Cards”、列“BarCode_Num”中。该语句已终止。没有行受到影响。 (0 行返回)@RETURN_VALUE = -6
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多