수색…
연결이 열려있는 동안 존재하는 임시 테이블
임시 테이블 자체가 만들어지면 연결이 열려있는 동안 그대로 유지됩니다.
// Widget has WidgetId, Name, and Quantity properties
public async Task PurchaseWidgets(IEnumerable<Widget> widgets)
{
using(var conn = new SqlConnection("{connection string}")) {
await conn.OpenAsync();
await conn.ExecuteAsync("CREATE TABLE #tmpWidget(WidgetId int, Quantity int)");
// populate the temp table
using(var bulkCopy = new SqlBulkCopy(conn)) {
bulkCopy.BulkCopyTimeout = SqlTimeoutSeconds;
bulkCopy.BatchSize = 500;
bulkCopy.DestinationTableName = "#tmpWidget";
bulkCopy.EnableStreaming = true;
using(var dataReader = widgets.ToDataReader())
{
await bulkCopy.WriteToServerAsync(dataReader);
}
}
await conn.ExecuteAsync(@"
update w
set Quantity = w.Quantity - tw.Quantity
from Widgets w
join #tmpWidget tw on w.WidgetId = tw.WidgetId");
}
}
임시 테이블 작업 방법
임시 테이블에 대한 요지는 연결 범위에만 국한된다는 것입니다. Dapper는 이미 열려 있지 않은 경우 자동으로 연결을 열고 닫습니다. 즉, Dapper로 전달 된 연결이 열리지 않은 경우 모든 임시 테이블이 생성 된 후 바로 손실됩니다.
작동하지 않습니다.
private async Task<IEnumerable<int>> SelectWidgetsError()
{
using (var conn = new SqlConnection(connectionString))
{
await conn.ExecuteAsync(@"CREATE TABLE #tmpWidget(widgetId int);");
// this will throw an error because the #tmpWidget table no longer exists
await conn.ExecuteAsync(@"insert into #tmpWidget(WidgetId) VALUES (1);");
return await conn.QueryAsync<int>(@"SELECT * FROM #tmpWidget;");
}
}
다른 한편으로,이 두 버전이 작동합니다 :
private async Task<IEnumerable<int>> SelectWidgets()
{
using (var conn = new SqlConnection(connectionString))
{
// Here, everything is done in one statement, therefore the temp table
// always stays within the scope of the connection
return await conn.QueryAsync<int>(
@"CREATE TABLE #tmpWidget(widgetId int);
insert into #tmpWidget(WidgetId) VALUES (1);
SELECT * FROM #tmpWidget;");
}
}
private async Task<IEnumerable<int>> SelectWidgetsII()
{
using (var conn = new SqlConnection(connectionString))
{
// Here, everything is done in separate statements. To not loose the
// connection scope, we have to explicitly open it
await conn.OpenAsync();
await conn.ExecuteAsync(@"CREATE TABLE #tmpWidget(widgetId int);");
await conn.ExecuteAsync(@"insert into #tmpWidget(WidgetId) VALUES (1);");
return await conn.QueryAsync<int>(@"SELECT * FROM #tmpWidget;");
}
}
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow