2010-10-13 8 views
0

J'essaye d'écrire un script Powershell pour exécuter une commande SQL générale sur une base de données. L'idée est que Run-SQL "select ..." exécutera le texte SQL par rapport à la base de données actuellement ouverte. Si l'instruction SQL est une requête, elle doit renvoyer un DataTable. S'il s'agit d'une non-requête (DDL ou DML), elle ne devrait rien renvoyer ($ null). Pour ce faire, j'ai besoin de savoir quelle méthode (ExecuteReader ou ExecuteNonQuery) exécuter à l'encontre de la commande. Y a-t-il un moyen de déterminer cela? (Je suis heureux de préparer la commande si cela aide). Comme alternative, je peux ajouter un argument -query à fournir par l'utilisateur, qui distingue les deux cas, mais en tant qu'utilisateur potentiel, je trouverais cela agaçant (comme, à mon avis, j'ai déjà si c'est une requête par le SQL j'ai utilisé, pourquoi dire encore?)Puis-je savoir si un DbCommand ado.net est une requête ou non (avant de l'exécuter)

Mon utilisation principale est pour des bases de données d'Oracle, ainsi une réponse spécifique d'Oracle est OK avec moi, bien que je préfère quelque chose de générique.

Répondre

1

Je pense que vous pourriez simplement utiliser ExecuteReader s'il s'agit d'une requête ou non. C'est peut-être exagéré mais dans quelques expériences rapides avec faire un UPDATE ($ reader ne retourne rien) et COUNT ($ reader [0] produit le résultat scalaire) - cela semble juste fonctionner.

$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

J'étais sûr d'avoir essayé, mais vous avez raison, cela fonctionne très bien. Merci! –

0

Comme alternative à ce que Keith a dit que vous pourriez essayer


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

La garniture est là au cas où la commande SQL dispose d'un espace de premier plan depuis $ sql = « select » ne correspondra pas à «^sélectionnez "

Questions connexes