我可以判断 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 是不是是查询(在执行之前)的主要内容,如果未能解决你的问题,请参考以下文章

向 IDbCommand 添加参数

ADO.net五大对象

ADO.NET 实体框架与 NHibernate [关闭]

ADO.Net技术

使用 ADO.NET 流畅的 NHibernate 地图

ADO.NET,数据库N万条数据操作