我终于解决了一个问题,但现在又有了另一个问题。我发现了如何获取我的选择器所在的当前字段的名称,但现在当我想使用更新命令时,它们不会让我设置参数。下面是一些代码...
private void dgv_DataLookup_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
DialogResult dr;
dr = MessageBox.Show("Are you sure you want to edit this field?", "Edit Cell", MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes)
{
string myCell = dgv_DataLookup.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
string myIndex = dgv_DataLookup.CurrentCell.OwningRow.Cells[6].Value.ToString();
string myColumn = dgv_DataLookup.CurrentCell.OwningColumn.HeaderCell.Value.ToString();
myColumn.Trim();
da.UpdateCommand = new OleDbCommand("UPDATE tbl_Orders SET @myColumn = @myCell WHERE oid = @myIndex", cs);
da.UpdateCommand.Parameters.Add("@myColumn", OleDbType.VarChar).Value = myColumn;
da.UpdateCommand.Parameters.Add("@myCell", OleDbType.VarChar).Value = myCell;
da.UpdateCommand.Parameters.Add("@myIndex", OleDbType.Integer).Value = myIndex;
cs_Execute("UPDATE");
}
}
当我将myColumn更改为实际列时,比如itemNum,它可以正常工作。但是,错误是无法更新'@myColumn';字段不可更新
我还有一个消息框显示myColumn的值,它是正确的值。我只是想知道这是否合法,为参数设置一个参数。如果没有,那么我只需要更新所有行。谢谢!
P.S。 cd_Execute就像cs.Open()da.UpdateCommand.ExecuteNonQuery()cs.Close()
答案 0 :(得分:1)
参数化查询中不能包含动态列名。您需要诉诸dynamic SQL。
虽然可以使用SQL Injection:
,但您可以按照自己的意愿行事da.UpdateCommand = new OleDbCommand(string.Format("UPDATE tbl_Orders SET {0} = @myCell WHERE oid = @myIndex", myColumn), cs);