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