사용자가 데이터베이스 테이블과 필드를 만들 수있는 응용 프로그램이 있습니다. SMO (SQL Management Object) (Microsoft.SqlServer.Smo)를 사용하여 테이블을 변경합니다.현재 연결과 관련된 트랜잭션이 완료되었지만 처리되지 않았습니다. (편집 # 3)
기존의 테이블을 갱신 코드는 다음을 수행 : 테이블 모음에 액세스하려고 시도 라인에서
using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, new TimeSpan(0, 15, 0)))
{
using (SqlConnection sqlConnection = new SqlConnection(connectionSettings.ConnectionString))
{
ServerConnection serverConnection = new ServerConnection(sqlConnection);
SMO.Server server = new SMO.Server(serverConnection);
SMO.Database database = server.Databases[sqlConnection.Database];
SMO.Table table = database.Tables[targetTableName];
// perform table operations such as add new columns
}
, 우리는 오류가 나타날 수 이 현재 연결과 관련된 트랜잭션이 완료하지만, 처분되지 않았습니다. SQL 문을 실행하기 위해 연결을 사용하려면 트랜잭션을 처리해야합니다.
이 코드는 우리 환경과 다른 고객 사이트의 30 가지 다른 컴퓨터에서 작동합니다. 그러나 한 고객 사이트에서 코드가이 오류를 생성합니다.
표를 검색하기 위해 호출하기 전에 System.Transactions.Transaction.Current.TransactionInformation.Status를 Active로 표시하는 추적을 추가했습니다. System.Transactions.TransactionManager.MaximumTimeout의 추적은 10 분을 표시합니다.
고객이 두 대의 다른 컴퓨터에서 문제를 복제했습니다. 고객이 이전 버전의 코드를 실행하면 작동합니다.
버전간에 최신 SQL Server 2016 SMO dll을 사용하도록 업데이트했습니다. 그러나 다시 이것은 다른 고객 사이트에서 작동하고 이전 버전의 코드를 사용하고 있습니다.
SMO 관련 DLL을 BIN 디렉토리에 복사해도 문제가 해결되지 않습니다. Nuget에서 최신 SMO 관련 DLL로 업데이트해도 문제가 해결되지 않았습니다.
질문 :
이 오류의 원인을 파악하는 방법에 대한 조언이 있으십니까? 여기에 무엇이 누락되어 있는지 확실하지 않습니다.
편집 : 다음은 스택 추적입니다.
at System.Data.SqlClient.SqlInternalConnectionTds.CheckEnlistedTransactionBinding()
at System.Data.SqlClient.TdsParser.TdsExecuteSQLBatch(String text, Int32 timeout, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean sync, Boolean callerHasConnectionLock)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
at Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject, DataSet fillDataSet, Boolean catchException)
at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteWithResults(String sqlCommand)
at Microsoft.SqlServer.Management.Smo.ExecuteSql.ExecuteWithResults(String query)
at Microsoft.SqlServer.Management.Smo.ExecuteSql.Execute(StringCollection query)
at Microsoft.SqlServer.Management.Smo.ExecuteSql.ExecuteWithResults(String query, Object con)
at Microsoft.SqlServer.Management.Smo.PostProcessDatabaseInsideAttribs.InitializeRowCollection(DataProvider dp)
at Microsoft.SqlServer.Management.Smo.PostProcessDatabaseInsideAttribs.GetColumnData(String name, Object data, DataProvider dp)
at Microsoft.SqlServer.Management.Smo.DataProvider.ManipulateRowDataPostProcess()
at Microsoft.SqlServer.Management.Smo.DataProvider.GetTable()
at Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillData(ResultType resultType, StringCollection sql, Object connectionInfo, StatementBuilder sb)
at Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillDataWithUseFailure(SqlEnumResult sqlresult, ResultType resultType)
at Microsoft.SqlServer.Management.Smo.SqlObjectBase.BuildResult(EnumResult result)
at Microsoft.SqlServer.Management.Smo.DatabaseLevel.GetData(EnumResult res)
at Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData()
at Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData(Request req, Object ci)
at Microsoft.SqlServer.Management.Sdk.Sfc.Enumerator.GetData(Object connectionInfo, Request request)
at Microsoft.SqlServer.Management.Smo.ExecutionManager.GetEnumeratorDataReader(Request req)
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetInitDataReader(String[] fields, OrderBy[] orderby)
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.ImplInitialize(String[] fields, OrderBy[] orderby)
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.Initialize(Boolean allProperties)
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.OnPropertyMissing(String propname, Boolean useDefaultValue)
at Microsoft.SqlServer.Management.Smo.PropertyCollection.RetrieveProperty(Int32 index, Boolean useDefaultOnMissingValue)
at Microsoft.SqlServer.Management.Smo.PropertyCollection.GetPropertyObject(Int32 index)
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetPropertyOptional(String propName)
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetDbComparer(Boolean inServer)
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.InitializeStringComparer()
at Microsoft.SqlServer.Management.Smo.AbstractCollectionBase.get_StringComparer()
at Microsoft.SqlServer.Management.Smo.SchemaCollectionBase.InitInnerCollection()
at Microsoft.SqlServer.Management.Smo.SmoCollectionBase.GetObjectByKey(ObjectKeyBase key)
at Microsoft.SqlServer.Management.Smo.TableCollection.get_Item(String name)
at UpdateForm(FormInfo updatedForm)
편집 : 테스트 애플 리케이션 나는 또한 몇 가지 테스트 환경에서 작동하지만, 고객의 컴퓨터에 실패 테스트 응용 프로그램을 만들었습니다
재현. 여기
using Microsoft.SqlServer.Management.Common;
using System;
using System.Data.SqlClient;
using System.Reflection;
using System.Transactions;
using SMO = Microsoft.SqlServer.Management.Smo;
namespace TestSMO
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"{"-".PadLeft(25, '-')}");
Console.WriteLine("Test Start");
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DEFAULT"].ConnectionString;
TraceTransactionStatus();
TimeSpan timeSpanOption = new System.TimeSpan(0, 15, 0);
TransactionOptions options = new TransactionOptions();
options.IsolationLevel = IsolationLevel.ReadCommitted;
options.Timeout = timeSpanOption;
Console.WriteLine(" Start Transaction");
using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, options))
{
TraceTransactionStatus();
Console.WriteLine(" Using SQL Connection");
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
try
{
TraceTransactionStatus();
Console.WriteLine(" New SQL Connection");
ServerConnection serverConnection = new ServerConnection(sqlConnection);
Console.WriteLine(" New SQL Connection...done");
TraceTransactionStatus();
Console.WriteLine(" New SMO Server");
SMO.Server server = new SMO.Server(serverConnection);
Console.WriteLine(" New SMO Server...done");
TraceTransactionStatus();
Console.WriteLine(" Access database");
SMO.Database database = server.Databases[sqlConnection.Database];
Console.WriteLine(" Access database...done");
TraceTransactionStatus();
Console.WriteLine(" Access document table");
SMO.Table table = database.Tables["Document"];
Console.WriteLine(" Access document table...done");
TraceTransactionStatus();
}
catch(Exception e)
{
Console.WriteLine($"{"*".PadLeft(25, '*')}");
Console.WriteLine($"Exception: {e.Message}");
Console.WriteLine($"{"*".PadLeft(25, '*')}");
TraceTransactionStatus();
}
}
GetAssemblies();
}
Console.WriteLine("Test Complete");
Console.WriteLine($"{"-".PadLeft(25, '-')}");
Console.WriteLine("Press enter to continue");
Console.ReadKey();
}
private static void TraceTransactionStatus()
{
if (System.Transactions.Transaction.Current != null)
{
Console.WriteLine($" Current Transaction Status: {Enum.GetName(typeof(System.Transactions.TransactionStatus), System.Transactions.Transaction.Current.TransactionInformation.Status)}");
Console.WriteLine($" Current Transaction Distributed ID: {System.Transactions.Transaction.Current.TransactionInformation.DistributedIdentifier}");
Console.WriteLine($" Current Transaction Local ID: {System.Transactions.Transaction.Current.TransactionInformation.LocalIdentifier}");
}
else
{
Console.WriteLine($" Current Transaction Status: None");
}
}
public static void GetAssemblies()
{
Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies();
foreach(Assembly assembly in asms)
{
Console.WriteLine($"{"-".PadLeft(25, '-')}");
Console.WriteLine($"Fullname: {assembly.FullName}");
Console.WriteLine($"CodeBase: {assembly.CodeBase}");
Console.WriteLine($"ImageRTV: {assembly.ImageRuntimeVersion}");
Console.WriteLine($"Location: {assembly.Location}");
}
}
}
}
는 출력 :
-------------------------
Test Start
Current Transaction Status: None
Start Transaction
Current Transaction Status: Active
Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000
Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1
Using SQL Connection
Current Transaction Status: Active
Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000
Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1
New SQL Connection
New SQL Connection...done
Current Transaction Status: Active
Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000
Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1
New SMO Server
New SMO Server...done
Current Transaction Status: Active
Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000
Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1
Access database
Access database...done
Current Transaction Status: Active
Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000
Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1
Access document table
*************************
Exception: The transaction associated with the current connection has completed
but has not been disposed. The transaction must be disposed before the connecti
on can be used to execute SQL statements.
*************************
Current Transaction Status: Aborted
Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000
Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1
-------------------------
Fullname: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
ImageRTV: v4.0.30319
Location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
-------------------------
Fullname: TestSMO, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
CodeBase: file:///E:/testAppDir/TestApp/TestApp/TestSMO.exe
ImageRTV: v4.0.30319
Location: E:\testAppDir\TestApp\TestApp\TestSMO.exe
-------------------------
Fullname: System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Transactions/v4.0_4.0.0.0__b77a5c561934e089/System.Transactions.dll
ImageRTV: v4.0.30319
Location: C:\Windows\Microsoft.Net\assembly\GAC_32\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll
-------------------------
Fullname: System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
ImageRTV: v4.0.30319
Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
-------------------------
Fullname: System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
ImageRTV: v4.0.30319
Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll
-------------------------
Fullname: System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
ImageRTV: v4.0.30319
Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll
-------------------------
Fullname: System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
ImageRTV: v4.0.30319
Location: C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll
-------------------------
Fullname: Microsoft.SqlServer.ConnectionInfo, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.SqlServer.ConnectionInfo/13.0.0.0__89845dcd8080cc91/Microsoft.SqlServer.ConnectionInfo.dll
ImageRTV: v2.0.50727
Location: C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.ConnectionInfo\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.ConnectionInfo.dll
-------------------------
Fullname: Microsoft.SqlServer.Smo, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.SqlServer.Smo/13.0.0.0__89845dcd8080cc91/Microsoft.SqlServer.Smo.dll
ImageRTV: v2.0.50727
Location: C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll
-------------------------
Fullname: Microsoft.SqlServer.Management.Sdk.Sfc, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.SqlServer.Management.Sdk.Sfc/13.0.0.0__89845dcd8080cc91/Microsoft.SqlServer.Management.Sdk.Sfc.dll
ImageRTV: v2.0.50727
Location: C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Management.Sdk.Sfc\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Management.Sdk.Sfc.dll
-------------------------
Fullname: Microsoft.SqlServer.SqlEnum, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.SqlServer.SqlEnum/13.0.0.0__89845dcd8080cc91/Microsoft.SqlServer.SqlEnum.dll
ImageRTV: v2.0.50727
Location: C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.SqlEnum\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.SqlEnum.dll
-------------------------
Fullname: System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
ImageRTV: v4.0.30319
Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll
-------------------------
Fullname: System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.EnterpriseServices/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll
ImageRTV: v4.0.30319
Location: C:\Windows\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll
-------------------------
Fullname: Microsoft.SqlServer.SqlClrProvider, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.SqlServer.SqlClrProvider/13.0.0.0__89845dcd8080cc91/Microsoft.SqlServer.SqlClrProvider.dll
ImageRTV: v2.0.50727
Location: C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.SqlClrProvider\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.SqlClrProvider.dll
-------------------------
Fullname: System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll
ImageRTV: v4.0.30319
Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll
Test Complete
-------------------------
Press enter to continue
편집 :
우리는 테스트 응용 프로그램의 세 가지 버전을 만들어 더 많은 연구. 각각 다른 버전의 SQL 관리 개체 DLL 인 v12, v13 및 v14에 대해 컴파일됩니다.v12가 예상대로 작동합니다. v13에서 제목에 예외가 발생합니다. v14가 다른 예외를 throw합니다. 속성 'DatabaseName'에 DefaultSchema 속성을 사용할 수 없습니다. 이 개체에 대해이 속성이 없거나 충분한 액세스 권한으로 인해 검색 할 수 없습니다.
사용자가 Windows 인증을 사용하여 인증하고 있습니다.
사용자가 SQL Server에 있고 데이터베이스와 연결되어 있습니다. [dbo]와 같은 기본 스키마가 있습니다.
사용자는 SQL Server에 있고 해당 데이터베이스와 연결된 도메인 그룹에도 속합니다. 도메인 그룹의 기본 스키마는 [dbo]입니다.
단서인지 "붉은 청어"인지 확실하지 않습니다.
전체 사용 내역을 표시 할 수 있습니까? – AGrammerPro
당신이 무엇을 요구하고 있는지 확실하지 않습니다. 줄에 오류가 발생했습니다 : SMO.Table table = database.Tables [targetTableName]; 사용하는 진술 그 자체는 게시물에서 볼 수있는 것입니다. 오류가 발생하지 않는 줄 아래의 코드 – Sdev
테스트 app 및 출력을 추가하십시오. – Sdev