1

私はストアド プロシージャの初心者なので、何か簡単なことを見逃しているかもしれませんが、基本を調べて、vb.net コードから統合しようとして立ち往生しています。今日の結果のデータのクエリを実行するだけの単純なストアド プロシージャ (と思います) を作成しました。


-- ルーチン 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 のもので少し遊んでみましたが、何も修正されていないようです。

4

1 に答える 1

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自動的に接続を閉じ、それを (他のオブジェクトと共に) 破棄します。

EXECUTE の代わりに CALL を使用するように編集

于 2012-08-02T17:19:15.527 に答える