ADO.NET および LINQ to SQLADO.NET and LINQ to SQL

LINQ to SQLLINQ to SQL一部である、ADO.NETADO.NETテクノロジ ファミリ。 is part of the ADO.NETADO.NET family of technologies. ADO.NETADO.NET プロバイダー モデルから提供されるサービスに基づいて動作します。It is based on services provided by the ADO.NETADO.NET provider model. そのために混合できますLINQ to SQLLINQ to SQLコードを既存ADO.NETADO.NETアプリケーションさせ、現在ADO.NETADO.NETの解決策をLINQ to SQLLINQ to SQLです。You can therefore mix LINQ to SQLLINQ to SQL code with existing ADO.NETADO.NET applications and migrate current ADO.NETADO.NET solutions to LINQ to SQLLINQ to SQL. 次の図は、この関係を高いレベルから見たものです。The following illustration provides a high-level view of the relationship.

LINQ to SQL および ADO.NETLINQ to SQL and ADO.NET

接続Connections

既存を指定することができますADO.NETADO.NET接続を作成するとき、 LINQ to SQLLINQ to SQL DataContextです。You can supply an existing ADO.NETADO.NET connection when you create a LINQ to SQLLINQ to SQL DataContext. すべての操作に対して、 DataContext (クエリを含む) には、この接続を使用します。All operations against the DataContext (including queries) use this provided connection. 場合は、接続が開いてLINQ to SQLLINQ to SQLは操作を終了するときにそのままです。If the connection is already open, LINQ to SQLLINQ to SQL leaves it as is when you are finished with it.

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

次のコードに示すとおり、Connection プロパティを使用して、いつでも接続にアクセスしたり、任意に閉じたりすることができます。You can always access the connection and close it yourself by using the Connection property, as in the following code:

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

トランザクションTransactions

既に独自のデータベース トランザクションを初期化していて、DataContext をトランザクションに使用する必要がある場合は、DataContext をトランザクションに渡すことができます。You can supply your DataContext with your own database transaction when your application has already initiated the transaction and you want your DataContext to be involved.

.NET Framework.NET Framework でトランザクションを実行する場合は、TransactionScope オブジェクトの使用をお勧めします。The preferred method of doing transactions with the .NET Framework.NET Framework is to use the TransactionScope object. この方法を使うと、データベースと他のメモリ常駐リソース マネージャー間で動作する分散トランザクションを作成できます。By using this approach, you can make distributed transactions that work across databases and other memory-resident resource managers. トランザクション スコープは、わずかなリソースで開始されます。Transaction scopes require few resources to start. トランザクションのスコープ内に複数の接続がある場合のみ、このトランザクションは分散トランザクションに昇格します。They promote themselves to distributed transactions only when there are multiple connections within the scope of the transaction.

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

この方法は、すべてのデータベースに使用できるわけではありません。You cannot use this approach for all databases. たとえば、SqlClient 接続を SQL Server 2000SQL Server 2000 サーバーに使用する場合、この接続はシステム トランザクションに昇格できません。For example, the SqlClient connection cannot promote system transactions when it works against a SQL Server 2000SQL Server 2000 server. 代わりに、トランザクション スコープが使用されているときは、完全な分散トランザクションに自動的に参加します。Instead, it automatically enlists to a full, distributed transaction whenever it sees a transaction scope being used.

直接 SQL コマンドDirect SQL Commands

ときには、クエリを実行したり変更内容を送信したりする DataContext 機能に不足があり、実行する必要がある特別なタスクを完了できないこともあります。At times you can encounter situations where the ability of the DataContext to query or submit changes is insufficient for the specialized task you want to perform. このような場合は、ExecuteQuery メソッドを使用して、SQL コマンドをデータベースに発行し、クエリ結果をオブジェクトに変換することができます。In these circumstances you can use the ExecuteQuery method to issue SQL commands to the database and convert the query results to objects.

たとえば、Customer クラスのデータが 2 つのテーブル (customer1 および customer2) に含まれているとします。For example, assume that the data for the Customer class is spread over two tables (customer1 and customer2). 次のクエリは Customer オブジェクトのシーケンスを返します。The following query returns a sequence of Customer objects:

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

表形式の結果内の列名には、エンティティ クラスの列のプロパティが一致する限りLINQ to SQLLINQ to SQLSQL クエリからオブジェクトを作成します。As long as the column names in the tabular results match column properties of your entity class, LINQ to SQLLINQ to SQL creates your objects out of any SQL query.

パラメーターParameters

ExecuteQuery メソッドは、パラメーターを受け取ります。The ExecuteQuery method accepts parameters. 次のコードでは、パラメーター化されたクエリが実行されます。The following code executes a parameterized query:

            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

注意

パラメーターは、Console.WriteLine() および String.Format() で使用されるものと同じ中かっこ表記でクエリ テキストに表現されます。Parameters are expressed in the query text by using the same curly notation used by Console.WriteLine() and String.Format(). String.Format() は、指定されたクエリ文字列を受け取り、中かっこで囲まれたパラメーターを、@p0@p1 …、@p(n) などの、生成されたパラメーター名に置き換えます。String.Format() takes the query string you provide and substitutes the curly-braced parameters with generated parameter names such as @p0, @p1 …, @p(n).

関連項目See Also

背景情報Background Information
方法: ADO.NET コマンドおよび DataContext 間の接続を再利用How to: Reuse a Connection Between an ADO.NET Command and a DataContext