【问题标题】:"Incorrect number of arguments for PROCEDURE" exception with mysql and vb.netmysql和vb.net的“PROCEDURE的参数数量不正确”异常
【发布时间】:2018-08-22 04:35:25
【问题描述】:

几天来,我一直在尝试让存储过程在 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

当我尝试运行此程序时,我在 da.Fill(dt) 行上收到异常“PROCEDURE otrs.getID 的参数数量不正确;预期为 1,得到 0”。我真的不知道为什么会这样。我的存储过程中没有声明任何参数。

我的存储过程应该没问题。从 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$$

是的,我确实使用了搜索功能,并且在 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

【问题讨论】:

    标签: mysql vb.net stored-procedures datagridview


    【解决方案1】:

    您从未真正执行过 cmd。此外,正如您上面提到的,您不需要 proc 调用的括号。它应该看起来像这样。

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

    【讨论】:

      【解决方案2】:

      这一行是错误的,它使用“call 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)
      

      【讨论】:

      • 感谢您的快速回答。我这样做了,但现在我得到另一个异常:“在数据库'otrs'中找不到过程或函数'getID()'。”这很奇怪,因为该过程肯定在数据库中。刚刚改了代码:)
      • 经过一番研究,我发现这个异常主要与小写大写有关,但连接字符串和db中的db-name都是小写的。跨度>
      • 当命令类型为CommandType.StoredProcedure 而不是call getID() 时,您只需使用名称getid。我更新了问题以反映这一点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 2018-03-05
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多