我可以判断 ado.net DbCommand 是不是是查询(在执行之前)
Posted
技术标签:
【中文标题】我可以判断 ado.net DbCommand 是不是是查询(在执行之前)【英文标题】:Can I tell if an ado.net DbCommand is a query or not (before executing it)我可以判断 ado.net DbCommand 是否是查询(在执行之前) 【发布时间】:2010-10-13 13:17:11 【问题描述】:我正在尝试编写一个 Powershell 脚本来针对数据库运行一般 SQL 命令。这个想法是 Run-SQL "select ..." 将针对当前打开的数据库运行 SQL 文本。如果 SQL 语句是一个查询,它应该返回一个 DataTable。如果它是非查询(DDL 或 DML),则不应返回任何内容($null)。
为了做到这一点,我需要知道对命令执行哪个方法(ExecuteReader 或 ExecuteNonQuery)。有没有办法确定这一点? (如果有帮助,我很乐意准备命令)。
作为替代方案,我可以添加一个由用户提供的 -query 参数,以区分这两种情况,但作为潜在用户,我会觉得这很烦人(在我看来,我已经说过是不是我用的SQL查询,为什么再说一遍?)
我的主要用途是 Oracle 数据库,因此我可以使用特定于 Oracle 的答案,尽管我更喜欢通用的。
【问题讨论】:
【参考方案1】:我认为无论是否是查询,您都可以使用 ExecuteReader。这可能有点矫枉过正,但在一些快速实验中,执行 UPDATE($reader 不返回任何内容)和 COUNT($reader[0] 输出标量结果) - 它似乎可以工作。
$connstr = "server=.\SQLEXPRESS;Database=AdventureWorks;" +
"Integrated Security=true;Persist Security Info=False"
$conn = new-object System.Data.SqlClient.SqlConnection $connstr
#$query = "UPDATE Production.Product SET Name = 'ACME' WHERE Name = 'Blade'"
$query = "SELECT Count(*) FROM Production.Product"
$cmd = new-object System.Data.SqlClient.SqlCommand $query,$conn
$conn.Open()
try
$reader = $cmd.ExecuteReader()
while ($reader.Read())
$reader[0]
finally
$conn.Dispose()
【讨论】:
我确信我已经尝试过了,但你是对的,它工作正常。谢谢!【参考方案2】:作为 Keith 所说的替代方法,您可以尝试
$sql = 'Select count(1) From SomeTable;'
$sql = $sql.TrimStart(' ')
if ($sql -match "^select") Write-Host 'ExecuteReader'
else Write-Host 'ExecuteNonQuery'
如果 SQL 命令有一个前导空格,因为 $sql = ' select ' 将不匹配 "^select"
【讨论】:
以上是关于我可以判断 ado.net DbCommand 是不是是查询(在执行之前)的主要内容,如果未能解决你的问题,请参考以下文章