过程或函数 'x' 需要参数“@y”,这在 C# 上不是 supplied.Got 错误?
Procedure or function 'x' expects parameter '@y', which was not supplied.Got error on c#?
首先,我知道像这样的问题是重复的但是,请注意这个问题。
这是我的 C# 代码,它引发错误为:
Procedure or function 'aaa' expects parameter '@bbb', which was not supplied.
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
注意:(可能会有帮助,这是我的堆栈跟踪):
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception,
Boolean breakConnection, Action1 wrapCloseInAction) at
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
exception, Boolean breakConnection, Action
1 wrapCloseInAction) at
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject
stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at
System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,
SqlCommand cmdHandler, SqlDataReader dataStream,
BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject
stateObj, Boolean& dataReady) at
System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() at
System.Data.SqlClient.SqlDataReader.get_MetaData() at
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,
RunBehavior runBehavior, String resetOptionsString, Boolean
isInternal, Boolean forDescribeParameterEncryption) at
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean
async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry,
SqlDataReader ds, Boolean describeParameterEncryptionRequest) at
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String
method, TaskCompletionSource`1 completion, Int32 timeout, Task& task,
Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) at
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String
method) at
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior
behavior, String method) at
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior
behavior) at
System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior
behavior) at System.Data.Common.DbDataAdapter.FillInternal(DataSet
dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords,
String srcTable, IDbCommand command, CommandBehavior behavior) at
System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32
startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior
behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable
dataTable) at WebService.Services.GetLettersList(String UserName,
String PassPhrase, String CodeName, String LetterType) in
D:\Amiri\WebService\WebService\Services.asmx.cs:line 79
在你的行中:
Da = new SqlDataAdapter(Cmd.CommandText, Con);
您只传递了过程的名称,而忽略了参数。仅传递 Cmd
(并将该连接添加到命令)以使用您定义的参数。
@Hans Kesting 说得对,但我觉得解释得不好。这是怎么回事...
da = new SqlDataAdapter(Cmd.CommandText, Con);
...您是否正在隐式创建一个与 Cmd
具有相同 CommandText
的新 SqlCommand
。这与您直接使用 [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);
首先,我知道像这样的问题是重复的但是,请注意这个问题。 这是我的 C# 代码,它引发错误为:
Procedure or function 'aaa' expects parameter '@bbb', which was not supplied.
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
注意:(可能会有帮助,这是我的堆栈跟踪):
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) at WebService.Services.GetLettersList(String UserName, String PassPhrase, String CodeName, String LetterType) in D:\Amiri\WebService\WebService\Services.asmx.cs:line 79
在你的行中:
Da = new SqlDataAdapter(Cmd.CommandText, Con);
您只传递了过程的名称,而忽略了参数。仅传递 Cmd
(并将该连接添加到命令)以使用您定义的参数。
@Hans Kesting 说得对,但我觉得解释得不好。这是怎么回事...
da = new SqlDataAdapter(Cmd.CommandText, Con);
...您是否正在隐式创建一个与 Cmd
具有相同 CommandText
的新 SqlCommand
。这与您直接使用 [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);