Langue
Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Important
N’utilisez pas System.Data.SqlClient pour le nouveau développement. Utilisez Microsoft.Data.SqlClient pour le nouveau code d’accès aux données SQL Server. Ces exemples conservent System.Data.SqlClient, car le fournisseur LINQ to SQL intégré de .NET Framework en a besoin. Le simple fait de modifier le type de connexion ne permet pas de migrer LINQ to SQL.
LINQ to SQL fait partie de la famille de technologies ADO.NET. Il est basé sur les services fournis par le modèle de fournisseur de ADO.NET. Vous pouvez donc combiner du code LINQ to SQL avec des applications ADO.NET existantes et migrer des solutions de ADO.NET actuelles vers LINQ to SQL. L’illustration suivante fournit une vue générale de la relation.
Connexions
Vous pouvez fournir une connexion ADO.NET existante lorsque vous créez une connexion LINQ to SQL DataContext. Toutes les opérations sur le DataContext (y compris les requêtes) utilisent cette connexion fournie. Si la connexion est déjà ouverte, LINQ to SQL la laisse telle quelle lorsque vous avez terminé avec elle.
// Do not use System.Data.SqlClient for new development; use Microsoft.Data.SqlClient.
// LINQ to SQL's built-in provider requires System.Data.SqlClient.
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();
' Do not use System.Data.SqlClient for new development; use Microsoft.Data.SqlClient.
' LINQ to SQL's built-in provider requires System.Data.SqlClient.
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(northwindCon)
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()
Vous pouvez toujours accéder à la connexion et la fermer vous-même à l’aide de la Connection propriété, comme dans le code suivant :
// Do not use System.Data.SqlClient for new development; use Microsoft.Data.SqlClient.
// LINQ to SQL's built-in provider requires System.Data.SqlClient.
db.Connection.Close();
' Do not use System.Data.SqlClient for new development; use Microsoft.Data.SqlClient.
' LINQ to SQL's built-in provider requires System.Data.SqlClient.
db.Connection.Close()
Opérations
Vous pouvez fournir à votre DataContext votre propre transaction de base de données lorsque votre application a déjà initialisé la transaction et que vous souhaitez impliquer votre DataContext.
La méthode recommandée pour effectuer des transactions avec .NET Framework consiste à utiliser l’objet TransactionScope . À l’aide de cette approche, vous pouvez effectuer des transactions distribuées qui fonctionnent entre des bases de données et d’autres gestionnaires de ressources résidant en mémoire. Les portées de transactions requièrent des ressources pour démarrer. Ils passent à des transactions distribuées uniquement lorsqu'il y a plusieurs connexions dans le cadre de la transaction.
// Do not use System.Data.SqlClient for new development; use Microsoft.Data.SqlClient.
// LINQ to SQL's built-in provider requires System.Data.SqlClient.
using (TransactionScope ts = new TransactionScope())
{
db.SubmitChanges();
ts.Complete();
}
' Do not use System.Data.SqlClient for new development; use Microsoft.Data.SqlClient.
' LINQ to SQL's built-in provider requires System.Data.SqlClient.
Using ts As New TransactionScope()
db.SubmitChanges()
ts.Complete()
End Using
Vous ne pouvez pas utiliser cette approche pour toutes les bases de données. Par exemple, la connexion SqlClient ne peut pas promouvoir les transactions système lorsqu’elle fonctionne sur un serveur SQL Server 2000. Elle s’inscrit automatiquement à une transaction distribuée complète à chaque fois qu’elle voit qu’une portée de transaction est utilisée.
Commandes SQL directes
Parfois, vous pouvez rencontrer des situations où la possibilité d’interroger DataContext ou d’envoyer des modifications est insuffisante pour la tâche spécialisée que vous souhaitez effectuer. Dans ces circonstances, vous pouvez utiliser la ExecuteQuery méthode pour émettre des commandes SQL dans la base de données et convertir les résultats de la requête en objets.
Par exemple, supposons que les données de la Customer classe sont réparties sur deux tables (customer1 et customer2). La requête suivante retourne une séquence d’objets Customer :
// Do not use System.Data.SqlClient for new development; use Microsoft.Data.SqlClient.
// LINQ to SQL's built-in provider requires System.Data.SqlClient.
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"
);
' Do not use System.Data.SqlClient for new development; use Microsoft.Data.SqlClient.
' LINQ to SQL's built-in provider requires System.Data.SqlClient.
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")
Pour matérialiser les entités mappées Customer, retournez des colonnes qui correspondent à leurs propriétés mappées et incluent CustomerID, la clé primaire.
Paramètres
La ExecuteQuery méthode accepte les paramètres. Le code suivant exécute une requête paramétrable :
// Do not use System.Data.SqlClient for new development; use Microsoft.Data.SqlClient.
// LINQ to SQL's built-in provider requires System.Data.SqlClient.
IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
"select CustomerID, ContactName from customers where city = {0}",
"London"
);
' Do not use System.Data.SqlClient for new development; use Microsoft.Data.SqlClient.
' LINQ to SQL's built-in provider requires System.Data.SqlClient.
Dim results As IEnumerable(Of Customer) = _
db.ExecuteQuery(Of Customer)( _
"SELECT CustomerID, ContactName FROM customers WHERE city = {0}", _
"London")
End Sub
Remarque
Les paramètres sont exprimés dans le texte de requête à l’aide de la même notation curly utilisée par Console.WriteLine() et String.Format().
String.Format() prend la chaîne de requête que vous fournissez et remplace les paramètres accoladés par des noms de paramètres générés tels que @p0, @p1 ..., @p(n).