“Đặt lại kết nối” có nghĩa là gì? System.Data.SqlClient.SqlException (0x80131904)
Tôi biết điều này hơi mơ hồ, nhưng tôi không thể xác định chính xác vấn đề.
Khi tôi chạy một đoạn mã với cơ sở dữ liệu cục bộ, nó chạy tốt. Khi tôi sử dụng cơ sở dữ liệu từ xa, tôi gặp lỗi. Nó xảy ra ở giữa quá trình thực thi chương trình. Nâng cấp DBup chạy và sau đó truy vấn thủ công không thành công với ngoại lệ này:
System.Data.SqlClient.SqlException (0x80131904): Đặt lại kết nối dẫn đến trạng thái khác với lần đăng nhập ban đầu. Đăng nhập không thành công. Đăng nhập không thành công cho người dùng 'sa'.
Tôi đang tạo SqlConnectionthủ công bằng cách sử dụng new SqlConnection()và tôi cũng đang sử dụng DbUp
Tôi không chắc mình có thể làm gì sai. Cũng không phải bắt đầu gỡ lỗi này từ đâu. Các ConnectionStringkhông thay đổi và tôi luôn luôn sử dụng sađể kết nối với cơ sở dữ liệu.
Một câu hỏi hay để bắt đầu là "Đặt lại kết nối" nghĩa là gì? Tôi đang làm nó như thế nào?
Trả lời
Sau một vài giờ thử nghiệm và gặp lỗi, tôi nhận được một đoạn mã tối thiểu tái tạo lỗi
string dbName = "TESTDB";
Run("master", $"CREATE DATABASE [{dbName}]"); Run(dbName, $"ALTER DATABASE [{dbName}] COLLATE Latin1_General_100_CI_AS");
Run(dbName, "PRINT 'HELLO'");
void Run(string catalog, string script)
{
var cnxStr = new SqlConnectionStringBuilder
{
DataSource = serverAndInstance,
UserID = user,
Password = password,
InitialCatalog = catalog
};
using var cn = new SqlConnection(cnxStr.ToString());
using var cm = cn.CreateCommand();
cn.Open();
cm.CommandText = script;
cm.ExecuteNonQuery();
}
Hệ thống ngăn xếp đầy đủ là
Unhandled Exception: System.Data.SqlClient.SqlException: Resetting the connection results in a different state than the initial login. The login fails.
Login failed for user 'user'.
Cannot continue the execution because the session is in the kill state.
A severe error occurred on the current command. The results, if any, should be discarded.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
...
Nếu tôi thay đổi đầu tiên Run(dbName...thành Run("master"...nó chạy tốt. Vì vậy, nó liên quan đến việc chạy ALTER DATABASEtrong bối cảnh của cùng một cơ sở dữ liệu