다음을 통해 공유


ADO.NET 및 LINQ to SQL

LINQ to SQL은 ADO.NET 기술 제품군의 일부입니다. ADO.NET 공급자 모델에서 제공하는 서비스를 기반으로 합니다. 따라서 LINQ to SQL 코드를 기존 ADO.NET 애플리케이션과 혼합하고 현재 ADO.NET 솔루션을 LINQ to SQL로 마이그레이션할 수 있습니다. 다음 그림에서는 관계에 대한 개략적인 보기를 제공합니다.

LINQ to SQL 및 ADO.NET

관계망

LINQ to SQL DataContext을 만들 때 기존 ADO.NET 연결을 제공할 수 있습니다. (쿼리 포함)에 DataContext 대한 모든 작업은 제공된 연결을 사용합니다. 연결이 이미 열려 있는 경우 LINQ to SQL은 연결이 완료되면 그대로 둡니다.

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 직접 닫을 수 있습니다.

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

트랜잭션

애플리케이션이 이미 트랜잭션을 시작한 경우, DataContext이 참여할 수 있도록 사용자 고유의 데이터베이스 트랜잭션을 DataContext에 제공할 수 있습니다.

.NET Framework를 사용하여 트랜잭션을 수행하는 기본 방법은 개체를 TransactionScope 사용하는 것입니다. 이 방법을 사용하면 데이터베이스 및 기타 메모리 상주 리소스 관리자 간에 작동하는 분산 트랜잭션을 만들 수 있습니다. 트랜잭션 범위를 시작하는 데에는 거의 리소스가 필요하지 않습니다. 트랜잭션 범위 내에 여러 연결이 있는 경우에만 분산 트랜잭션으로 자신을 승격합니다.

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

이 방법은 모든 데이터베이스에 사용할 수 없습니다. 예를 들어 SqlClient 연결은 SQL Server 2000 서버에서 작동하는 경우 시스템 트랜잭션을 승격할 수 없습니다. 대신, 트랜잭션 범위가 사용되는 것을 볼 때마다 전체 분산 트랜잭션에 자동으로 등록됩니다.

직접 SQL 명령

경우에 따라 변경 내용을 쿼리하거나 제출하는 기능이 DataContext 수행하려는 특수 작업에 충분하지 않은 상황이 발생할 수 있습니다. 이러한 상황에서는 이 메서드를 ExecuteQuery 사용하여 데이터베이스에 SQL 명령을 실행하고 쿼리 결과를 개체로 변환할 수 있습니다.

예를 들어 클래스의 데이터가 Customer 두 테이블(customer1 및 customer2)에 분산되어 있다고 가정합니다. 다음 쿼리는 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")

테이블 형식 결과의 열 이름이 엔터티 클래스의 열 속성과 일치하는 한 LINQ to SQL은 SQL 쿼리에서 개체를 만듭니다.

매개 변수

메서드는 ExecuteQuery 매개 변수를 허용합니다. 다음 코드는 매개 변수가 있는 쿼리를 실행합니다.

            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

비고

매개 변수는 쿼리 텍스트에서 사용되는 것과 동일한 curly 표기법을 Console.WriteLine() 사용하여 표현됩니다 String.Format(). String.Format()은 제공하는 쿼리 문자열을 사용하고 중괄호로 묶인 매개 변수를 생성된 매개 변수 이름(예: , @p0 ..., @p1)으로 @p(n)대체합니다.

참고하십시오