来自 C# 的 PROCEDURE... 的参数数量不正确

     2023-02-24     81

关键词:

【中文标题】来自 C# 的 PROCEDURE... 的参数数量不正确【英文标题】:Incorrect number of arguments for PROCEDURE... from C# 【发布时间】:2021-01-15 11:54:14 【问题描述】:

我在存储过程中使用参数时遇到问题。我相信我没有使用 C# 正确传递参数。

我的代码大致相当于:

public static string GetCustomer(string storedProcedure, string connectionString)

    DataTable dt = new DataTable();
    using (MySqlConnection con = new MySqlConnection(connectionString))
    
        using (MySqlCommand cmd = new MySqlCommand(storedProcedure, con))
        
            cmd.Parameters.AddWithValue("_table1", "table1");
            cmd.Parameters.AddWithValue("_table2", "table2");

            con.Open();
            MySqlDataAdapter da = new MySqlDataAdapter(cmd);
            IDataParameter[] temp = da.GetFillParameters();//returns 2 parameters
            da.Fill(dt);//Breaks here with the error below

            //Irrelevant code
        
    
    return "";

PROCEDURE tspos.get_customer 的参数数量不正确;预期 2,得到 0

DROP PROCEDURE IF EXISTS get_customer;
DELIMITER //
CREATE PROCEDURE get_customer
(
    IN _table1 VARCHAR(25),
    IN _table2 VARCHAR(25)
)
BEGIN
SET @t1 = CONCAT('SELECT a.*, b.* FROM ', _table1, ' a, ', _table2, ' b');
    PREPARE statement FROM @t1;
    EXECUTE statement;
    DEALLOCATE PREPARE statement;
END //

DELIMITER ;

下面的调用按预期工作,所以我想我的问题出在 C# 中

CALL get_customer('table1', 'table2');
CALL get_customer('table3', 'table4');

【问题讨论】:

【参考方案1】:

既然你用过MySqlDataAdapter,最好用SqlDataAdapter.SelectCommand Property来指定参数,另外别忘了你需要在参数名称前加一个@,像这样:

da.SelectCommand.Parameters.AddWithValue("@_table1", "table1");

虽然直接指定类型,使用Value属性比AddWithValue好。

Can we stop using AddWithValue() already?

另外一点,您需要使用如下代码指定要存储过程的命令类型:

cmd.CommandType = CommandType.StoredProcedure;

【讨论】:

【参考方案2】:

我认为您的参数名称应以@ 符号为前缀:

cmd.Parameters.AddWithValue("@_table1", "table1");
cmd.Parameters.AddWithValue("@_table2", "table2");

另外,请确保正确设置命令类型:

using (MySqlConnection con = new MySqlConnection(connectionString))

    using (MySqlCommand cmd = new MySqlCommand(storedProcedure, con))
    
        //Set command type
        cmd.CommandType = CommandType.StoredProcedure;
        con.Open();
        MySqlDataAdapter da = new MySqlDataAdapter(cmd);
        
        cmd.Parameters.AddWithValue("@_table1", "table1");
        cmd.Parameters.AddWithValue("@_table2", "table2");
        
        IDataParameter[] temp = da.GetFillParameters();//returns 2 parameters
        da.Fill(dt);

        //Irrelevant code
    

【讨论】:

不幸的是,这并没有解决问题。同样的错误。 @EricWarburton:da.GetFillParameters 方法有什么作用? 从 DbDataAdapter 中说: 摘要:获取用户在执行 SQL SELECT 语句时设置的参数。我用它只是为了检查我的参数是否在 da 中设置。 @EricWarburton:抱歉,我看错了适配器的名称 (da)。我认为这是此方法范围之外的其他类。我想知道调用它是否会清除您的参数...我更新了答案,所以尝试一下,看看会发生什么。 @EricWarburton:我现在几乎 100% 确定您的问题是 @ 标志以及未设置的命令类型。请检查我的答案。

php mysqi bind_param 变量数与准备好的语句中的参数数不匹配[重复]

】phpmysqibind_param变量数与准备好的语句中的参数数不匹配[重复]【英文标题】:Phpmysqibind_paramNumberofvariablesdoesn\'tmatchnumberofparametersinpreparedstatement[duplicate]【发布时间】:2013-01-2417:16:08【问题描述】:这一定是新手的错误,但我没... 查看详情

call_user_func_array() - 警告:mysqli_stmt::bind_param():变量数与准备语句中的参数数不匹配

】call_user_func_array()-警告:mysqli_stmt::bind_param():变量数与准备语句中的参数数不匹配【英文标题】:call_user_func_array()-Warning:mysqli_stmt::bind_param():Numberofvariablesdoesn\'tmatchnumberofparametersinpreparedstatement【发布时间】:2016-10-0800: 查看详情

unity 3d-大分数数字变成指数 C# [关闭]

】unity3d-大分数数字变成指数C#[关闭]【英文标题】:unity3d-LargeScorenumbersturnintoexponentsC#[closed]【发布时间】:2015-04-1621:03:07【问题描述】:我遇到了一个问题,我的分数变成了指数。我想知道的是,如何将大浮点数和int指数数转... 查看详情

c#复制指定节点的所有子孙节点到新建的节点下

