2011-12-20 8 views
1

数日間私は試していましたが、vb.netで動作するストアドプロシージャを取得しようとしましたが、作業。「PROCEDUREの引数の数が正しくありません」mysqlとvb.netの例外

誰かが私を助けてくれたら本当にありがたいです。私はこの問題を解決するために真剣に努力してきましたが、私は解決策を見つけることができません。

Private Sub getID() 
    Dim ds As New DataSet 
    Dim con_str = " 
    Dim con As MySql.Data.MySqlClient.MySqlConnection = New MySql.Data.MySqlClient.MySqlConnection(con_str) 
    con.Open() 
    Dim cmd As MySql.Data.MySqlClient.MySqlCommand = New MySql.Data.MySqlClient.MySqlCommand 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.CommandText = "getID()" 
    cmd.CommandType = CommandType.StoredProcedure 

    cmd.Parameters.AddWithValue("@id", "113") 
    Dim da As MySql.Data.MySqlClient.MySqlDataAdapter = New MySql.Data.MySqlClient.MySqlDataAdapter(cmd) 
    Dim dt As New DataTable 
    da.SelectCommand.Connection = con 
    da.Fill(dt) 
End Sub 

私はこれを実行しようとすると、私は例外を取得「PROCEDURE otrs.getIDの引数の数が正しくありませんが、1を予想、0を得た」行da.Fill(DT)に。私は本当になぜこれが起こるのか分かりません。私のストアドプロシージャで宣言された引数はありません。

私のストアドプロシージャは正常です。 DBMSからそれを呼び出すと、罰金を働いたが、ここではとにかくコードです:

delimiter $$ 

CREATE DEFINER=`otrs`@`%` PROCEDURE `getCIs`() 
BEGIN 
SELECT 
    l.source_key AS base_id, 
    c1.configitem_number AS base_number, 
    v.name as base_name, 
    l.target_key AS link_id, 
    c2.configitem_number AS link_number, 
    v1.name as link_name, 
    t.name as link_type 
FROM 
    otrs.link_relation AS l 
     INNER JOIN 
    otrs.configitem AS c1 
     ON l.source_key = c1.id  
     INNER JOIN 
    otrs.configitem AS c2 
     ON l.target_key = c2.id  
     INNER JOIN 
    otrs.link_type AS t 
     INNER JOIN 
    otrs.configitem_version AS v 
     ON l.source_key = v.configitem_id 
     INNER JOIN 
    otrs.configitem_version AS v1 
     ON l.target_key = v1.configitem_id; 
END$$ 

そして、はい、私は、検索機能を使用していたと私は非常に多くのグーグルが、私はまだどのような種類のために感謝しています私の問題に関する情報の

私は間違っていることを知った。どうやら、プロシージャー名の後ろに()が必要ないはずです。イムかかわらず、100%確実ではない、今何が全く起こらないので:

Private Sub getID() 
    Dim ds As New DataSet 
    Dim con_str = "" 
    Dim con As MySql.Data.MySqlClient.MySqlConnection = New MySql.Data.MySqlClient.MySqlConnection(con_str) 
    con.Open() 
    Dim cmd As MySql.Data.MySqlClient.MySqlCommand = New MySql.Data.MySqlClient.MySqlCommand 
    cmd.CommandType = CommandType.StoredProcedure 
    Try 
     cmd.CommandText = "getID" 
    Catch ex As Exception 
     MsgBox(ex.Message()) 
    End Try 

    cmd.Parameters.AddWithValue("@id", 113) 
    cmd.Connection = con 
    Dim da As MySql.Data.MySqlClient.MySqlDataAdapter = New MySql.Data.MySqlClient.MySqlDataAdapter(cmd) 
    Dim dt As New DataTable 
    Try 
     da.Fill(dt) 
    Catch ex As Exception 
     MsgBox(ex.Message()) 
    End Try 
End Sub 

答えて

0

この行は間違っている、それは「呼んのgetId()」のコマンドテキストで新しいコマンドを作成し、パラメータなしのアダプタに追加します

Dim da As MySql.Data.MySqlClient.MySqlDataAdapter = _ 
    New MySql.Data.MySqlClient.MySqlDataAdapter("call getID()", con_str) 

あなたはあなたが実際にcmdを実行しません

cmd.CommandText = "getID" 
    Dim da As MySql.Data.MySqlClient.MySqlDataAdapter = _ 
    New MySql.Data.MySqlClient.MySqlDataAdapter(cmd, con_str) 
+0

迅速な回答ありがとうございました。私はそれをしましたが、別の例外があります: "プロシージャまたは関数 'getID()''がデータベース 'otrs''に見つかりません。プロシージャがデータベースに確実にあるので、これは変です。今すぐコードを変更しました:) – OhSnap

+0

少し調べたところ、この例外はほとんどが小文字の大文字と関連していましたが、db-nameは接続文字列とdbの小文字です。 – OhSnap

+0

コマンドタイプが 'CommandType.StoredProcedure'で、' call getID() 'ではなく、' getid'という名前だけを使う必要があります。私はこれを反映するために質問を更新した –

1

をしたいです。また、上記のように、proc呼び出しには括弧は必要ありません。このように見えるはずです。

MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter("getID", con); 
DataSet DS = new DataSet(); 
mySqlDataAdapter.Fill(DS); 
関連する問題