2011-12-20 51 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);