2016-12-21 7 views
0

Прежде всего, я знаю, что такие вопросы повторяются, но обратите внимание на это. Вот мой C# код, за которым поднять ошибку как:Процедура или функция 'x' ожидает параметр '@y', который не был указан. Ошибка на C#?

процедуры или функции «ааа» ожидает параметр «@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 исключение, Логическое breakConnection, Действие 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) при System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, булева callerHasConnectionLock, булева asyncClose) при System.Data.SqlClient.TdsParser.TryRun (RunBehavior runB ehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) в System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() в System.Data.SqlClient.SqlDataReader.get_MetaData() в системе .Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader DS, runBehavior runBehavior, String resetOptionsString, Boolean IsInternal, булева forDescribeParameterEncryption) при System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, runBehavior runBehavior, булева returnStream, булевы async, таймаут Int32, задача & задача, булева asyncWrite, булева inRetry, SqlDataReader DS, булева describeParameterEncryptionRequest) при System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, булева returnStream, String метод, TaskCompletionSource`1 завершение, Int32 тайм-аут, задача & задача, Логическое & usedCache, булева asyncWrite, булева inRetry) при System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, булева returnStream, String метод) при System.Data.SqlClient.SqlCommand .ExecuteReader (CommandBehavior beha ВИОР, метод String) в System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior поведение) при System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (CommandBehavior поведение) при System.Data.Common. DbDataAdapter.FillInternal (DataSet dataset, DataTable [] datatables, Int32 startRecord, Int32 maxRecords, Строка srcTable, команда IDbCommand, поведение CommandBehavior) в System.Data.Common.DbDataAdapter.Fill (DataTable [] DataTables, Int32 startRecord, Int32 MaxRecords, команда IDbCommand, CommandBehavior поведение) при System.Data.Common.DbDataAdapter.Fill (DataTable DataTable) в WebService.Services.GetLettersList (String UserName, Строка PassPhrase, строка CodeName, String LetterType) в D: \ Амири \ WebService \ WebService \ Services.asmx.cs: линия 79

+0

@Satpal Нет проблем с процедурой. , если вы правильно прочитали вопрос, прежде чем помечать. вы можете понять, что я сказал. процедура работает правильно. – AminAmiriDarban

+0

Я прочитал вопрос и еще не отмечен. Однако для меня проблема кажется, что фрагмент кода будет полезен для разрешения – Satpal

+0

@ نرخیاب: спорить с теми, кто пытается помочь вам, - это хороший способ помочь этой помощи. Тем не менее, наиболее распространенной причиной этой ошибки в моем опыте является неправильное использование имени параметра. Проверить написание. –

ответ

5

в вашей линии:

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

вы только проходящей через имя из процедуры и игнорирования параметров. Передайте только Cmd (и добавьте это соединение к команде), чтобы использовать ваши определенные параметры.

+0

if (Dt.Rows.Count> 0) { Da = новый 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; WRONG ANSWER WRONG ANSWER – AminAmiriDarban

+0

Кроме того, параметр '@ LettType' объявлен как' char (3) ', но в коде .net он объявлен как' varchar'. –

2

@Hans Kesting является правильным, но я не думаю, что это объясняется хорошо. То, что происходит с этим ...

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

... это вы неявно создает новый SqlCommand, который имеет тот же CommandText как Cmd. Это то же самое, как если бы вы буквально использовали [dbo].[aaa] в качестве значения аргумента. Следовательно, этот новый SqlCommand не имеет назначенного . Тогда вы могли бы сделать: 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); 
Смежные вопросы