【问题标题】:Named parameters order has sense for MySql .Net data provider?命名参数顺序对 MySql .Net 数据提供者有意义吗?
【发布时间】:2010-07-14 10:23:48
【问题描述】:

我发现在我的项目中命名参数的顺序是有意义的。

我调用这个过程

CREATE PROCEDURE `test`.`TestProc` (
in myText varchar (5),
in myText2 varchar (100)
)
BEGIN

END

如果我添加这样的参数:

    command.CommandText = "testProc";
    command.CommandType = System.Data.CommandType.StoredProcedure;
    command.Parameters.AddWithValue("myText2", "aaaaaaaaaaaaaaaaa");
    command.Parameters.AddWithValue("myText", "bbbb");

我收到“数据太长”异常。我也无法在测试项目中重现这个。

有什么想法吗?


我找到了原因。看起来像 MySql .Nat 数据提供程序中的错误。 要重现错误,您需要不在 root 用户下调用它。

结论:MySql.Data 版本 6.2.3.0。 如果您使用非 root 数据库帐户调用过程,则命名参数的顺序是有意义的

【问题讨论】:

    标签: c# .net mysql


    【解决方案1】:

    参数的名称不必匹配列而是占位符:

    INSERT INTO testproc (mytext, mytext2) VALUES (?mytext, ?mytext2)
    

    我想如果你使用未命名的参数:

    INSERT INTO testproc (mytext, mytext2) VALUES (?, ?)
    

    顺序确实很重要。

    我总是使用前一个选项,但是:

    command.Parameters.Add("?mytext2", "aaaaaaaaaaaaaaaaa")
    command.Parameters.Add("?mytext", "bbbb")
    

    不知道对 AddWithValue() 有没有影响

    更新:刚刚注意到您的参数缺少问号。那将是问题所在。为您的查询和参数添加一个问号。

    【讨论】:

    • 我不向查询文本添加参数。我刚刚编辑了我的代码以显示我如何调用过程。
    • 对不起,我没有对你的第一个 sql 位给予足够的关注。它看起来像一个 create table 语句,所以我以为你想查询一些东西;)
    【解决方案2】:

    我从 MySql bugtracker 得到的答案:

    雷吉·伯内特

    我不认为这是一个错误。我 相信你的测试用户没有 privs 来查看 proc 的主体。 请使用以下方式登录 MySQL 命令行客户端和测试用户 帐户。执行“显示创建过程” 在你的过程中。如果身体是空的,你 需要使用“使用功能 body=false" 选项并传入 参数顺序正确。

    【讨论】:

      【解决方案3】:

      MySQL 驱动程序不支持命名参数。参数的名称将被忽略,并按照您将它们放入参数集合中的顺序应用它们。

      【讨论】:

      • @Orsol:驱动程序之间可能存在差异。测试项目中是否使用相同的数据库服务器、相同的驱动程序和相同的连接方式?
      • 都一样。数据库不一样,但我觉得没关系
      猜你喜欢
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2012-01-25
      • 2011-04-28
      • 1970-01-01
      • 2015-09-07
      相关资源
      最近更新 更多