c#, SQL Server 2005和缺失会话

本文关键字:会话 2005 SQL Server | 更新日期: 2023-09-27 18:15:01

我遇到了一个客户的问题。我有这样的代码:

var conn = new SqlConnection(Util.GetConnectionString());
var DataCommand = new SqlCommand();
var sql = "";
// subseccion
try
{
   sql = "TRUNCATE TABLE preview_" + tablename;
   DataCommand = new SqlCommand(sql, conn);
   DataCommand.Connection.Open();
   int numcol = DataCommand.ExecuteNonQuery();
   sql = "insert into  preview_" + tablename+ " select * from " + tablename;
   DataCommand = new SqlCommand(sql, conn);
   DataCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
   var latest_error = ex.Message;
   Util.Add_Event_Log(latest_error);
}
finally
{
   DataCommand.Dispose();
   if (conn.State == ConnectionState.Open)
   {
      conn.Close();
   }
   conn.Dispose();
}

这做下一件事,我给一个表的名字,它截断一个表,然后复制信息从"表"到"preview_table",它的工作如预期的

然而,我们发现如果我们不给表的TRUNCATE权限,它会失败。但是,我的问题是,它不仅失败,而且删除当前会话(也可能重新启动服务器进程)

我打赌这是一个服务器问题(server 2003),可能它没有打补丁或任何东西,因为我在一个try-catch部分工作,所以它不应该以这种方式失败。

我的客户说问题出在代码上。

但我不确定,也许我不应该在一个链sql命令

c#, SQL Server 2005和缺失会话

这是否发生在开发环境和生产环境中?如果是这样,你需要用VS调试器一步一步地遍历你的代码,并锁定要删除会话的行。

您还应该检查生产服务器上的事件日志,看看它们是否可以提供任何信息。

正如msergey在注释中所述,这可能是Util.Add_Event_Log抛出异常,但您应该通过逐步执行代码来测试。

如果是Util.Add_Event_Log引起的问题,通过在外部作用域中声明一个异常变量,将这段代码从catch中移到它自己的try/catch语句中。

如果最终发现使用TRUNCATE是罪魁祸首,您可以尝试将其替换为使用DELETE语句。性能不会那么好,但你也不需要在SQL Server中提高用户权限。