Как получить необходимые параметры из хранимой процедуры в C # [duplicate]

1

Когда мы пытаемся выполнить хранимую процедуру, не отправляя значения в требуемый параметр, она дает ошибку, как показано ниже.

Изображение 174551

Я хочу знать, есть ли способ устранить все параметры для данной хранимой процедуры?

Например: Parr [] string = GetSpParameters ("StoredProcedureName")//Мне нужно разработать функцию GetSpParameters.

Благодарю.

  • 0
    Я хочу получить список параметров из данного sp в C #, а не в SQL-сервере.
  • 1
    «Двойной» вопрос охватывает, как получить список параметров для процесса, но он не охватывает реальную необходимость этого вопроса, а именно, как получить список обязательных параметров (т. Е. Параметров без значения по умолчанию) для проц. Для этого посмотрите этот ответ: stackoverflow.com/a/1676272
Теги:
sql-server
sql-server-2008

2 ответа

3
Лучший ответ

Вы можете использовать метод SqlCommandBuilder.DeriveParameters для заполнения коллекции параметров указанного объекта SqlCommand.

  • 1
    Спасибо. оно работает. вот мой код ---------------------- SqlCommandBuilder.DeriveParameters (SqlCmd); foreach (параметр SqlParameter в SqlCmd.Parameters) {} ---------------------- спасибо.
  • 0
    обратите внимание, что на самом деле это не говорит вам, являются ли параметры обязательными или необязательными; эту информацию получить значительно сложнее. Я получу ответ на этот вопрос.
3

В терминах SQL Server требуемым параметром является любой параметр, который не имеет значения по умолчанию, например:

CREATE PROCEDURE Foo
(
  @Required INT,
  @NotRequired INT = NULL
)

В этом случае вы можете вызывать процедуру без параметра @NotRequired, но вы не можете вызвать процедуру без @Required - вы получите ошибку в своем вопросе.

Вы можете использовать SqlCommandBuilder.DeriveParameters на объекте SqlCommand вы настроили для заполнения коллекции Parameters, но это не скажет вам разницу между необязательными и требуемыми параметрами. Вы могли просто предположить, что все параметры хранимой процедуры необходимы, но это ужасная идея. Хранимые процедуры очень часто позволяют вам передавать различные комбинации параметров и вести себя соответствующим образом. Например, хранимая процедура "поиска" может принимать большой список параметров, но требует только указать те, которые вы действительно хотите найти; или хранимая процедура может иметь значения по умолчанию для определенного параметра и только ожидать, что вы укажете явные значения, если вы хотите изменить поведение.

Чтобы на самом деле сказать разницу, вам нужно использовать SQL Server SMO API. Это должно быть установлено как часть установки клиентских инструментов SQL Server, вам нужно добавить ссылку на несколько сборок: Microsoft.SqlServer.ConnectionInfo, Microsoft.SqlServer.Management.Sdk и Microsoft.SqlServer.Smo.

Оттуда основная идея такова:

var server = new Server("instancename");
server.ConnectionContext.DatabaseName = "DatabaseName";
server.ConnectionContext.LoginSecure = true;
server.ConnectionContext.Connect();

var db = server.Databases["databasename"];
var proc = new StoredProcedure(db, "storedprocedurename");

foreach (StoredProcedureParameter parameter in sp.Parameters)
{
    if (parameter.DefaultValue != null)
    {
      // param is required.
    }
}

Вы можете увидеть больше информации в этом ответе и этом вопросе и этой статье MSDN. В частности, этот второй вопрос говорит о том, как ускорить этот процесс, сообщив SMO, чтобы не загружать некоторую информацию, о которой вам все равно.

  • 0
    Майкл, я получаю сообщение об ошибке: «Microsoft.SqlServer.Management.Server» не содержит определения «Connect», я также проверил страницу MSDN для класса «Server», у него нет метода с таким именем, пожалуйста, объяснить.
  • 0
    да, извините, это была ошибка транскрипции. это ConnectionContext.Connect() .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню