2012-08-02 130 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