C#+ MySQL准备好的语句w/ON DUPLICATE KEY UPDATE问题

C#+ MySQL准备好的语句w/ON DUPLICATE KEY UPDATE问题

问题描述:

我有一个C#应用程序,它在MySQL中使用准备语句和ON DUPLICATE KEY UPDATE时遇到问题。C#+ MySQL准备好的语句w/ON DUPLICATE KEY UPDATE问题

当我在mypcmd.ExecuteNonQuery();之前的断点处检查连接变量时,mypcmd.IsPreparedfalse。 该查询不会执行任何操作(因为主键已经存在,所以应该更新),并且不会引发异常。 mypcmd.Parameters.count = 25,因为它应该是和如果我钻入数据视图的值是正确的。

当查询获得通过,0键更新为所有的参数名称(iefname:FNAME,中间名:中间名等,而不是精确值)

  • MySQL服务器版本5.0.51a -24 + lenny5
  • MySQL的C#组件版本(mysql.data.dll)6.3.6.0
  • 应用是WPF .NET 4.0

代码如下:

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查询中删除单引号。现在就像魅力一样。

激怒了这个问题的解决方法有多简单,希望这可以让别人无法理解我的头痛。