Compartir a través de


ADO.NET y LINQ to SQL

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

LINQ to SQL and ADO.NET

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.

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

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 solo cuando hay varias conexiones en el ámbito de la transacción.

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

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:

            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"
);
    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")

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.

Parámetros

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

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

Nota

Los parámetros se expresan en el texto de la consulta con la misma notación con llaves que 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).

Consulte también