违反主键

时间:2015-01-27 00:04:39

标签: c# sql-server datagridview

我只能编辑一个数据,但是当我编辑两个数据时,他们会给我这个错误。我的主键是part_no。我也尝试使用

来反击我的part_no
  

(这只是突出错误的快捷方式)

var counter=1;
foreach (DataGridViewRow row in dataGridView1.Rows)
                {

                if (!row.IsNewRow)
                {
scmd.Parameters.AddWithValue("@c0", counter);
counter ++;
}
}

此代码也给我一个违规错误

  

(我的完整代码)

string date = dt_date.Value.ToString("yyyy-MM-dd");

        SqlConnection sc = new SqlConnection(ConfigurationManager.ConnectionStrings["POSdb"].ConnectionString);

            sc.Open();

            foreach (DataGridViewRow row in dataGridView1.Rows)
            {

            if (!row.IsNewRow)
            {

                    string strQry = "UPDATE CounterChecking "+
                    "SET part_no = @c0,po_no = @po_no,invoice = @invoice,part_name = @c1,"+
                    "date = @date,color = @c2,qty_ordered = @c3,qty_for_delivery = @c4,qty_recieved = @c5,"+
                    "variance = @c6,unit_price = @c7, total = @c8, remarks = @c9 "+
                    "WHERE po_no= '" + cb_po_search.Text + "'";
                    SqlCommand scmd = new SqlCommand(strQry, sc);
                    scmd.Parameters.AddWithValue("@c0", row.Cells[0].Value);

                    scmd.Parameters.Add("@po_no", SqlDbType.VarChar).Value = tb_ponumber2.Text;
                    scmd.Parameters.Add("@invoice", SqlDbType.VarChar).Value = tb_invoice2.Text;
                    scmd.Parameters.AddWithValue("@c1", row.Cells[1].Value);
                    scmd.Parameters.Add("@date", SqlDbType.Date).Value = date;
                    scmd.Parameters.AddWithValue("@c2", row.Cells[2].Value);
                    scmd.Parameters.AddWithValue("@c3", row.Cells[3].Value);
                    scmd.Parameters.AddWithValue("@c4", row.Cells[4].Value);
                    scmd.Parameters.AddWithValue("@c5", row.Cells[5].Value);
                    scmd.Parameters.AddWithValue("@c6", row.Cells[6].Value);
                    scmd.Parameters.AddWithValue("@c7", row.Cells[7].Value);
                    scmd.Parameters.AddWithValue("@c8", row.Cells[8].Value);
                    scmd.Parameters.AddWithValue("@c9", row.Cells[9].Value);
                    scmd.ExecuteNonQuery();
                    sc.Close();
                    MessageBox.Show("Successfully Updated!");}
            sc.Close();
        }
    }   

1 个答案:

答案 0 :(得分:2)

最明显的答案是你的WHERE子句返回多行。

此外,您将part_no指定为更新的一部分似乎很奇怪。您打算更改主键吗?根据列的不同,您很可能会多次分配相同的PK。那一栏是什么?

PS - 此代码对SQL注入攻击(cb_po_search)开放