如何解决导致SQL Server抛出的任何问题"数据库的临时日志' tempdb'由于没有''"?

时间:2016-03-07 22:55:56

标签: c# sql-server sqlexception transaction-log tempdb

SQL Server抱怨它没有任何东西,我想,这比充满其他东西更好。 This question有一些非常有趣的答案,特别是史蒂文的答案。

然而,在运行他提供的脚本之后,我没有看到TRANSACTION或BACKUP作为log_reuse_wait_description列中的条目,我只看到" NOTHING"和"检查点"每个" state_desc"价值是"在线"以及每一个" recovery_model_desc"是" SIMPLE"。所有"最后完全备份" vals也是一样的 - 2014年10月31日 - 差不多一年半之前。

我很长时间没有DBAdmin,所以不知道这些是什么意思,或者最重要的是,如何防止错误信息发生。

我可以从C#端做些什么来防止这种情况"什么都没有"发生错误?

整个错误信息是:

  

日期:2016/3/7 2:24:45消息:2016年3月7日星期一:异常消息:数据库' tempdb'的事务日志由于充满了   ' NOTHING&#39 ;.异常来源:.Net SqlClient数据提供程序异常   StackTrace:at   System.Data.SqlClient.SqlConnection.OnError(SqlException异常,   布尔值breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.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,布尔& dataReady)at   System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()at   System.Data.SqlClient.SqlDataReader.get_MetaData()at   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,   RunBehavior runBehavior,String resetOptionsString)at   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean   async,Int32超时,任务& task,Boolean asyncWrite,SqlDataReader   ds,Boolean describeParameterEncryptionRequest)at   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String   方法,TaskCompletionSource`1完成,Int32超时,任务&任务,   布尔asyncWrite)at   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String   方法)at   System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior   行为,String方法)at   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(的CommandBehavior   行为)   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(的CommandBehavior   在System.Data.Common.DbDataAdapter.FillInternal(DataSet。)的行为)   dataset,DataTable [] datatables,Int32 startRecord,Int32 maxRecords,   字符串srcTable,IDbCommand命令,CommandBehavior行为)at   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet,Int32   startRecord,Int32 maxRecords,String srcTable,IDbCommand命令,   CommandBehavior行为)at   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)at   ReportRunner.SharedCode.SQLDBHelper.ExecuteSQLReturnDataTable(字符串   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];
    }
}

那么我可以添加到此代码中以减轻甚至消除问题吗?

0 个答案:

没有答案