Могу ли я сказать, является ли DoCommand ado.net запросом или нет (перед его выполнением) - PullRequest
0 голосов
/ 13 октября 2010

Я пытаюсь написать скрипт Powershell для выполнения общей команды SQL для базы данных.Идея состоит в том, что Run-SQL "select ..." будет запускать текст SQL для открытой в данный момент базы данных.Если оператор SQL является запросом, он должен вернуть DataTable.Если это не запрос (DDL или DML), он не должен возвращать ничего ($ null).

Чтобы сделать это, мне нужно знать, какой метод (ExecuteReader или ExecuteNonQuery) выполнить с командой.Есть ли способ определить это?(Я рад подготовить команду, если это поможет).

В качестве альтернативы я могу добавить аргумент -query, который будет предоставлен пользователем, который различает два случая, но как потенциальный пользователь,Я нахожу это раздражающим (поскольку, на мой взгляд, я уже сказал, является ли это запросом по SQL, который я использовал, зачем повторять?)

Мой ключ используется для баз данных Oracle, поэтому Oracle-конкретный ответ у меня хорошо, хотя я бы предпочел что-то общее.

Ответы [ 2 ]

1 голос
/ 13 октября 2010

Я думаю, вы могли бы просто использовать 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 голосов
/ 14 октября 2010

В качестве альтернативы тому, что сказал Кит, вы можете попробовать


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

Обрезка есть в случае, если команда SQL имеет начальный пробел, так как $ sql = 'select' не будет совпадать с '^ select'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...