我有一个C#应用程序,它在使用带MySQL的ON DUPLICATE KEY UPDATE的预准备语句时遇到问题。
当我在之前的断点处检查连接变量时mypcmd.ExecuteNonQuery();,mypcmd.IsPrepared是false。该查询不执行任何操作(它应该更新,因为主键已经存在)并且没有引发异常。mypcmd.Parameters.count = 25如果我深入到数据视图中,则应该是正确的,并且值是正确的。
mypcmd.ExecuteNonQuery();
mypcmd.IsPrepared
false
mypcmd.Parameters.count = 25
查询通过时,键0将更新为所有参数名称(iefname:?fname,Middlename:?middlename等,而不是确切值)
代码如下:
const string sqlIpatients = @" INSERT INTO `tblpatients` ( `number`,`fname`,`middlename`,`surname`, `title`,`contactno`,`mobileno`,`sex`,`dob`, `housename`,`houseno`,`address1`,`address2`, `address3`,`address4`,`postcode`,`notes`,`home`, `sp1`,`sp2`,`sp3`,`sp4`,`sp5`,`sp6`,`email`) VALUES( '?number','?fname','?middlename','?surname', '?title','?contactno','?mobileno','?sex','?dob', '?housename','?houseno','?address1','?address2', '?address3','?address4','?postcode','?notes','?home', '?sp1','?sp2','?sp3','?sp4','?sp5','?sp6','?email') ON DUPLICATE KEY UPDATE `number`=VALUES(`number`), `fname`=VALUES(`fname`), `middlename`=VALUES(`middlename`), `surname`=VALUES(`surname`), `title`=VALUES(`title`), `contactno`=VALUES(`contactno`), `mobileno`=VALUES(`mobileno`), `sex`=VALUES(`sex`), `dob`=VALUES(`dob`), `housename`=VALUES(`housename`), `houseno`=VALUES(`houseno`), `address1`=VALUES(`address1`), `address2`=VALUES(`address2`), `address3`=VALUES(`address3`), `address4`=VALUES(`address4`), `postcode`=VALUES(`postcode`), `notes`=VALUES(`notes`), `home`=VALUES(`home`), `sp1`=VALUES(`sp1`), `sp2`=VALUES(`sp2`), `sp3`=VALUES(`sp3`), `sp4`=VALUES(`sp4`), `sp5`=VALUES(`sp5`), `sp6`=VALUES(`sp6`), `email`=VALUES(`email`)";
…
MySqlCommand mypcmd = new MySqlCommand(sqlIpatients, myConn2); mypcmd.Prepare(); mypcmd.Parameters.Add("?number", MySqlDbType.UInt32); mypcmd.Parameters.Add("?fname", MySqlDbType.VarChar, 20); mypcmd.Parameters.Add("?middlename", MySqlDbType.VarChar, 20); mypcmd.Parameters.Add("?surname", MySqlDbType.VarChar, 40); mypcmd.Parameters.Add("?title", MySqlDbType.VarChar, 6); mypcmd.Parameters.Add("?contactno", MySqlDbType.VarChar, 40); mypcmd.Parameters.Add("?mobileno", MySqlDbType.VarChar, 40); mypcmd.Parameters.Add("?sex", MySqlDbType.VarChar, 1); mypcmd.Parameters.Add("?dob", MySqlDbType.Date); mypcmd.Parameters.Add("?housename", MySqlDbType.VarChar, 20); mypcmd.Parameters.Add("?houseno", MySqlDbType.VarChar, 20); mypcmd.Parameters.Add("?address1", MySqlDbType.TinyText); mypcmd.Parameters.Add("?address2", MySqlDbType.TinyText); mypcmd.Parameters.Add("?address3", MySqlDbType.TinyText); mypcmd.Parameters.Add("?address4", MySqlDbType.TinyText); mypcmd.Parameters.Add("?postcode", MySqlDbType.TinyText); mypcmd.Parameters.Add("?notes", MySqlDbType.Text); mypcmd.Parameters.Add("?home", MySqlDbType.UInt16); mypcmd.Parameters.Add("?sp1", MySqlDbType.VarChar, 1); mypcmd.Parameters.Add("?sp2", MySqlDbType.VarChar, 1); mypcmd.Parameters.Add("?sp3", MySqlDbType.VarChar, 1); mypcmd.Parameters.Add("?sp4", MySqlDbType.VarChar, 1); mypcmd.Parameters.Add("?sp5", MySqlDbType.VarChar, 1); mypcmd.Parameters.Add("?sp6", MySqlDbType.VarChar, 1); mypcmd.Parameters.Add("?email", MySqlDbType.Text); var prodr = procmd.ExecuteReader(); while (prodr.Read()) { foreach (MySqlParameter p in mypcmd.Parameters) { p.Value = prodr[p.ParameterName.Replace("?", "")].ToString().Trim(); } } mypcmd.ExecuteNonQuery();
我想念什么?请帮忙!
刚刚发现问题所在。必须从SQL查询中删除单引号。现在就像魅力一样工作。
修复程序如此简单,这激怒了我,希望这可以使我免于头痛。