2010-10-13 59 views
0

我試圖寫一個PowerShell腳本來對數據庫運行一般的SQL命令。這個想法是,運行SQL「select ...」將針對當前打開的數據庫運行SQL文本。如果SQL語句是查詢,它應該返回一個DataTable。如果它是非查詢(DDL或DML),它應該不返回任何內容($ null)。我能告訴如果ado.net的DbCommand是查詢還是沒有(在執行前)

爲了做到這一點,我需要知道哪些方法(或的ExecuteReader的ExecuteNonQuery)執行對命令。有沒有辦法確定這一點? (如果有幫助,我很樂意準備這個命令)。

作爲替代方案,我可以添加一個-query參數,由用戶提供,區分這兩種情況,但作爲一個潛在用戶,我會覺得這很煩人(因爲在我看來,我已經說無論是由我使用的SQL,爲什麼再說一遍?)

我最主要的用途就是Oracle數據庫,所以一個Oracle特定的答案是我OK,但我喜歡的東西通用的查詢。

回答

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() 
} 
+0

我確信我會嘗試這樣做,但你說得對,它工作正常。謝謝! – 2010-10-22 21:52:22

0

作爲替代什麼基思說,你可以嘗試


$sql = 'Select count(1) From SomeTable;' 
$sql = $sql.TrimStart(' ') 
if ($sql -match "^select") { Write-Host 'ExecuteReader' } 
else { Write-Host 'ExecuteNonQuery'} 

裝飾有萬一SQL命令從此$ SQL前導空格=「選擇」不匹配「^選擇」

相關問題