你好我创建了一个程序,可以添加/编辑/删除数据库中的数据 我已经完成了添加数据流程但我的问题是我无法执行编辑和删除数据。 每当我点击按钮编辑出现错误信息
这是错误消息:
“不支持UpdateCommand的动态SQL生成,而不支持不返回任何键列信息的SelectedCommand”
这是我的按钮编辑代码
try
{
string contactNumVal = txtCcontact.Text;
if (contactNumVal.Length < 11)
{
MessageBox.Show("The Contact Number must have 11 digit");
}
else
{
DialogResult dw;
dw = MessageBox.Show("Are you sure you want to Edit this data", "Confirm Deletion", MessageBoxButtons.YesNo);
if (dw == DialogResult.Yes)
{
string MyConString = "SERVER=localhost;" +
"DATABASE=prototype_db;" +
"UID=root;";
MySqlConnection connection = new MySqlConnection(MyConString);
connection.Open();
MySqlCommand command = connection.CreateCommand();
DataTable dt = new DataTable();
MySqlDataAdapter da = new MySqlDataAdapter("Select ClientName,ClientAddress,ClientContactNo,ClientContactPerson from client_profile where ClientName like '%"+txtCname.Text+"%'" +" ",connection);
da.Fill(dt);
dt.Rows[0].BeginEdit();
dt.Rows[0][0] = txtCname.Text;
dt.Rows[0][1] = txtCaddress.Text;
dt.Rows[0][2] = txtCcontact.Text;
dt.Rows[0][3] = txtCconPer.Text;
dt.Rows[0].EndEdit();
MySqlCommandBuilder cb = new MySqlCommandBuilder(da);
da.Update(dt);
connection.Close();
MessageBox.Show("Data is now updated");
}
}
}
catch (Exception error)
{
MessageBox.Show(error.ToString());
}
感谢答案
答案 0 :(得分:0)
如果您希望DataAdapter能够执行UPDATE和DELETE(SELECT和INSERT没有问题),那么DataAdapter需要获取有关表的主键的信息,但是由于Client_ID,您的查询不会返回此信息字段未包含在命令文本中
因此,您应该将代码更改为
using(MySqlConnection connection = new MySqlConnection(MyConString))
{
connection.Open();
DataTable dt = new DataTable();
using(MySqlDataAdapter da = new MySqlDataAdapter("Select Client_ID, ClientName, " +
"ClientAddress, ClientContactNo,ClientContactPerson " +
"from client_profile where ClientName like @cname",connection))
{
da.SelectCommand.Parameters.AddWithValue("@cname", "%" + txtCname.Text +"%");
da.Fill(dt);
}
}
另请注意,我已删除了WHERE条件中使用的ClientName值的字符串连接。在构建sql命令时,始终使用参数而不是用户直接键入的文本。这样就可以避免SQL注入问题和解析问题(txtCName文本框中的单引号会破坏字符串连接)
如上所述添加Client_ID后,您还应更改用于更新行值的索引
dt.Rows[0][1] = txtCname.Text;
dt.Rows[0][2] = txtCaddress.Text;
dt.Rows[0][3] = txtCcontact.Text;
dt.Rows[0][4] = txtCconPer.Text;