繁体   English   中英

获取ADO.NET CommandText的参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM