Когда мы пытаемся выполнить хранимую процедуру, не отправляя значения в требуемый параметр, она дает ошибку, как показано ниже.
Я хочу знать, есть ли способ устранить все параметры для данной хранимой процедуры?
Например: Parr [] string = GetSpParameters ("StoredProcedureName")//Мне нужно разработать функцию GetSpParameters.
Благодарю.
Вы можете использовать метод SqlCommandBuilder.DeriveParameters
для заполнения коллекции параметров указанного объекта SqlCommand.
В терминах 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, чтобы не загружать некоторую информацию, о которой вам все равно.
ConnectionContext.Connect()
.