C# + MySQL prepared statement w/ON DUPLICATE KEY UPDATE 问题

标签 c# sql mysql

我有一个 C# 应用程序在使用带有 ON DUPLICATE KEY UPDATE 到 MySQL 的准备好的语句时遇到问题。

当我在 mypcmd.ExecuteNonQuery(); 之前的断点处检查连接变量时,mypcmd.IsPreparedfalse。 查询不执行任何操作(它应该更新,因为主键已经存在)并且没有抛出异常。 mypcmd.Parameters.count = 25 它应该是这样的,如果我深入到数据 View 中,这些值是正确的。

当查询通过时,键 0 被更新为所有参数名称(即 fname:?fname,中间名:?middlename 等,而不是精确值)

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

对修复的简单性感到恼火,希望这能让其他人免于我的头痛。

关于C# + MySQL prepared statement w/ON DUPLICATE KEY UPDATE 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5459755/

相关文章:

mysql - 导入到 hdfs 时出现 Sqoop 错误

sql - MySQL bool 全文搜索中的 "Show all except"

java - 在 H2 插入语句中转义完整字符串

php - 我们可以让 Flex-LAMP 应用程序在 Android 上运行吗

c# - 如何绑定(bind)到 Silverlight 中的页面属性?

C# 多线程——无需控件即可调用

c# - Kusto 客户端无法向服务 : Request headers must contain only ASCII characters 发送请求

c# - 将 DataTable(动态列)转换为 List<T>

MySQL - 无法在左连接和 2 个不同的选择范围内检索最大值

mysql - 从 where 子句中使用的表中删除