将所有人置于上下文中:我们已经部署了Windows窗体应用程序,该程序以C#编码,并从SQL Server 14 DB查询数据。一切正常,直到有一天我们需要将应用程序从主子网192.168.0.X推送到192.168.1.X。
在这里,与我的搭档一起,我们相信在连接字符串上做一些返工可以解决我们之前遇到的第一个问题(无需连接到数据库;无需登录,无需简单查询,就可以了)不允许我们是否使用存储过程将任何数据写入数据库。我们已经认为这可能是此问题的根源之一,但事实并非如此,因为我们可以执行一些SELECT查询而没有任何麻烦。当然,这是在受影响的PC上。
以前是:
user id=myUser; password=myPass; server=myIP; Trusted_Connection=no; database=myDBName; connection timeout=30;
现在是:
Data Source=myServerName; Initial Catalog=myDatabaseName; User ID=myUsername;Password=myPassword; Server=IP, Port (if necessary);
一些例外的屏幕截图,显示在MessageBox中:
1st (and 3rd) Exception: Possible Truncated Data(在第二个之后再次重复)
2nd Exception: Couldn't Open a Connection
我们已经检查了TCP / IP,SSMS的端口配置,物理防火墙端口转发以及conn上的更多变化。字符串,不同的IPv4配置,似乎没有任何作用(即使对于具有所有数据库和服务器特权的新超级用户而言)。所以在这里,我们距离解决这个问题如此之遥,距离如此之遥。
第二天编辑:即使在@iakobski提出建议的情况下,也对受影响的代码(发生异常的地方)进行了双重检查。同样的例外,在同一个地方。唯一的区别是应用程序抛出它们的速度,因为它可以更快地关闭挂起的事务,并借助“ finally”子句来处理异常。
此外,正如我在进行更深入的调试时注意到的那样,INSERT或UPDATE本身不是问题,而存储过程是问题。因为它无法更新/选择使用 SQLSERVERPROCEDURE.SQLSERVER.Exec 格式的SP模块中的数据,但是在插入日志条目(我认为这是执行SQL命令的经典方法)时却没有: / p>
SqlCommand cmd = new SqlCommand();
con.ConnectionString = CadenaConexion;
cmd.Connection = con;
cmd.CommandText = "INSERT INTO LOG(LOG_ID_USUARIO,LOG_FECHA,LOG_PROCESO,LOG_CANTIDAD,LOG_PEDIDO,LOG_ITEM)" +
"VALUES(@log_id_usuario, @log_fecha, @log_proceso, @log_cantidad, @log_pedido, @log_item)";
try
{
cmd.Parameters.Add("@log_id_usuario", SqlDbType.Int).Value = Log_id_usuario;
cmd.Parameters.Add("@log_fecha", SqlDbType.DateTime).Value = Log_fecha;
cmd.Parameters.Add("@log_proceso", SqlDbType.Text).Value = Log_proceso;
cmd.Parameters.Add("@log_cantidad", SqlDbType.Int).Value = Log_cantidad;
cmd.Parameters.Add("@log_pedido", SqlDbType.Int).Value = Log_pedido;
cmd.Parameters.Add("@log_item", SqlDbType.Int).Value = Log_item;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
return true;
}
catch (Exception ex)
{
exSrc = "log";
exMsg = ex.Message;
exNota = "ERR_LogUsu01: No se ha podido Insertar el Registro a la Tabla Log";
exStTr = ex.StackTrace;
registrarEnLogErr();
MessageBox.Show(ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
finally { con.Close(); }
因此,如果昨天我很确定这个名为 SQLSERVERPROCEDURE.dll 的小文件与它所处理的存储过程有直接关系,那么我可以确定-r现在。不知何故,它可能正在使用旧的连接字符串,但我不知道如何更改它,因为对此文件进行的每次调用都将连接字符串称为“ DBSQL”(试图在调用时进行更改,放置SharedData.Instance()。StringConexion,还有一个'cn'变量[with ToString()],没有运气。表示未定义Conn。String。查看带有.dll调用的SP中的定义以及.dll文件本身:
更新模块:
SqlConnection cn = new SqlConnection(SharedData.Instance().StringConexion);
try
{
Dictionary<string, object> param = new Dictionary<string, object>();
param.Add("@nta_venta", nta_venta);
param.Add("@item", item);
param.Add("@cantidad", cantidad);
cn.Open();
SQLSERVERPROCEDURE.SQLSERVER.Exec("DBSQL", SP, param);
cn.Close();
}
catch (Exception ex)
{
exSrc = this.Name;
exMsg = ex.Message;
exNota = "ERR_Corte02: Pedido: " + nta_venta + "-" + item + " con Falta de Parámetros válidos en Actualiza";
exStTr = ex.StackTrace;
registrarEnLogErr();
MessageBox.Show(ex.Message);
}
finally { cn.Close(); }
DLL文件:VS上的标题: SQLSERVER (来自元数据)
#region Ensamblado SQLSERVERPROCEDURE, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null
// C:\Users\User\source\repos\MY-APP\packages\EXECSQLSERVERPROCEDURE.2.0.0\lib\net40\SQLSERVERPROCEDURE.dll
#endregion
using System.Collections.Generic;
using System.Data;
namespace SQLSERVERPROCEDURE
{
public static class SQLSERVER
{
public static DataTable Exec(string NombreConexion, string Procedimiento, Dictionary<string, object> VariableYValores, DataTable dt = null);
public static DataSet Exec(string NombreConexion, string Procedimiento, Dictionary<string, object> VariableYValores, DataSet ds = null);
public static void Exec(string NombreConexion, string Procedimiento, Dictionary<string, object> VariableYValores);
}
}
第一个StackTrace(不再有效,因为它已通过重新完成的Open和Close语句解决):
Excepción producida: 'System.Data.SqlClient.SqlException' en System.Data.dll
El subproceso 0x3f5c terminó con código 0 (0x0).
Excepción producida: 'System.Data.SqlClient.SqlException' en SQLSERVERPROCEDURE.dll
Excepción producida: 'System.InvalidOperationException' en System.Data.dll
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Transactions.resources\v4.0_4.0.0.0_es_b77a5c561934e089\System.Transactions.resources.dll' cargado. El módulo se compiló sin símbolos.
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Excepción no controlada</Description><AppDomain>myApp.exe</AppDomain><Exception><ExceptionType>System.InvalidOperationException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>No está autorizado a cambiar la propiedad 'ConnectionString'. El estado actual de la conexión es abierta.</Message><StackTrace> en System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
en System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
en MY_APP.Class.log_errores.INSERT_log_err() en C:\Users\User\Source\Repos\MY-APP\MY APP\Class\log_errores.cs:línea 34
en MY_APP.PrcsCorte.registrarEnLogErr() en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 378
en MY_APP.PrcsCorte.cargarPedido(Int32 nv, Int32 it) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 267
en MY_APP.PrcsCorte.PrcsCorte_Activated(Object sender, EventArgs e) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 39
en System.Windows.Forms.Form.OnActivated(EventArgs e)
en System.Windows.Forms.Form.set_Active(Boolean value)
en System.Windows.Forms.Form.WmActivate(Message&amp; m)
en System.Windows.Forms.Form.WndProc(Message&amp; m)
en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp; m)
en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m)
en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)</StackTrace><ExceptionString>System.InvalidOperationException: No está autorizado a cambiar la propiedad 'ConnectionString'. El estado actual de la conexión es abierta.
en System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
en System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
en MY_APP.Class.log_errores.INSERT_log_err() en C:\Users\User\Source\Repos\MY-APP\MY APP\Class\log_errores.cs:línea 34
en MY_APP.PrcsCorte.registrarEnLogErr() en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 378
en MY_APP.PrcsCorte.cargarPedido(Int32 nv, Int32 it) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 267
en MY_APP.PrcsCorte.PrcsCorte_Activated(Object sender, EventArgs e) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 39
en System.Windows.Forms.Form.OnActivated(EventArgs e)
en System.Windows.Forms.Form.set_Active(Boolean value)
en System.Windows.Forms.Form.WmActivate(Message&amp; m)
en System.Windows.Forms.Form.WndProc(Message&amp; m)
en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp; m)
en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m)
en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)</ExceptionString></Exception></TraceRecord>
Excepción no controlada del tipo 'System.InvalidOperationException' en System.Data.dll
No está autorizado a cambiar la propiedad 'ConnectionString'. El estado actual de la conexión es abierta.
El subproceso 0x2e54 terminó con código 0 (0x0).
El subproceso 0x42cc terminó con código 0 (0x0).
El subproceso 0x3d84 terminó con código 0 (0x0).
Excepción no controlada: System.InvalidOperationException: No está autorizado a cambiar la propiedad 'ConnectionString'. El estado actual de la conexión es abierta.
en System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
en System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
en MY_APP.Class.log_errores.INSERT_log_err() en C:\Users\User\Source\Repos\MY-APP\MY APP\Class\log_errores.cs:línea 34
en MY_APP.PrcsCorte.registrarEnLogErr() en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 378
en MY_APP.PrcsCorte.cargarPedido(Int32 nv, Int32 it) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 267
en MY_APP.PrcsCorte.PrcsCorte_Activated(Object sender, EventArgs e) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 39
en System.Windows.Forms.Form.OnActivated(EventArgs e)
en System.Windows.Forms.Form.set_Active(Boolean value)
en System.Windows.Forms.Form.WmActivate(Message& m)
en System.Windows.Forms.Form.WndProc(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
El programa '[17180] myApp.exe' terminó con código 0 (0x0).
第二个StackTrace:
'myApp.exe' (CLR v4.0.30319: DefaultDomain): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: DefaultDomain): 'C:\Users\User\Source\Repos\MY-APP\MY APP\bin\Debug\myApp.exe' cargado. Símbolos cargados.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Data.resources\v4.0_4.0.0.0_es_b77a5c561934e089\System.Data.resources.dll' cargado. El módulo se compiló sin símbolos.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.Wrapper.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Caching\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.Caching.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms.resources\v4.0_4.0.0.0_es_b77a5c561934e089\System.Windows.Forms.resources.dll' cargado. El módulo se compiló sin símbolos.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_es_b77a5c561934e089\mscorlib.resources.dll' cargado. El módulo se compiló sin símbolos.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\Users\User\Source\Repos\MY-APP\MY APP\bin\Debug\SQLSERVERPROCEDURE.dll' cargado. No se encuentra el archivo PDB o no se puede abrir.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\PrivateAssemblies\Runtime\Microsoft.VisualStudio.Debugger.Runtime.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
Excepción producida: 'System.Data.SqlClient.SqlException' en System.Data.dll
Excepción producida: 'System.Data.SqlClient.SqlException' en System.Data.dll
El subproceso 0x1184 terminó con código 0 (0x0).
El subproceso 0xfe0 terminó con código 0 (0x0).
El subproceso 0xc70 terminó con código 0 (0x0).
El subproceso 0x4b64 terminó con código 0 (0x0).
El subproceso 0x5e04 terminó con código 0 (0x0).
El subproceso 0x3ef4 terminó con código 0 (0x0).
El subproceso 0x3b58 terminó con código 0 (0x0).
El subproceso 0x480c terminó con código 0 (0x0).
Excepción producida: 'System.Data.SqlClient.SqlException' en SQLSERVERPROCEDURE.dll
El subproceso 0x48f0 terminó con código 0 (0x0).
El subproceso 0x4238 terminó con código 0 (0x0).
Excepción producida: 'System.Data.SqlClient.SqlException' en System.Data.dll
El subproceso 0x5ddc terminó con código 0 (0x0).
El subproceso 0x5184 terminó con código 0 (0x0).
El subproceso 0x3074 terminó con código 0 (0x0).
El subproceso 0x3bdc terminó con código 0 (0x0).
El subproceso 0x55f4 terminó con código 0 (0x0).
El subproceso 0x44b4 terminó con código 0 (0x0).
El programa '[18484] myApp.exe' terminó con código 0 (0x0).
SSMS截图:
答案 0 :(得分:1)
问题显示在您的错误消息中,您不能在现有连接上更改连接字符串。每次访问数据库时,都应始终打开一个新连接,并在完成后将其处置,方法是将其封闭在using块中:
using(SqlConnection connection = new SqlConnection(<connection string>))
{
connection.Open();
// database interaction here
}
连接将在离开using块时进行处理。不必担心您会创建大量连接,并认为它会影响性能,连接池将为您处理。
答案 1 :(得分:0)
首先,很抱歉这么晚发布。其次,在所有答案中,我可以说我做了以下工作(并且已经完成):
有时候,最棘手的问题有难以置信的简单答案,你不觉得吗?
谢谢大家!