2010-09-17 31 views
17

Necesito ejecutar una consulta SQL desde dentro de una clase C#. He pensado en 2 opcionesSQL/C# - El mejor método para ejecutar una consulta

  1. Comenzando un proceso de sqlcmd.
  2. Usando un objeto SqlCommand.

Mi pregunta es, ¿cuál sería la mejor manera? Es importante que la solución solo tenga una conexión con el servidor por un corto tiempo.

Estoy abierto a otras ideas si lo anterior no es bueno.

Gracias de antemano.

+0

¿espera que se devuelva un conjunto de registros a su aplicación o simplemente intenta ejecutar una consulta y continuar? – AndHeCodedIt

+0

¿Desea evitar específicamente la agrupación de conexiones o solo está intentando seguir las mejores prácticas? – RedFilter

+0

Perdón por no ser claro. No, la consulta es una inserción y el resultado no es necesario. –

Respuesta

28

Utilice un SqlCommand. Este código sólo a mantener la conexión activa durante un período muy corto de tiempo (el tiempo que su consulta es performant):

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); 
+0

Depende de si mantendrá la conexión activa durante un breve período de tiempo. Si no tiene cuidado, puede mantener la conexión e incluso una sola conexión, pero muchas de ellas permanecen abiertas durante toda la vida de la aplicación. Ver mi respuesta para más detalles. –

+0

¿Cómo puedo lograr con lo que estoy tratando de hacer con su código: http: // stackoverflow.com/questions/23617661/why-the-sql-command-is-not-executing – SearchForKnowledge

0

Creo SqlCommand es un claro ganador, ya que no es necesario cablear una diferente proceso. Puede cerrar la conexión de la base de datos tan pronto como haya terminado con ella.

Y luego también puede distribuir la aplicación a las máquinas que no tienen disponible sqlcmd.

3

Depende. Si no le importa el resultado de la consulta, es probable que el proceso que utiliza sqlcmd sea correcto. Si, por otro lado, necesita controlar los resultados, sería mejor usar ADO.NET. Para evitar mantener la conexión abierta durante mucho tiempo asegúrese de desactivar ADO.NET connection pooling añadiendo Pooling=false a la cadena de conexión:

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

Nitpick: A mi leal saber y entender, Windows no tiene ningún proceso de bifurcación. –

7

De MSDN:

El siguiente ejemplo crea un SqlConnection, SqlCommand, y una SqlDataReader. El ejemplo lee los datos y los escribe en la consola. Finalmente, el ejemplo cierra el SqlDataReader y luego el SqlConnection a medida que sale del uso de los bloques de código.

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

Creo que SqlCommand es una buena idea, pero tenga en cuenta que esta clase solo está disponible cuando se conecta a SQL Server. Necesitará otro tipo de clases de Comando/Conexión si está tratando con Oracle o una conexión OleDb con alguna otra base de datos. Todos los objetos de comando de datos heredan de DbCommand, así que leería sobre eso.

Cuestiones relacionadas