XML结构:新建一个mask_list节点,一个procedure节点,将上面的mask_list和procedure节点的所有子孙节点添加到新建的mask_list和procedure节点XmlElementmask_list=xmlDoc.CreateElement("mask_list");XmlElementprocedure=xmlDoc.CreateElement("procedure 查看详情

如何使用来自 c# 的 MySQL 存储过程将表作为输入发送到存储过程?我有 T-SQL 工作

...存储过程?我有T-SQL工作【英文标题】:HowdoIuseaMySQLstoredprocedurefromc#whichsendsatableasinputtothestoreprocedure?IhaveT-SQLworking【发布时间】:2015-04-1410:41:24【问题描述】:在Transact-SQL中,我有存储过程的输入参数@DataTableInputTa 查看详情

PROCEDURE 字符串语句总是返回 0

】PROCEDURE字符串语句总是返回0【英文标题】:PROCEDUREReturnalways0forstringstatement【发布时间】:2020-04-0116:48:35【问题描述】:我有一个可以由用户为多列动态更改的过程,我在运行它时用SQL编写它。在VisualStudio的SQL和ServerExplorer中... 查看详情

如何判断 ALTER PROCEDURE 是不是有效?

】如何判断ALTERPROCEDURE是不是有效?【英文标题】:HowtotellifALTERPROCEDUREworked?如何判断ALTERPROCEDURE是否有效?【发布时间】:2019-10-2920:07:00【问题描述】:我对SQL和SQLServer还是很陌生。我正在尝试从通过C#代码调用的.sql文件运行ALT... 查看详情

C# 处理来自 ipdata.co 的 JSON

】C#处理来自ipdata.co的JSON【英文标题】:C#processJSONfromipdata.co【发布时间】:2020-01-1403:11:06【问题描述】:对C#有点陌生,我希望有人可以帮助我了解我需要做什么。以下示例是来自ipdata.co文档网站的推荐C#代码。usingRestSharp;(atthe... 查看详情

从 MySQL 数据库中选择数据时,PROCEDURE 的参数数量不正确

】从MySQL数据库中选择数据时,PROCEDURE的参数数量不正确【英文标题】:IncorrectNumberofArgumentsforPROCEDUREwhenselectingdatafromMySQLdatabase【发布时间】:2021-07-1412:10:29【问题描述】:我正在尝试将包含SQL查询的c#方法转换为对存储过程的... 查看详情

来自 C# 的端口转发

】来自C#的端口转发【英文标题】:PortforwardingfromC#【发布时间】:2013-03-1422:17:04【问题描述】:我想用C#编写一个程序,将特定端口从路由器转发到计算机。这可能吗?【问题讨论】:查看UPnP:en.wikipedia.org/wiki/Universal_Plug_and_Pla... 查看详情

通过 Firebreath 框架来自 javascript 的 C# 类

】通过Firebreath框架来自javascript的C#类【英文标题】:C#ClassesfromjavascriptthoughFirebreathFramework【发布时间】:2013-05-1107:29:28【问题描述】:我必须通过Firebreath框架从javascript调用C#类。我是FirebreathFramework的新手。假设在C#中,公共类I... 查看详情

C# 包装类和来自 c++ 的 dllimport

】C#包装类和来自c++的dllimport【英文标题】:C#wrapperclassanddllimportfromc++【发布时间】:2014-02-1312:14:12【问题描述】:这个想法是制作C#包装类。我知道结构,但我不知道如何以相同的方式使用指针或以类似的方式使用指针,因为... 查看详情

C# 更正来自 C++ 的托管代码

】C#更正来自C++的托管代码【英文标题】:C#CorrectmanagedcodefromC++【发布时间】:2011-07-2711:21:45【问题描述】:我必须在我的C#应用程序中使用这个外部函数“GetOpenedFiles”(更多信息:http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx)... 查看详情

存储来自 C# 应用程序的数据

】存储来自C#应用程序的数据【英文标题】:StoredatafromaC#application【发布时间】:2010-09-0609:51:59【问题描述】:我最近开始学习一些C#并编写了一个Yahtzee克隆。我的下一步(现在游戏逻辑已经到位并正常运行)是整合一些方法来... 查看详情

使用来自 C# 的托管 C++ dll

】使用来自C#的托管C++dll【英文标题】:UsingmanagedC++dllfromC#【发布时间】:2009-02-0216:01:07【问题描述】:我使用托管C++创建了一个dll。现在我正在尝试从C#中使用它。我已将对象添加到项目引用中。对象浏览器正确显示dll中的对... 查看详情

来自 C# 的 mingw DLL:为啥我必须覆盖新/删除?

】来自C#的mingwDLL:为啥我必须覆盖新/删除?【英文标题】:mingwDLLfromC#:whydoIhavetooverridenew/delete?来自C#的mingwDLL:为什么我必须覆盖新/删除?【发布时间】:2018-10-0315:30:20【问题描述】:我正在尝试在Windows10上从C#调用最小的C函... 查看详情

C#:来自 System.Type 的动态解析

】C#:来自System.Type的动态解析【英文标题】:C#:DynamicparsefromSystem.Type【发布时间】:2011-01-2317:46:30【问题描述】:我有一个类型、一个字符串和一个对象。有什么方法可以调用解析方法或动态转换字符串上的那种类型吗?基本... 查看详情

使用来自另一个表单的数据更新 datagridview (C#)

】使用来自另一个表单的数据更新datagridview(C#)【英文标题】:Updatedatagridviewwithdatafromanotherform(C#)【发布时间】:2015-10-0109:40:14【问题描述】:我在尝试找出如何在C#中更新datagridview时遇到问题。我有两个表单(Form1:使用datagridvi... 查看详情