C# 如何确定在始终在线群集中导致异常的SQL Server
我有一个C#应用程序,可以连接到一个8节点的SQL Server始终在群集上。我们使用连接字符串中的C# 如何确定在始终在线群集中导致异常的SQL Server,c#,sql-server,alwayson,C#,Sql Server,Alwayson,我有一个C#应用程序,可以连接到一个8节点的SQL Server始终在群集上。我们使用连接字符串中的applicationcontent=ReadOnly参数和侦听器IP来允许连接到所有服务器进行查询 我们正在应用程序中记录存储过程执行和返回结果所花费的时间。在日志中,我们还希望捕获连接到的确切服务器。当抛出异常时,堆栈跟踪中会有一个“路由目的地”,它提供所连接的确切服务器,而不是侦听器 我在SQL客户机代码中看到,路由目标来自内部连接,但无论何时使用该对象,该对象似乎都是受保护的、内部的或私有
applicationcontent=ReadOnly
参数和侦听器IP来允许连接到所有服务器进行查询
我们正在应用程序中记录存储过程执行和返回结果所花费的时间。在日志中,我们还希望捕获连接到的确切服务器。当抛出异常时,堆栈跟踪中会有一个“路由目的地”,它提供所连接的确切服务器,而不是侦听器
我在SQL客户机代码中看到,路由目标来自内部连接,但无论何时使用该对象,该对象似乎都是受保护的、内部的或私有的
有人知道如何到达这个内部连接对象或路由目标吗?或者有人知道从其他地方获取SQL Server真实名称的其他方法吗
根据要求,这里是一个示例方法。我想获取连接到的实际服务器名称,并将其记录在Catch块中:
public static async Task<int> InserStat(Statistic stat)
{
List<SqlParameter> parameters = new List<SqlParameter>();
int returnCode = -1;
try
{
parameters.Add(new SqlParameter() { ParameterName = StoredProcParamNames.Account, Value = stat.Account, DbType = DbType.String, Direction = ParameterDirection.Input });
parameters.Add(new SqlParameter() { ParameterName = StoredProcParamNames.DataSource, Value = stat.Datasource, DbType = DbType.String, Direction = ParameterDirection.Input });
parameters.Add(new SqlParameter() { ParameterName = StoredProcParamNames.Indicator, Value = stat.Listed, DbType = DbType.Boolean, Direction = ParameterDirection.Input });
parameters.Add(new SqlParameter() { ParameterName = StoredProcParamNames.ServiceIndicator, Value = stat.Service, DbType = DbType.Boolean, Direction = ParameterDirection.Input });
parameters.Add(new SqlParameter() { ParameterName = StoredProcParamNames.TimeStamp, Value = stat.TransactionTime, DbType = DbType.DateTime2, Direction = ParameterDirection.Input });
parameters.Add(new SqlParameter() { ParameterName = StoredProcParamNames.ReturnValue, DbType = DbType.Int32, Direction = ParameterDirection.ReturnValue });
using (SqlConnection connection = await dataManager.GetWriteBackConnectionAsync())
using (SqlCommand command = dataManager.SetupDbCommand("0", StoredProcNames.InsertStat, connection, parameters) as SqlCommand)
{
await command.ExecuteNonQueryAsync();
returnCode = (int)parameters[parameters.Count - 1].Value; // Return code is the last parameter in the list
}
}
catch (Exception e)
{
Dictionary<string, object> loggingDetails = PopulateLoggingDetails(parameters);
Logger.WriteException(e, VNRCategory.DAC, -1, TraceEventType.Error, StoredProcNames.InsertStat, loggingDetails);
}
if (returnCode != 0)
Logger.WriteInfoLog("Insert return code: " + returnCode, Category.DAC);
return returnCode;
}
公共静态异步任务InserStat(Statistic stat)
{
列表参数=新列表();
int returnCode=-1;
尝试
{
parameters.Add(新的SqlParameter(){ParameterName=StoredProcParamNames.Account,Value=stat.Account,DbType=DbType.String,Direction=ParameterDirection.Input});
parameters.Add(新的SqlParameter(){ParameterName=StoredProcParamNames.DataSource,Value=stat.DataSource,DbType=DbType.String,Direction=ParameterDirection.Input});
添加(新的SqlParameter(){ParameterName=StoredProcParamNames.Indicator,Value=stat.List,DbType=DbType.Boolean,Direction=ParameterDirection.Input});
parameters.Add(新的SqlParameter(){ParameterName=StoredProcParamNames.ServiceIndicator,Value=stat.Service,DbType=DbType.Boolean,Direction=ParameterDirection.Input});
parameters.Add(新的SqlParameter(){ParameterName=StoredProcParamNames.TimeStamp,Value=stat.TransactionTime,DbType=DbType.DateTime2,Direction=ParameterDirection.Input});
添加(新的SqlParameter(){ParameterName=StoredProcParamNames.ReturnValue,DbType=DbType.Int32,Direction=ParameterDirection.ReturnValue});
使用(SqlConnection connection=wait dataManager.GetWriteBackConnectionAsync())
使用(SqlCommand命令=dataManager.SetupDbCommand(“0”,StoredProcNames.InsertStat,connection,parameters)作为SqlCommand)
{
wait命令。ExecuteNonQueryAsync();
returnCode=(int)参数[parameters.Count-1].Value;//返回代码是列表中的最后一个参数
}
}
捕获(例外e)
{
Dictionary loggingDetails=PopulateLoggingDetails(参数);
Logger.WriteException(e,VNRCategory.DAC,-1,TraceEventType.Error,StoredProcNames.InsertStat,loggingDetails);
}
如果(返回代码!=0)
Logger.writeInfo(“插入返回代码:”+returnCode,Category.DAC);
返回代码;
}
您是否尝试在查询中使用@SERVERNAME来查看是否可以查找所连接的真实服务器?我可以在存储过程中查找,但不能在C代码中查找。我正在登录C#。您能提供sql执行和响应方法的示例代码吗。