[英]Get parameters for a ADO.NET CommandText
是否有任何方法(甚至在ADO.NET中)也可以获取CommandText的参数列表?
也就是说,给定以下查询:
INSERT INTO TABLE test VALUES(@value1, @value2)
有什么方法可以知道查询参数是value1,value2吗? 还是我必须自行解析查询才能找到它们(当然,“ @”语法可能会从一个数据库引擎更改为其他数据库引擎...)?
澄清:
我想在必须填写命令参数字典之前了解查询中的参数名称和顺序。
您可以使用SqlParameterCollection.Count
属性来获取该信息。
所以你可以喜欢
SqlCommand cmd = new SqlCommand("insert into table test values(@value1, @value2)", con);
cmd.Parameters.Add("@value1", SqlDbType.VarChar).Value = "test";
cmd.Parameters.Add("@value2", SqlDbType.VarChar).Value = "test";
int count = cmd.Parameters.Count; // you get the parameter count
您也可以使用参数集合来获取参数名称,例如
string p1 = cmd.Parameters[0].ParameterName;
string p2 = cmd.Parameters[1].ParameterName;
不完全确定查询中参数顺序的含义
如果查询是存储过程,则可以使用SqlCommandBuilder.DeriveParameter
s(请参见如何从SQL Server中的存储过程中检索参数列表 )。 但是,不幸的是,仅适用于CommandType=StoredProcedure
在SQL Server 2012(及更高版本)中,可以使用sp_describe_undeclared_parameters
(请参阅https://msdn.microsoft.com/zh-cn/library/ff878260.aspx )
除了直接解析SQL查询文本(正则表达式,或者可能使用SSDT附带的SQLDOM(或通过nuget))外,似乎没有其他选择可用于较低版本: https ://blogs.msdn.microsoft.com/ arvindsh / 2013/04/04 /(使用-transactsql-scriptdom-parser-get-statement-counts / )
编辑:使用Microsoft.SqlServer.TransactSql.ScriptDom
nuget查找参数的简单F#示例:
#r "Microsoft.SqlServer.TransactSql.ScriptDom"
open System.IO
open System.Collections.Generic
open Microsoft.SqlServer.TransactSql.ScriptDom
let query = @"select * from dbo.Customers where FirstName=@FirstName"
let parser = new TSql120Parser(true)
let errors : ref<IList<ParseError>> = ref(null)
let frag = parser.Parse(new StringReader(query), errors) // the actual work
frag.ScriptTokenStream
|> Seq.filter (fun f -> f.TokenType = TSqlTokenType.Variable)
|> Seq.iter (fun t -> (printfn "Type = %A; Name = %s" t.TokenType t.Text))
输出
Type = Variable; Name = @FirstName
...但是,如果脚本中包含临时变量,则您很容易得到误报,例如:
declare @temp nvarchar(50) = @FirstName
select * from dbo.Customers where FirstName=@temp
...发现两次@temp 和 @FirstName
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.