【发布时间】:2011-03-03 13:47:44
【问题描述】:
我希望找到一种简单的方法来获取存储过程参数的参数列表。如果程序有 3 个参数,我想要一个这样的列表:
参数1
参数2
参数3
最好能够在 C# 代码中执行此操作,但 SQL 也足够了。想法?
【问题讨论】:
标签: c# sql sql-server-2008 stored-procedures parameters
我希望找到一种简单的方法来获取存储过程参数的参数列表。如果程序有 3 个参数,我想要一个这样的列表:
参数1
参数2
参数3
最好能够在 C# 代码中执行此操作,但 SQL 也足够了。想法?
【问题讨论】:
标签: c# sql sql-server-2008 stored-procedures parameters
如果您熟悉企业库,有一个很好的方法允许使用DiscoverParameters(),使用Data Access Application Block。
DbCommand command = new DbCommand();
command.CommandText = @"myStoredProc";
command.CommandType = CommandType.StoredProcedure;
Database database = new SqlDatabase(myConnectionString);
database.DiscoverParameters(command);
// ...
一些可能有帮助的链接:
以上链接是指EntLib 3.1。根据您使用的 .NET Framework 版本,您还可以考虑按照 this link 为您下载正确的 EntLib 版本。
【讨论】:
select * from information_schema.parameters
where specific_name='your_procedure_name'
也可以参考这篇文章了解更多方法 https://exploresql.com/2016/10/14/different-methods-to-get-parameter-list-of-a-stored-procedure/
【讨论】:
对于 SQL Server,这应该可以工作。
private void ListParms()
{
SqlConnection conn = new SqlConnection("my sql connection string");
SqlCommand cmd = new SqlCommand("proc name", conn);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
SqlCommandBuilder.DeriveParameters(cmd);
foreach (SqlParameter p in cmd.Parameters)
{
Console.WriteLine(p.ParameterName);
}
}
【讨论】:
您无需接触 SqlConnection 就可以做到这一点,我认为这是一个好处。
这使用SqlServer.Management.Smo 命名空间,因此您需要在项目中引用Microsoft.SqlServer.ConnectionInfo、Microsoft.SqlServer.Management.Sdk 和Microsoft.SqlServer.Smo。
然后使用以下代码:
Server srv = new Server("serverNameHere");
srv.ConnectionContext.AutoDisconnectMode = AutoDisconnectMode.NoAutoDisconnect;
srv.ConnectionContext.LoginSecure = false; //if using username/password
srv.ConnectionContext.Login = "username";
srv.ConnectionContext.Password = "password";
srv.ConnectionContext.Connect();
Database db = srv.Databases["databaseNameHere"];
foreach(StoredProcedure sp in db.StoredProcedures)
{
foreach(var param in sp.Parameters)
{
string paramName = param.Name;
var dataType = param.DataType;
object defaultValue = param.DefaultValue;
}
}
【讨论】: