2015-03-31 5 views
0

Я пытаюсь выполнить результаты хранимой процедуры, которая принимает параметры во временную таблицу.INSERT EXEC от DbCommand

// Create #temptable 
// .. 

using (DbCommand command = connection.CreateCommand()) 
{ 
    command.CommandText = "INSERT #temptable EXEC [MystoredProcThatHasParams]"; 
    command.CommandType = CommandType.StoredProcedure; 
    command.Parameters.Add(someObject) 
    command.ExecuteNonQuery(); 
} 

Выход:

Не удалось найти хранимую процедуру ''.

Если удалить command.CommandType = CommandType.StoredProcedure, я получаю:

Процедура или функция 'MystoredProcThatHasParams' ожидает параметр '@ p1', который не был поставлен

Можно ли сохранить результат хранимая процедура, которая принимает параметры из запроса в C#?

+0

Я предполагаю, что вы не хватает в 'string.Format' или что-то там? –

+0

@MichaelEdenfield ha yeah, copy/paste errors :) –

ответ

1

Команда тип StoredProcedure использует специальный метод, более высокую производительность для подключения к SQL Server (вызов RPC), который требует, чтобы текст команды будет точно имя хранимой процедуры. Вы не можете включать Transact-SQL в текст команды, если вы хотите использовать CommandType.StoredProcedure.

Вместо этого вам нужно использовать CommandType.Text и вставлять параметры в SQL строку самостоятельно:

cmd.CommandType = CommandType.Text; 
cmd.CommandText = "INSERT #temptable EXEC [MystoredProcThatHasParams] @Param1, @Param2"; 
cmd.Parameters.Add("@Param1", SqlDbType.Int).Value = 1; 
cmd.Parameters.Add("@Param2", SqlDbType.VarChar, 100).Value = "Test"; 
+1

Ваше последнее утверждение неверно. Это было бы справедливо только в том случае, если таблица была создана внутри этой команды, например, из 'select * в #temptable из Foo, где Foo.Bar = @ bar', но' INSERT' требует, чтобы таблица существовала, и эта команда будет не влияют на его существование. Таблицы стиля 'temp' существуют до тех пор, пока соединение открыто или вы оставите хранимую процедуру, в которой он был создан (если он был создан внутри хранимой процедуры) –

+0

Если соединение, создавшее таблицу, является тем же самым соединением, которое имеет выполненной команды, нет необходимости беспокоиться о пуле соединений, утверждение * «они перезагружаются между вызовами SQL» * просто больно. Соединение возвращается только в пул и имеет свой сброс состояния **, когда он закрыт **. Из примера OP я считаю, что довольно безопасно предположить, что '// Create # temptable' использует тот же объект' connection', и соединение не было закрыто между двумя шагами. –

Смежные вопросы