web-dev-qa-db-fra.com

SQL/C # - Meilleure méthode pour exécuter une requête

J'ai besoin d'exécuter une requête SQL à partir d'une classe c #. J'ai pensé à 2 options

  1. Démarrer un processus de sqlcmd.
  2. Utiliser un objet SqlCommand.

Ma question est quelle serait la meilleure solution? Il est important que la solution ne conserve une connexion au serveur que pendant une courte période.

Je suis ouvert à d'autres idées si ce qui précède n'est pas bon.

Merci d'avance.

17
Ash Burlaczenko

Utilisez un SqlCommand. Ce code ne gardera la connexion active que pendant une très courte période (tant que votre requête est performante):

DataTable results = new DataTable();

using(SqlConnection conn = new SqlConnection(connString))
    using(SqlCommand command = new SqlCommand(query, conn))
        using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command))
           dataAdapter.Fill(results);
29
Justin Niessner

De MSDN:

L'exemple suivant crée un SqlConnection, un SqlCommand et un SqlDataReader. L'exemple lit les données et les écrit sur la console. Enfin, l'exemple ferme le SqlDataReader, puis le SqlConnection lorsqu'il quitte les blocs de code Using.

private static void ReadOrderData(string connectionString)
{
    string queryString = 
        "SELECT OrderID, CustomerID FROM dbo.Orders;";
    using (SqlConnection connection = new SqlConnection(
               connectionString))
    {
        SqlCommand command = new SqlCommand(
            queryString, connection);
        connection.Open();
        SqlDataReader reader = command.ExecuteReader();
        try
        {
            while (reader.Read())
            {
                Console.WriteLine(String.Format("{0}, {1}",
                    reader[0], reader[1]));
            }
        }
        finally
        {
            // Always call Close when done reading.
            reader.Close();
        }
    }
}
7
Shaun Mason

Ça dépend. Si vous ne vous souciez pas du résultat de la requête, un processus utilisant sqlcmd peut être OK. Si par contre vous avez besoin de contrôler les résultats, il serait préférable d'utiliser ADO.NET. Pour éviter de garder la connexion ouverte pendant longtemps, désactivez le regroupement de connexions ADO.NET en ajoutant Pooling=false à votre chaîne de connexion:

using (var conn = new SqlConnection("Data Source=server;Initial Catalog=somedb;User Id=foo;Password=secret;Pooling=false"))
using (var cmd = conn.CreateCommand())
{
    conn.Open();
    cmd.CommandText = "DELETE FROM foo";
    var result = cmd.ExecuteNonQuery();
}
4
Darin Dimitrov

Je pense que SqlCommand est une bonne idée, mais gardez à l'esprit que cette classe n'est disponible que lors de la connexion à SQL Server. Vous aurez besoin d'un autre type de classe Command/Connection si vous utilisez Oracle ou d'une connexion OleDb à une autre base de données. Tous les objets de commande de données héritent de DbCommand , donc je voudrais lire à ce sujet.

0
Steve Danner

Je pense que SqlCommand est un gagnant clair car il n'est pas nécessaire de câbler un processus différent. Vous pouvez fermer la connexion à la base de données dès que vous en avez terminé.

Et ensuite, vous pouvez également distribuer l'application sur des ordinateurs pour lesquels sqlcmd n'est pas disponible.

0
Adam Lear