2012-08-02 49 views
1

我是一个全新的存储过程,所以我可能会错过一些容易的事情,但我研究了基础知识,并且我试图从vb.net代码中整合它。我创建了一个简单的存储过程(我认为),只运行数据对今天的结果的查询:VB.net到MySql存储过程错误


- 常规DDL - 注意:评论之前和日常身体后会不会被存储服务器


DELIMITER $$ 

CREATE DEFINER=`root`@`%` PROCEDURE `GetRuntestToday`() 
BEGIN 

Select * From runtest.runtest_records where 
Test_Date=CURDATE() 
order by test_date desc, Convert(test_time_stop,DECIMAL(5,2)) desc; 

END 

当我登录到主MySql数据库并尝试从MySQL提示符下运行它,它似乎很好地工作。我只需键入call runtest.GetRuntestToday();并以命令提示符文本格式返回59行数据。

我写了一个VB.net程序来试图获得相同的数据,但我不断收到错误。错误异常详细信息如下:

System.Data.Odbc.OdbcException was unhandled 
    ErrorCode=-2146232009 
    Message="ERROR [42000] [MySQL][ODBC 5.1 Driver][mysqld-5.1.51-community-log]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GetRuntestToday' at line 1" 
    Source="myodbc5.dll" 
    StackTrace: 
     at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode) 
     at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod) 
     at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader) 
     at System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior) 
     at System.Data.Odbc.OdbcCommand.ExecuteReader() 
     at MySqlHelper.mMain.DoMyStoredProcedure() in C:\vss\MySqlHelper\MySqlHelper\mMain.vb:line 2642 
     at MySqlHelper.mMain.Main() in C:\vss\MySqlHelper\MySqlHelper\mMain.vb:line 29 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 

我运行的代码是:

Public Sub DoMyStoredProcedure() 

    Dim MyConString As String = "My String Details" 
    Dim dbcRuntest As New OdbcConnection(MyConString) 


    Dim cmd As New OdbcCommand 
    Dim reader As OdbcDataReader 

    cmd.CommandText = "GetRuntestToday" 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.Connection = dbcRuntest 

    dbcRuntest.Open() 

    reader = cmd.ExecuteReader() 

    dbcRuntest.Close() 
End Sub 

错误发生就行了:

reader = cmd.ExecuteReader() 

我缺少什么?我没有看到任何语法问题,并且存储过程在命令提示符下工作。我用DELIMITER做了一些改动//而不是$$,但似乎没有解决它的问题。

+0

为什么你使用obdc而不是正确的连接器为.net从MySQL?你可以使用它来调用一个过程。 cmd.CommandType = CommandType.StoredProcedure; http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-stored.html – 2012-08-02 19:28:07

回答

2

你可以试着改变直接调用(我没有测试过这一点:

cmd.CommandType = CommandType.Text 
cmd.CommandText = "CALL GetRuntestToday" 

此外,编写代码的一种更好的方式:

Dim MyConString As String = "My String Details" 
Using dbcRuntest As New OdbcConnection(MyConString) 
    dbcRuntest.Open() 
    Using cmd As New OdbcCommand("CALL GetRuntestToday", dbcRuntest) 
    cmd.CommandType = CommandType.Text 
    Using reader As OdbcDataReader = cmd.ExecuteReader 
     'do someting with reader' 
    End Using 
    End Using 
End Using 

Using结构自动关闭连接并配置它(以及其他对象)

被编辑为使用CALL而不是EXECUTE

+0

感谢您的回复。我尝试了这段代码,但使用Using reader语句获得了另一个代码异常。 提供给EXECUTE的未知预处理语句处理程序(GetRuntestToday)“ ”Source =“myodbc5.dll” – 2012-08-02 17:25:32

+0

@JasonShoulders,我很抱歉听到这个消息,我可能会抓住吸管,但是您的ODBC驱动程序指向正确的数据库(我假设'runtest')。你也可以尝试在你的代码中放入'runtest.GetRuntestToday'。只是因为VB代码看起来正确而提出了一些建议。 – 2012-08-02 17:32:55

+0

我添加了一段代码来证明它的命中数据库正确当我得到一个数据集返回运行在dbcRONSst连接查询时返回62条记录 我想我已经尝试runtest.GetRuntestToday但我只是试了一遍,仍然没有去:( 它可能有与权限有关的任何事情?我的登录ID是root,所以我是我不认为那会是。 – 2012-08-02 17:39:55