-1

私のデータベースはSQLServerにあり、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 に答える