C# 如何从C中的存储过程中获取所需的参数

C# 如何从C中的存储过程中获取所需的参数,c#,sql,.net,sql-server,sql-server-2008,C#,Sql,.net,Sql Server,Sql Server 2008,当我们试图执行一个存储过程而不向它的必需参数发送值时,它会给出如下错误 我想知道,是否有任何方法可以有问题地捕获给定存储过程的所有参数 例如:Parr[]string=GetSpParametersStoredProcedureName; //我需要开发GetsParameters函数 谢谢。您可以使用方法填充指定SqlCommand对象的参数集合。您可以使用方法填充指定SqlCommand对象的参数集合。在SQL Server术语中,所需参数是没有默认值的任何参数,例如: CREATE PR

当我们试图执行一个存储过程而不向它的必需参数发送值时,它会给出如下错误

我想知道,是否有任何方法可以有问题地捕获给定存储过程的所有参数

例如:Parr[]string=GetSpParametersStoredProcedureName; //我需要开发GetsParameters函数


谢谢。

您可以使用方法填充指定SqlCommand对象的参数集合。

您可以使用方法填充指定SqlCommand对象的参数集合。

在SQL Server术语中,所需参数是没有默认值的任何参数,例如:

CREATE PROCEDURE Foo
(
  @Required INT,
  @NotRequired INT = NULL
)
在这种情况下,您可以在不使用@NotRequired参数的情况下调用该过程,但在没有@Required参数的情况下无法调用该过程-您将在问题中得到错误

您可以在设置为填充参数集合的SqlCommand对象上使用SqlCommandBuilder.DeriveParameters,但这不会告诉您可选参数和必需参数之间的区别。您可以假设所有存储过程参数都是必需的,但这是一个糟糕的想法。存储过程通常允许您传递各种参数组合,并进行适当的操作。例如,搜索存储过程可能包含大量参数,但只需要指定真正要搜索的参数;或者,存储过程可能具有特定参数的默认值,并且只有在希望更改行为时才希望指定显式值

要真正区分两者之间的区别,您需要使用SQLServerSMOAPI。这应该作为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.
    }
}

您可以在和中查看更多信息。特别是,第二个问题讨论了通过告诉SMO不要加载一些您不关心的信息来加速此过程的方法。

在SQL Server术语中,所需参数是没有默认值的任何参数,例如:

CREATE PROCEDURE Foo
(
  @Required INT,
  @NotRequired INT = NULL
)
在这种情况下,您可以在不使用@NotRequired参数的情况下调用该过程,但在没有@Required参数的情况下无法调用该过程-您将在问题中得到错误

您可以在设置为填充参数集合的SqlCommand对象上使用SqlCommandBuilder.DeriveParameters,但这不会告诉您可选参数和必需参数之间的区别。您可以假设所有存储过程参数都是必需的,但这是一个糟糕的想法。存储过程通常允许您传递各种参数组合,并进行适当的操作。例如,搜索存储过程可能包含大量参数,但只需要指定真正要搜索的参数;或者,存储过程可能具有特定参数的默认值,并且只有在希望更改行为时才希望指定显式值

要真正区分两者之间的区别,您需要使用SQLServerSMOAPI。这应该作为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.
    }
}

您可以在和中查看更多信息。特别是,第二个问题涉及如何通过告诉SMO不要加载一些您不关心的信息来加速此过程。

我想从C中的给定sp获取一个参数列表,而不是SQL server中的参数列表。重复的问题涉及如何获取进程的参数列表,但它没有涵盖此问题的真正需要,这就是如何获得所需参数的列表,即没有proc默认值的参数。关于这一点,请看下面的答案:我想从C语言中的给定sp获取一个参数列表,而不是SQL server。重复的问题涉及如何获取进程的参数列表,但它没有涵盖这个问题的真正需要,即如何获取所需参数列表,即没有进程默认值的参数。为此,请参见以下答案:谢谢。它起作用了。这是我的密码SqlCommandBuilder.DeriveParametersSqlCmd;SqlCmd.Parameters{}中的foreach SqlParameter参数----------谢谢。注意,这实际上并没有告诉您这些参数是必需的还是可选的;这一信息要难得多。我马上会有答案的。谢谢。它起作用了。这是我的密码SqlCommandBuilder.DeriveParametersSqlCmd;foreach SqlParameter参数
SqlCmd.Parameters{}----谢谢。注意,这实际上并没有告诉您参数是必需的还是可选的;这一信息要难得多。Michael,我收到一个错误“Microsoft.SqlServer.Management.Server”不包含“Connect”的定义,我还检查了“Server”类的页面,它没有具有该名称的方法,请解释。是的,抱歉,这是一个转录错误。这是ConnectionContext.Connect.Michael,我收到一个错误“Microsoft.SqlServer.Management.Server”不包含“Connect”的定义,我还检查了“Server”类的页面,它没有具有该名称的方法,请解释。是的,抱歉,这是一个转录错误。是ConnectionContext.Connect。