SQL Server 抱怨它什么都没有,我想这比充满其他东西要好。这个问题有一些非常有趣的答案,尤其是 Steven 的答案。
但是,在运行他提供的脚本后,我没有看到 TRANSACTION 或 BACKUP 作为 log_reuse_wait_description 列中的条目,而是只看到“NOTHING”和“CHECKPOINT”每个“state_desc”值都是“ONLINE”,每个“recovery_model_desc”都是“SIMPLE” ”。所有“最后一次完整备份”的值都是相同的 - 2014 年 10 月 31 日 - 差不多一年半前。
我很长一段时间都不是 DBAdmin,所以不知道这些东西是什么意思,或者最重要的是,不知道如何防止错误消息的发生。
我可以从 C# 方面做些什么来防止这种“没有任何东西”的错误发生吗?
整个错误消息是:
日期:2016 年 3 月 7 日下午 2:24:45 消息:2016 年 3 月 7 日,星期一:异常消息:数据库“tempdb”的事务日志已满,因为“没有”。异常源:.Net SqlClient 数据提供程序异常 StackTrace:在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,Action
1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject state&Obj, Boolean dataReady) 在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 在 System.Data .SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite,System.Data.SqlClient.SqlCommand.RunExecuteReader 的 SqlDataReader ds,布尔 describeParameterEncryptionRequest)(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,String 方法,TaskCompletionSource`1 完成,Int32 超时,任务和任务,布尔 asyncWrite)在 System.Data.SqlClient。 SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为, String 方法) 在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为) 在 System. Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior 行为)在 System.Data.Common.DbDataAdapter.FillInternal(DataSet 数据集,DataTable[] 数据表,Int32 startRecord、Int32 maxRecords、String srcTable、IDbCommand 命令、CommandBehavior 行为)在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet、Int32 startRecord、Int32 maxRecords、String srcTable、IDbCommand 命令、CommandBehavior 行为)在 System.Data.Common .DbDataAdapter.Fill(DataSet dataSet) at ReportRunner.SharedCode.SQLDBHelper.ExecuteSQLReturnDataTable(String sql, CommandType cmdType, SqlParameter[] 参数)ExecuteSQLReturnDataTable(String sql, CommandType cmdType, SqlParameter[] 参数)ExecuteSQLReturnDataTable(String sql, CommandType cmdType, SqlParameter[] 参数)
因此,该 msg 中引用的我的代码是 ExecuteSQLReturnDataTable(),即:
public static DataTable ExecuteSQLReturnDataTable(string connectionStr, string sql, CommandType cmdType, params SqlParameter[] parameters)
{
using (DataSet ds = new DataSet())
using (SqlConnection connStr = new SqlConnection(connectionStr))
using (SqlCommand cmd = new SqlCommand(sql, connStr))
{
cmd.CommandType = cmdType;
cmd.CommandTimeout = EXTENDED_TIMEOUT;
foreach (var item in parameters)
{
cmd.Parameters.Add(item);
}
try
{
cmd.Connection.Open();
new SqlDataAdapter(cmd).Fill(ds);
}
catch (SqlException sqlex)
{
for (int i = 0; i < sqlex.Errors.Count; i++)
{
var sqlexDetail = String.Format("From ExecuteDataSet(), SQL Exception #{0}{1}Source: {2}{1}Number: {3}{1}State: {4}{1}Class: {5}{1}Server: {6}{1}Message: {7}{1}Procedure: {8}{1}LineNumber: {9}",
i + 1, // Users might get the fantods if they saw #0
Environment.NewLine,
sqlex.Errors[i].Source,
sqlex.Errors[i].Number,
sqlex.Errors[i].State,
sqlex.Errors[i].Class,
sqlex.Errors[i].Server,
sqlex.Errors[i].Message,
sqlex.Errors[i].Procedure,
sqlex.Errors[i].LineNumber);
ReportRunnerConstsAndUtils.HandleException(sqlex);
}
return null; // see https://stackoverflow.com/questions/33883125/how-can-i-defensively-code-against-randomly-referencing-table-0-and-null-value?noredirect=1#comment55530765_33883125
}
catch (Exception ex)
{
ReportRunnerConstsAndUtils.HandleException(ex);
return null;
}
return ds.Tables[0];
}
}
那么我可以在这段代码中添加什么来缓解甚至消除问题吗?