【问题标题】:MySQL / ASP.NET Stored ProceduresMySQL / ASP.NET 存储过程
【发布时间】:2011-05-22 10:50:30
【问题描述】:

希望这不是ServerFault 问题...

我正在努力将项目从以 XML 序列化存储数据迁移到 MySQL 数据库。我正在使用昨天回答的previous question 提供的示例。

使用 phpMyAdmin 和 MySQL Workbench 进行连接 我创建了一个名为“sprocOrderSelectSingleItem”的存储过程。据我所知,它似乎与 MySQL 配合得很好。当我运行 SHOW CREATE PROCEDURE sprocOrderSelectSingleItem 它返回以下内容:

CREATE DEFINER=username@% PROCEDURE sprocOrderSelectSingleItem(IN orderID INTEGER) BEGIN SELECT * FROM tblOrders WHERE ID=orderID; END

我的协作 ASP.NET 代码如下所示:

public static Order GetItem(int ID) { 订单 objOrder = null; 使用 (OdbcConnection objConnection = new OdbcConnection(Utils.ApplicationConfiguration.ConnectionString)) { OdbcCommand objCommand = new OdbcCommand("sprocOrderSelectSingleItem", objConnection); objCommand.CommandType = CommandType.StoredProcedure; objCommand.Parameters.AddWithValue("orderID", ID); objConnection.Open(); 使用(OdbcDataReader objReader = objCommand.ExecuteReader()) { 如果(objReader.Read()) { objOrder = FillDataRecord(objReader); } objReader.Close(); } objConnection.Close(); } 返回对象订单; }

当我查看页面时,我收到以下错误消息:

ERROR [42000] [MySQL][ODBC 5.1 Driver][mysqld-5.0.77]您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“sprocOrderSelectSingleItem”附近使用正确的语法

真的没有意识到可能丢失或出错的地方。我应该/可以运行任何其他测试来确认 MySQL 方面的工作是否正常?我是否错过了在 ASP.NET 中正确传递存储过程调用的步骤?代码在以下行中断:

使用 (OdbcDataReader objReader = objCommand.ExecuteReader())

换行

OdbcCommand objCommand = new OdbcCommand("sprocOrderSelectSingleItem", objConnection);

用这个代替

OdbcCommand objCommand = new OdbcCommand("SELECT * FROM tblOrders WHERE ID=" + ID + ";", objConnection);

一切都按预期进行。

感谢你们提供的任何帮助。

【问题讨论】:

  • 更好的标题应该是 ASP.NET / MySQL 存储过程。我现在明白阅读障碍的危害了。我很抱歉。

标签: asp.net mysql stored-procedures


【解决方案1】:

您可以使用 ID 参数直接在 Mysql 中的 sprocOrderSelectSingleItem 上运行执行。 它将显示您的 StoredProc 运行正确。

这是调用存储过程的 C# 示例代码。

OdbcCommand salesCMD = new OdbcCommand("{ CALL SalesByCategory(?) }", nwindConn);
salesCMD.CommandType = CommandType.StoredProcedure;

OdbcParameter myParm = salesCMD.Parameters.Add("@CategoryName", OdbcType.VarChar, 15);
myParm.Value = "Beverages";

OdbcDataReader myReader = salesCMD.ExecuteReader();

查看 OdbcCommand 中的“调用”和“?”用于稍后提供值的参数。

【讨论】:

  • 我现在在使用您的方法时收到此错误消息:ERROR [HY000] [MySQL][ODBC 5.1 Driver][mysqld-5.0.77]Thread stack overrun: 4120 bytes used of a 131072 byte stack , 并且需要 131072 字节。使用 'mysqld -O thread_stack=#' 指定更大的堆栈。
  • 新的错误似乎和这个链接有关:bugs.mysql.com/bug.php?id=15629。现在看来是服务器问题。感谢您的帮助!
【解决方案2】:

你能试试下面的方法吗:

OdbcCommand cmd = new OdbcCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "{call LoadCustCliOrders(?,?,?,?)}";

    cmd.Parameters.Add("CUST_ID",OdbcType.Int);
    cmd.Parameters.Add("CLIENT_ID",OdbcType.Int);
    cmd.Parameters.Add("DATE_FROM",OdbcType.Date);
    cmd.Parameters.Add("DATE_TO",OdbcType.Date);

...

    cmd.Parameters["CUST_ID"].Value = _CustId;
    cmd.Parameters["CLIENT_ID"].Value =  _ClientId;
    cmd.Parameters["DATE_FROM"].Value = _DateFrom;
    cmd.Parameters["DATE_TO"].Value = _DateTo;

    cmd.ExecuteReader 

【讨论】:

  • 我现在在使用您的方法时收到此错误消息:ERROR [HY000] [MySQL][ODBC 5.1 Driver][mysqld-5.0.77]Thread stack overrun: 4120 bytes used of a 131072 byte stack , 并且需要 131072 字节。使用 'mysqld -O thread_stack=#' 指定更大的堆栈
  • 新的错误似乎和这个链接有关:bugs.mysql.com/bug.php?id=15629。现在看来是服务器问题。感谢您的帮助!
  • 请增加线程栈并重试。将其设为 256K 并尝试一下。
【解决方案3】:

您确定使用相同的用户名或具有相同访问权限的用户吗? 我认为您需要在存储过程之前添加单词“CALL”。 应该是 CALL sprocOrderSelectSingleItem 并尝试。

【讨论】:

  • 我已经验证了帐户和权限。我错过了 CALL 关键字。现在很明显了。
猜你喜欢
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2017-04-26
  • 2011-03-09
  • 2011-03-31
相关资源
最近更新 更多