使用SQLDMO恢复数据库 返回 远程主机强迫关闭了一个现有的连接

yemeilang 2008-05-08 11:02:02
使用SQLDMO恢复数据库时杀死进程,也执行成功了,但是返回远程主机强迫关闭了一个现有的连接。请问是什么原因?

错误如下:
在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 在向服务器发送请求时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)

源错误:

执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
...全文
1670 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
c015422 2012-02-10
  • 打赏
  • 举报
回复
一定要说一下
sqlConnection.ClearAllPools();
超级棒!!!
lqmgf222 2011-08-24
  • 打赏
  • 举报
回复
我顶啊 我狂顶 clearAllPools 超牛
love_ldd 2010-03-29
  • 打赏
  • 举报
回复
ClearAllPools 超赞!!!
Hurryuppp 2009-04-09
  • 打赏
  • 举报
回复
楼上的兄弟的方法很用,赞一下,,,,
fjmazhicheng5522 2009-01-09
  • 打赏
  • 举报
回复
实际上,碰到这个问题还有一种方法,就是清空连接池。sqlConnection.ClearAllPools();
yemeilang 2008-05-15
  • 打赏
  • 举报
回复
谢谢ydsunny的提示,问题解决,虽然解决方案不是很科学。 如下:
在Process中有两个链接到当前数据库,kill掉其中一个,另一个保持连接,就不会弹出提示。

感谢所有参与解答的朋友。
nik_Amis 2008-05-14
  • 打赏
  • 举报
回复
偶记的偶的恢复是可以的,但是最大的问题是,不同的语种和不同的物理路径
nik_Amis 2008-05-14
  • 打赏
  • 举报
回复
超级不喜欢SQLDMO

欧以前做数据库恢复都是用SP做的,好像是先联到master然后,执行SP_KILL还是啥的你查查help,比较麻烦

实在不行你就restart sql service
九章落地 2008-05-14
  • 打赏
  • 举报
回复
我已好久没接触Web,但总觉得不应与Web方式有关。很可能你的Web页面,还有其他的进程连接Sql Server,被Kill后弹出了对话框,而不一定是执行Kill命令的进程。

有个方式你可一试:
1、执行Kill Process前,用查询分析器连接到Sql Server服务器,执行sp_who命令,查看当前Web服务器连接Sql Server的进程有哪些,并记录下它们的SPID。
2.执行Kill Process方法,亦是用sp_who查看当前进程情况,特别是识别出执行Kill Process的进程。若你是单独调试,执行Kill Process的时候,IIS应该只有一个连接连到Sql Server才对。

通过sp_who,可以跟踪到哪些进程被杀掉,以及是否杀掉了当前进程。
yemeilang 2008-05-14
  • 打赏
  • 举报
回复
//KILL DataBase Process
SqlConnection conn = new SqlConnection("server=" + ServerName + ";uid=" + UserName + ";pwd=" + Password + ";database=master");
conn.Open();
SqlCommand cmd = new SqlCommand("use master Select spid FROM sysprocesses ,sysdatabases Where sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='" + strDbName + "'", conn);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
oSQLServer.KillProcess(System.Convert.ToInt32(dr[0].ToString()));
}
dr.Close();
conn.Close();

用的是master数据库,但是我用web服务器连接的数据库服务器,我总认为是和网络访问有关系。
九章落地 2008-05-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yemeilang 的回复:]
我按你提到的方式试了,还是不行。

一种是用存储过程,另外一种是用use master.结果是一样的。

恢复数据库能执行,但总是弹出对话框。
[/Quote]

我觉得你可以检查一下你的代码,因为从错误信息看,显然是自己的Connection被Kill掉了.由于不了解你的SQLDMO.SQLServer类的内部结构,我想请问:
oSQLServer.Connect(ServerName, UserName, Password);
这条语句产生的oSQLServer,是连接到Master吗?

还可在这条语句设一个断点,看它connection的数据库:
oSQLServer.KillProcess(lPID);
yemeilang 2008-05-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ydsunny 的回复:]
你通过KillProcess杀死掉了连接该数据库的所有进程,就意味着,每个被关闭的连接都会收到这样的信息:(provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)

可以试试,把恢复数据库的操作,连接到Master库,再杀掉需恢复数据库的连接,这样应可避免把自己也杀掉.
[/Quote]

我按你提到的方式试了,还是不行。

一种是用存储过程,另外一种是用use master.结果是一样的。

恢复数据库能执行,但总是弹出对话框。

九章落地 2008-05-13
  • 打赏
  • 举报
回复
你通过KillProcess杀死掉了连接该数据库的所有进程,就意味着,每个被关闭的连接都会收到这样的信息:(provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接。)

可以试试,把恢复数据库的操作,连接到Master库,再杀掉需恢复数据库的连接,这样应可避免把自己也杀掉.
yemeilang 2008-05-08
  • 打赏
  • 举报
回复
是不是和局域网访问的TCP协议什么有关?权限之类的。
yemeilang 2008-05-08
  • 打赏
  • 举报
回复
不然无法进行数据恢复

这是恢复数据库的函数
///<summary>
/// 数据库恢复
///</summary>
public static bool RestoreDb(string ServerName, string UserName, string Password, string strDbName, string strFileName, out string errMsg)
{
SQLDMO.Restore oRestore = new SQLDMO.RestoreClass();
SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
try
{
oSQLServer.LoginSecure = false;
oSQLServer.Connect(ServerName, UserName, Password);


SQLDMO.QueryResults qr = oSQLServer.EnumProcesses(-1);
int iColPIDNum = -1;
int iColDbName = -1;
for (int i = 1; i <= qr.Columns; i++)
{
string strName = qr.get_ColumnName(i);
if (strName.ToUpper().Trim() == "SPID")
{
iColPIDNum = i;
}
else if (strName.ToUpper().Trim() == "DBNAME")
{
iColDbName = i;
}
if (iColPIDNum != -1 && iColDbName != -1)
break;
}
//杀死使用strDbName数据库的进程
for (int i = 1; i <= qr.Rows; i++)
{
int lPID = qr.GetColumnLong(i, iColPIDNum);
string strDBName = qr.GetColumnString(i, iColDbName);
if (strDBName.ToUpper() == strDbName.ToUpper())
{
oSQLServer.KillProcess(lPID);
}
}

oRestore.Action = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database = strDbName;
oRestore.Files = backuppath + strFileName + ".bak";
oRestore.FileNumber = 1;
oRestore.ReplaceDatabase = true;
oRestore.SQLRestore(oSQLServer);
errMsg = string.Empty;
return true;
}
catch (System.Exception ex)
{
errMsg = ex.Message;
return false;
}
finally
{
oSQLServer.DisConnect();
}
}
yemeilang 2008-05-08
  • 打赏
  • 举报
回复
杀死使用数据库的进程
真相重于对错 2008-05-08
  • 打赏
  • 举报
回复
使用SQLDMO恢复数据库时杀死进程,
===========
杀死什么进程?
yemeilang 2008-05-08
  • 打赏
  • 举报
回复
web服务器和数据服务器是局域网中的两台机器。
yemeilang 2008-05-08
  • 打赏
  • 举报
回复
恢复数据库的时候这一步是必须的,相当于强制恢复该数据库。
真相重于对错 2008-05-08
  • 打赏
  • 举报
回复
你都把它杀了,还能连接?

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