2011-12-20 55 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 

當我試圖運行此我得到的例外「對程序otrs.getID參數數目不正確;預計1,得到0」就行了da.Fill(DT)。我不知道爲什麼會發生這種情況。在我的存儲過程中沒有聲明參數。

我的存儲過程應該沒問題。調用它的數據庫管理系統制定了罰款,但這裏是代碼反正:

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$$ 

是的,我沒有使用搜索功能,我用Google搜索了很多,但我仍然感謝任何一種關於我的問題的信息。

所以我發現是錯的。顯然你不需要程序名後面的()。我不是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.CommandText = "getID" 
    Dim da As MySql.Data.MySqlClient.MySqlDataAdapter = _ 
    New MySql.Data.MySqlClient.MySqlDataAdapter(cmd, con_str) 
+0

謝謝你的快速回答。我這樣做了,但現在我又遇到了另一個異常:「數據庫'otrs''中找不到」過程或函數'getID()'「。這很奇怪,因爲程序肯定在數據庫中。剛剛改變了代碼:) – OhSnap 2011-12-20 08:03:16

+0

經過研究,我發現這個異常大多與小寫大寫有關,但db-name在連接字符串和db中都是小寫字母。 – OhSnap 2011-12-20 08:39:17

+0

當命令類型爲「CommandType.StoredProcedure」而不是「call getID()'時,只需使用名稱'getid'。我更新了這個問題來反映這一點 – 2011-12-20 15:18:44

1

你從來沒有真正執行CMD。另外,如上所述,您不需要proc調用的括號。它應該看起來像這樣。

MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter("getID", con); 
DataSet DS = new DataSet(); 
mySqlDataAdapter.Fill(DS);