1

更新してみます

Company_name varchar(40) not null,
Product_unit varchar(20) not null,
Product_quantity int not null,
Product_Barcode varchar(100) null,
Product_expire_date datetime not null,
DurationBeforeWarningsInDays int not null,
DecreasingAmountBeforeWarningsInUnit int not null,
Product_Purchase_price float not null,
Product_Price float not null

私のデータベースの製品テーブルで、datagridviewセルからフィールド値を取得し、データベースで同等のものに変換しますが、この例外が見つかりました

(マルチパート識別子「m.Medicine_contraindications」をバインドできませんでした。)

私のプログラム実装cmd.ExecuteNonQuery(); ステートメントと私がこの理由がわからないとき

    private void Update_Click(object sender, EventArgs e)
    {

        string strconn = @"Server=.\SQLEXPRESS;initial catalog=PharmacyV2;integrated security=true;";
        SqlConnection conn = new SqlConnection(strconn);
        string mysql = " UPDATE  p set p.Company_name=@C_name,p.Product_unit=@unit,p.Product_quantity=@quantity,p.Product_Barcode=@Barcode,p.DecreasingAmountBeforeWarningsInUnit=@warningAmount,p.Product_expire_date=@EDate,p.DurationBeforeWarningsInDays=@warningTime,p.Product_Purchase_price=@P_price,p.Product_Price=@price ,m.Medicine_contraindications=@M_contr ,m.Medicine_sideEffects=@M_sid from Product p join Medicine m on p.Product_id=m.Product_id where p.Product_name=@name;";

        SqlCommand cmd = new SqlCommand(mysql, conn);
        conn.Open();
        for (int i = 0; i < dataGridView1.Rows.Count; i++)
        {
            cmd.Parameters.Add("@name", SqlDbType.NVarChar);
            cmd.Parameters["@name"].Value = dataGridView1.Rows[i].Cells[0].Value.ToString();

            cmd.Parameters.Add("@C_name", SqlDbType.NVarChar);
            cmd.Parameters["@C_name"].Value = dataGridView1.Rows[i].Cells[1].Value.ToString();

            cmd.Parameters.Add("@unit", SqlDbType.NVarChar);
            cmd.Parameters["@unit"].Value = dataGridView1.Rows[i].Cells[2].Value.ToString();

            cmd.Parameters.Add("@quantity", SqlDbType.Int);
            cmd.Parameters["@quantity"].Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[3].Value);

            cmd.Parameters.Add("@Barcode", SqlDbType.NVarChar);
            cmd.Parameters["@Barcode"].Value = dataGridView1.Rows[i].Cells[4].Value.ToString();


            cmd.Parameters.Add("@warningAmount", SqlDbType.Int);
            cmd.Parameters["@warningAmount"].Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[5].Value);

            cmd.Parameters.Add("@EDate", SqlDbType.DateTime);
            cmd.Parameters["@EDate"].Value = Convert.ToDateTime(dataGridView1.Rows[i].Cells[6].Value);

            cmd.Parameters.Add("@warningTime", SqlDbType.Int);
            cmd.Parameters["@warningTime"].Value = Convert.ToInt32(dataGridView1.Rows[i].Cells[7].Value);


            cmd.Parameters.Add("@P_price", SqlDbType.Decimal);
            cmd.Parameters["@P_price"].Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells[8].Value);

            cmd.Parameters.Add("@price", SqlDbType.Decimal);
            cmd.Parameters["@price"].Value = Convert.ToDecimal(dataGridView1.Rows[i].Cells[9].Value);

            ArrayList arr = new ArrayList();
            arr.Add(TextBox1.Text);

            ArrayList arr1 = new ArrayList();
            arr1.Add(TextBox2.Text);

            cmd.Parameters.AddWithValue("@M_contr",Convert.ToString(arr1));



            cmd.Parameters.AddWithValue("@M_sid", Convert.ToString(arr));

            cmd.ExecuteNonQuery();
4

2 に答える 2

0

1 つの update ステートメントで 2 つのテーブルを更新しようとしています。分割two update statementsして 2 つの update ステートメントを に入れる必要one Transactionがあります。エラーが発生した場合にトランザクション全体をロールバックできるため、データが半分完了した状態のままになることはありません。 . あなたはこのようなことをすることができます

BEGIN TRANSACTION

UPDATE p 
          set p.Company_name=@C_name,
              p.Product_unit=@unit,
              p.Product_quantity=@quantity,
              p.Product_Barcode=@Barcode,
              p.DecreasingAmountBeforeWarningsInUnit=@warningAmount,
              p.Product_expire_date=@EDate,
              p.DurationBeforeWarningsInDays=@warningTime,
              p.Product_Purchase_price=@P_price,
              p.Product_Price=@price 

from Product p join Medicine m 
on p.Product_id=m.Product_id 
where p.Product_name=@name;



UPDATE m 
          set m.Medicine_contraindications=@M_contr ,
              m.Medicine_sideEffects=@M_sid 
from Product p join Medicine m 
on p.Product_id=m.Product_id 
where p.Product_name=@name;

COMMIT TRANSACTION
于 2013-11-02T22:02:11.807 に答える