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命令
这是否发生在开发环境和生产环境中?如果是这样,你需要用VS调试器一步一步地遍历你的代码,并锁定要删除会话的行。
您还应该检查生产服务器上的事件日志,看看它们是否可以提供任何信息。
正如msergey在注释中所述,这可能是Util.Add_Event_Log
抛出异常,但您应该通过逐步执行代码来测试。
如果是Util.Add_Event_Log
引起的问题,通过在外部作用域中声明一个异常变量,将这段代码从catch中移到它自己的try/catch语句中。
如果最终发现使用TRUNCATE是罪魁祸首,您可以尝试将其替换为使用DELETE语句。性能不会那么好,但你也不需要在SQL Server中提高用户权限。