0

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,Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 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];
    }
}

那么我可以在这段代码中添加什么来缓解甚至消除问题吗?

4

0 回答 0