Compartir a través de


ADO.NET y LINQ to SQL

Actualización: November 2007

LINQ to SQL forma parte de la familia de tecnologías ADO.NET. Se basa en los servicios proporcionados por el modelo de proveedor ADO.NET. Por lo tanto, se puede mezclar código LINQ to SQL con aplicaciones ADO.NET existentes y migrar las soluciones ADO.NET actuales a LINQ to SQL. La ilustración siguiente proporciona una visión de alto nivel de la relación.

Conexiones

Puede proporcionar una conexión de ADO.NET existente al crear un DataContext de LINQ to SQL. Todas las operaciones que se realicen en DataContext (incluidas las consultas) utilizan la conexión proporcionada. Si la conexión ya está abierta, LINQ to SQL la deja como estaba cuando haya terminado de usarla.

Dim conString = "Data Source=.\SQLEXPRESS;AttachDbFilename=c:\northwind.mdf; Integrated Security=True;Connect Timeout=30;User Instance=True"
Dim northwindCon = New SqlConnection(conString)
northwindCon.Open()

Dim db = New Northwnd("...")
Dim northwindTransaction = northwindCon.BeginTransaction()

Try
    Dim cmd = New SqlCommand( _
            "UPDATE Products SET QuantityPerUnit = 'single item' " & _
            "WHERE ProductID = 3")
    cmd.Connection = northwindCon
    cmd.Transaction = northwindTransaction
    cmd.ExecuteNonQuery()

    db.Transaction = northwindTransaction

    Dim prod1 = (From prod In db.Products _
  Where prod.ProductID = 4).First
    Dim prod2 = (From prod In db.Products _
  Where prod.ProductID = 5).First
    prod1.UnitsInStock -= 3
    prod2.UnitsInStock -= 5

    db.SubmitChanges()

    northwindTransaction.Commit()

Catch e As Exception

    Console.WriteLine(e.Message)
    Console.WriteLine("Error submitting changes... " & _
"all changes rolled back.")
End Try

northwindCon.Close()
string connString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=c:\northwind.mdf;
    Integrated Security=True; Connect Timeout=30; User Instance=True";
SqlConnection nwindConn = new SqlConnection(connString);
nwindConn.Open();

Northwnd interop_db = new Northwnd(nwindConn);

SqlTransaction nwindTxn = nwindConn.BeginTransaction();

try
{
    SqlCommand cmd = new SqlCommand(
        "UPDATE Products SET QuantityPerUnit = 'single item' WHERE ProductID = 3");
    cmd.Connection = nwindConn;
    cmd.Transaction = nwindTxn;
    cmd.ExecuteNonQuery();

    interop_db.Transaction = nwindTxn;

    Product prod1 = interop_db.Products
        .First(p => p.ProductID == 4);
    Product prod2 = interop_db.Products
        .First(p => p.ProductID == 5);
    prod1.UnitsInStock -= 3;
    prod2.UnitsInStock -= 5;

    interop_db.SubmitChanges();

    nwindTxn.Commit();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    Console.WriteLine("Error submitting changes... all changes rolled back.");
}

nwindConn.Close();

Siempre puede tener acceso a la conexión y cerrarla usted mismo utilizando la propiedad Connection, como en el código siguiente:

db.Connection.Close()
db.Connection.Close(); 

Transacciones

Puede proporcionar DataContext con su propia transacción de base de datos si la aplicación ya ha iniciado la transacción y desea incluir en ella su DataContext.

El método preferido para realizar transacciones con .NET Framework es utilizar el objeto TransactionScope. Con este enfoque, puede realizar transacciones distribuidas que funcionan entre bases de datos y otros administradores de recursos residentes en memoria. Los ámbitos de transacción requieren pocos recursos para iniciarse. Se promueven a sí mismos a transacciones distribuidas sólo cuando hay varias conexiones en el ámbito de la transacción.

Using ts As New TransactionScope()
    db.SubmitChanges()
    ts.Complete()
End Using
using (TransactionScope ts = new TransactionScope())
{
    db.SubmitChanges();
    ts.Complete();
}

No puede utilizar este enfoque para todas las bases de datos. Por ejemplo, la conexión de SqlClient no puede promover las transacciones del sistema cuando funciona en un servidor SQL Server 2000. En su lugar, se da de alta automáticamente en una transacción distribuida completa cada vez que detecta que se utiliza un ámbito de transacción.

Comandos SQL directos

A veces pueden darse situaciones en las que la capacidad de DataContext para realizar consultas o enviar cambios es insuficiente para la tarea especializada que se desea realizar. En estas circunstancias, se puede utilizar el método ExecuteQuery para emitir comandos SQL a la base de datos y convertir los resultados de la consulta en objetos.

Por ejemplo, supongamos que los datos de la clase Customer ocupan dos tablas (customer1 y customer2). La consulta siguiente devuelve una secuencia de objetos Customer:

    Dim results As IEnumerable(Of Customer) = _
db.ExecuteQuery(Of Customer)( _
"SELECT [c1].custID as CustomerID," & _
    "[c2].custName as ContactName" & _
    "FROM customer1 AS [c1], customer2 as [c2]" & _
    "WHERE [c1].custid = [c2].custid")
            IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
    @"select c1.custid as CustomerID, c2.custName as ContactName
        from customer1 as c1, customer2 as c2
        where c1.custid = c2.custid"
);

Siempre y cuando los nombres de columna de los resultados tabulares coincidan con las propiedades de columna de la clase de entidad, LINQ to SQL crea objetos a partir de cualquier consulta SQL.

Parameters

El método ExecuteQuery acepta parámetros: El código siguiente ejecuta una consulta parametrizada:

    Dim results As IEnumerable(Of Customer) = _
db.ExecuteQuery(Of Customer)( _
    "SELECT contactname FROM customers WHERE city = {0}, 'London'")
End Sub
            IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
    "select contactname from customers where city = {0}",
    "London"
);
Nota:

Los parámetros se expresan en el texto de la consulta con la misma notación con llaves utilizada por Console.WriteLine() y String.Format(). String.Format() toma la cadena de consulta proporcionada y sustituye los parámetros entre llaves por nombres de parámetros generados, como @p0, @p1 …, @p(n).

Vea también

Tareas

Cómo: Volver a usar una conexión entre un comando ADO.NET y DataContext (LINQ to SQL)

Otros recursos

Información general (LINQ to SQL)