【发布时间】:2016-08-31 14:23:27
【问题描述】:
我有一个控制台应用程序,可以将数据从一个数据库移动到另一个数据库。应用程序读取数据、更新数据并写入另一个数据库。查询非常简单,并且在出现错误时会记录下来。所以我可以尝试分别执行它们中的每一个,并且不会超过 50 毫秒(Profiler 告诉我)。但是我有很多行,并且在执行了其中一些行之后(1 000 - 10 000 个非常不同数量的执行行),我得到了一个超时:超时已过期。在操作完成之前超时时间已过或服务器没有响应。即使在“SELECT”查询期间也可以获得超时时间。
我已将 CommandTimout 设置为 120 并得到 从服务器接收结果时发生传输级错误。 (提供者:Session Provider,错误:19 - 物理连接不可用)所以,我认为这不是超时情况。
Profiler 和 traces 没有任何意外。
我使用了SqlConnection.ClearPool(cnnct);,但它不起作用;
请帮忙。
SQL 版本:Microsoft SQL Server 2008 R2 (SP1)
这是源数据库和目标数据库的代码。
public IEnumerable<SomeType> GetEntities()
{
IEnumerable<SomeType> result = null;
var selectQuery = GetSelectQuery();
try
{
using (var cnnct = new SqlConnection(_connectionString))
{
cnnct.Open();
var cmd = new SqlCommand(selectQuery, cnnct);
var reader = cmd.ExecuteReader();
result = Convert(reader);
reader.Close();
cmd.Dispose();
}
}
catch (Exception e)
{
Catch(selectQuery, e);
}
return result;
}
public Int32 Save(SomeType entity)
{
Int32 result = 0;
var insertQuery = GetInsertQuery(entity);
try
{
using (var cnnct = new SqlConnection(_connectionString))
{
cnnct.Open();
var cmd = new SqlCommand(insertQuery, cnnct);
result = (Int32)(Decimal)cmd.ExecuteScalar();
cmd.Dispose();
}
}
catch (Exception e)
{
Catch(insertQuery, e);
}
return result;
}
【问题讨论】:
-
您是否尝试将超时设置为 0(无限制)以查看它是否真正完成?
-
@Tanner 我已将默认 30 替换为 120 并得到另一个异常(在最初的帖子中描述)。我同意无限制超过 120,但无论如何,当我选择 120 秒时,我没有任何超时问题。我需要找到真正的原因。谢谢。
-
@Tanner Zero 没有帮助。但无论如何,谢谢。
-
附加信息:我添加了 SqlConnection.ClearAllPools();在每次连接使用并获得新异常后:Connection Timeout Expired。尝试使用登录前握手确认时超时时间已过。这可能是因为登录前握手失败或服务器无法及时响应。尝试连接到此服务器所花费的持续时间是 - [Pre-Login] 初始化 = 1;握手=12345;
标签: c# sql-server sql-server-2008 ado.net timeoutexception