2014-09-16 4 views
3

Я досадно получил то, что кажется очень «популярной» ошибкой. Однако, в моем случае я поставляю ожидаемый параметр, и он определенно имеет значение, поэтому я в тупике. Вот мой код:Процедура или функция '' ожидает параметр '', который не указан

public static DataTable MyDataTable(string pd, bool showAll) 
{ 
    DataTable results = new DataTable("PD results"); 

    string Conn = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString; 

    using (SqlConnection connection = new SqlConnection(Conn)) 
    { 
     SqlCommand cmd = new SqlCommand("dbo.MyProcedure", connection); 

     SqlParameter pdParam = new SqlParameter("@i_user", SqlDbType.VarChar); 
     pdParam.Value = pd; 
     cmd.Parameters.Add(pdParam); 

     if (showAll) 
      cmd.Parameters.AddWithValue("@i_ShowALL", (int)1); 
     else 
      cmd.Parameters.AddWithValue("@i_ShowALL", (int)0); 

     SqlDataAdapter da = new SqlDataAdapter(cmd); 

     try 
     { 
      da.Fill(results); 
     } 
     catch (Exception ex) 
     { 
      string error = ex.Message; 
     } 
    } 

    return results; 
} 

Я прошел через код и возникает ошибка с параметром @i_user. Однако, когда я добавляю параметр, он имеет значение, и я подтвердил это, посмотрев на SqlDataAdapter> SelectCommand> Параметры> Непубличные элементы> элементы> [0] {@i_user}> base> значение.

Несмотря на параметр, поставляемый со значением varchar я получаю ошибку

Процедура или функция «dbo.MyProcedure» ожидает параметр «@i_user», который не входит в комплект

Что я делать не так?

+3

предложение: добавить 'cmd.CommandType = CommandType.StoredProcedure;' –

+0

Как говорит Dmity, вы не говорите 'SqlCommand', что вы запуская хранимую процедуру, чтобы она интерпретировала команду как простую строку sql, которая не содержит никаких параметров. –

+0

@DmitryBychenko - это решило проблему. Я совершенно забыл добавить это. Глупая ошибка. Если вы добавите это в качестве ответа, я соглашусь с ним. – sr28

ответ

3

Причина ошибки в том, что SqlCommand класс ожидает простой текст SQL. При назначении имя хранимой процедуры ("dbo.MyProcedure" в вашем случае) добавить

... 
    // Do not forget to Dispose IDisposable instances 
    using (SqlCommand cmd = new SqlCommand("dbo.MyProcedure", connection)) { 
    // cmd.CommandText is a stored procedure name, not a plain text SQL 
    cmd.CommandType = CommandType.StoredProcedure; 
    ... 
    } 
Смежные вопросы