有没有办法(甚至可能在ADO.NET中)获取CommandText的参数列表?
也就是说,给出以下查询:
INSERT INTO TABLE test VALUES(@value1, @value2)
有没有办法知道查询参数是value1,value2?或者我是否应该自己解析查询以查找它们(当然' @'语法可能会从一个数据库引擎更改为其他...)
澄清:
我想在填写命令参数字典之前知道参数名称和查询中的顺序。
答案 0 :(得分:0)
您可以使用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;
不完全确定查询中参数顺序的含义
答案 1 :(得分:0)
如果查询是存储过程,则可以使用SqlCommandBuilder.DeriveParameter
s(请参阅How can I retrieve a list of parameters from a stored procedure in SQL Server)。但遗憾的是,这仅适用于CommandType=StoredProcedure
在SQL Server 2012(及更高版本)中,您可以使用sp_describe_undeclared_parameters
(请参阅https://msdn.microsoft.com/en-us/library/ff878260.aspx)
除了直接解析SQL查询文本(正则表达式,或者可能使用SSDT附带的SQLDOM(或通过nuget))之外,对于较低版本似乎没有任何替代方法:https://blogs.msdn.microsoft.com/arvindsh/2013/04/04/using-the-transactsql-scriptdom-parser-to-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