问题描述
我知道这有点含糊,但是我无法查明问题所在。
当我对本地数据库运行一些代码时,它运行良好。当我使用远程数据库时,出现错误。 它发生在程序执行的中间。运行dbup升级,然后手动查询失败,但出现以下异常:
System.Data.sqlClient.sqlException(0x80131904):重置连接将导致与初始登录不同的状态。登录失败。 用户'sa'登录失败。
我正在使用sqlConnection
手动创建new sqlConnection()
,也正在使用DbUp
我不确定我会做错什么。也没有从哪里开始调试它。
ConnectionString
不变,我一直使用sa
连接到数据库。
首先要问的一个好问题是“重置连接”是什么意思?我怎么做?
解决方法
经过几个小时的反复试验,我得到了一段再现错误的最小代码
function ajax_login_init(){
wp_register_script('ajax-login-script',get_template_directory_uri() . '/ajax-login-script.js',array('jquery'),time() );
wp_enqueue_script('ajax-login-script');
wp_localize_script( 'ajax-login-script','ajax_login_object',array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),'redirecturl' => home_url(),'loadingmessage' => __('Sending user info,please wait...!')
));
add_action( 'wp_ajax_nopriv_ajaxlogin','ajax_login' );
}
if (!is_user_logged_in()) {
add_action('init','ajax_login_init');
}
function ajax_login(){
check_ajax_referer( 'ajax-login-nonce','security' );
$info = array();
$info['user_login'] = $_POST['username'];
$info['user_password'] = $_POST['password'];
$info['remember'] = true;
$user_signon = wp_signon( $info,false );
if ( !is_wp_error($user_signon) ){
wp_set_current_user($user_signon->ID);
wp_set_auth_cookie($user_signon->ID);
echo json_encode(array('loggedin'=>true,'message'=>__('Login successful,redirecting...')));
}
die();
}
完整的堆栈跟踪为
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();
}
如果我将第一个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,Boolean& usedCache,Boolean asyncWrite,Boolean inRetry)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
...
更改为Run(dbName...
,它将运行正常。
因此,这与在同一数据库的上下文中运行Run("master"...
有关
这不是我的问题的答案,但是我通过不处理SqlConnection
而是重新使用来解决此问题。
我还是不明白问题所在