J'ai besoin d'exécuter une requête SQL à partir d'une classe c #. J'ai pensé à 2 options
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.
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);
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();
}
}
}
Ç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();
}
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.
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.