【问题标题】:Procedure or function 'x' expects parameter '@y', which was not supplied.Got error on c#?过程或函数“x”需要参数“@y”,但未提供该参数。c# 出错?
【发布时间】:2017-05-06 19:48:18
【问题描述】:

首先,我知道这样的问题是重复的,但是请注意这个期望的问题。 这是我的 C# 代码,它引发了错误:

过程或函数“aaa”需要参数“@bbb”,但未提供。

if (Dt.Rows.Count > 0)
{
    Cmd = new SqlCommand();
    Cmd.CommandText = ("[dbo].[aaa]");
    Cmd.CommandType = CommandType.StoredProcedure;
    Cmd.Parameters.Add("@bbb", SqlDbType.Int).Value = 1;
    Cmd.Parameters.Add("@LettType", SqlDbType.VarChar, 3).Value = LetterType;
    Cmd.Parameters.Add("@IsTajamo", SqlDbType.Char, 1).Value = 1;
    Da = new SqlDataAdapter(Cmd.CommandText, Con);
    Dt.Clear();
    /*Line72:*/    
    Da.Fill(Dt);
}

从技术上讲,我找不到错误在哪里。我传递了所有参数。当我在 MS-SQL 中单独执行我的存储过程时,它可以正常使用这些值。

各位专家能帮我解决这个问题吗? 注意:这里是存储过程:

   ALTER PROCEDURE [dbo].[aaa] (@bbb Int , @LettType CHAR(3) , @IsTajamo CHAR(1))

AS
BEGIN

select 1


END

注意:(这可能会有所帮助,这是我的堆栈跟踪):

在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) 在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior,字符串 resetOptionsString,布尔值 isInternal, Boolean forDescribeParameterEncryption) 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔 returnStream、布尔 异步,Int32 超时,任务和任务,布尔 asyncWrite,布尔 inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、runBehavior、布尔返回流、字符串 方法,TaskCompletionSource`1 完成,Int32 超时,Task& 任务, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、runBehavior、布尔返回流、字符串 方法)在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior 行为)在 System.Data.Common.DbDataAdapter.FillInternal(DataSet 数据集,DataTable[] 数据表,Int32 startRecord,Int32 maxRecords, 字符串 srcTable、IDbCommand 命令、CommandBehavior 行为)在 System.Data.Common.DbDataAdapter.Fill(DataTable[] 数据表,Int32 startRecord、Int32 maxRecords、IDbCommand 命令、CommandBehavior 行为)在 System.Data.Common.DbDataAdapter.Fill(DataTable 数据表)在 WebService.Services.GetLettersList(字符串用户名, String PassPhrase、String CodeName、String LetterType)在 D:\Amiri\WebService\WebService\Services.asmx.cs:第 79 行

【问题讨论】:

  • @Satpal 程序没有问题。如果您只是在标记之前正确阅读了问题。你可以理解我说的。程序运行正常。
  • 我已阅读该问题但尚未标记。但是对我来说问题似乎程序 sn-p 将有助于解决
  • @نرخیاب:与那些试图帮助你的人争论是让帮助消失的好方法。也就是说,根据我的经验,此错误的最常见原因是参数名称拼写错误。检查你的拼写。
  • 我们需要看看你是如何执行存储过程的,以试图了解问题出在哪里。
  • @alex 我把程序带回来了

标签: c# asp.net sql-server stored-procedures sqldataadapter


【解决方案1】:

在你的行中:

Da = new SqlDataAdapter(Cmd.CommandText, Con);

您只是传递了过程的名称,而忽略了参数。仅传递 Cmd(并将该连接添加到命令)以使用您定义的参数。

【讨论】:

  • if (Dt.Rows.Count > 0) { Da = new SqlDataAdapter(Cmd.CommandText, Con); Da.SelectCommand.Parameters.Add("@bbb", SqlDbType.Int).Value = 1; Da.SelectCommand.Parameters.Add("@LettType", SqlDbType.VarChar, 3).Value = LetterType; Da.SelectCommand.Parameters.Add("@IsTajamo", SqlDbType.Char, 1).Value = 1;错误答案 错误答案
  • 另外,@LettType 参数被声明为char(3),但在.net 代码中它被声明为varchar
【解决方案2】:

@Hans Kesting 是正确的,但我认为解释得不好。这是怎么回事……

da = new SqlDataAdapter(Cmd.CommandText, Con);

...您是否正在隐式创建一个新的SqlCommand,它与Cmd 具有相同的CommandText。就像您只是将[dbo].[aaa] 用作参数值一样。因此,这个新的SqlCommand 没有分配SqlParameters。然后你可以这样做:SqlDataAdapter.SelectCommand.Parameters.Add(....,但那是一团糟。

您需要做的是使用SqlCommand (Cmd) 本身。但您还必须确保它与连接相关联:

   Cmd = Con.CreateCommand(); //This hooks up the connection to this command
   Cmd.CommandText = "[dbo].[aaa]";
   Cmd.CommandType = CommandType.StoredProcedure;
   Cmd.Parameters.Add("@bbb", SqlDbType.Int).Value = 1;
   Cmd.Parameters.Add("@LettType", SqlDbType.VarChar, 3).Value = LetterType;
   Cmd.Parameters.Add("@IsTajamo", SqlDbType.Char, 1).Value = 1;
   Da = new SqlDataAdapter(Cmd); //Just the command
   Dt.Clear();
   Da.Fill(Dt);

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 2020-12-14
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多