获取ADO.NET CommandText的参数

时间:2016-01-23 21:02:02

标签: c# sql .net ado.net

有没有办法(甚至可能在ADO.NET中)获取CommandText的参数列表?

也就是说,给出以下查询:

INSERT INTO TABLE test VALUES(@value1, @value2)

有没有办法知道查询参数是value1,value2?或者我是否应该自己解析查询以查找它们(当然' @'语法可能会从一个数据库引擎更改为其他...)

澄清:

我想在填写命令参数字典之前知道参数名称和查询中的顺序。

2 个答案:

答案 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