我们在 .Net 4.0 和 SQL Server 2008 R2 上的暂存 Web 应用程序运行平稳超过 2 个月。突然之间,我们开始在应用程序中收到错误消息:
错误消息:System.InvalidOperationException:内部连接致命错误。在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)在 System.Data.SqlClient.SqlDataReader.HasMoreResults()
每当我的数据库查询返回超过约 700 行时,就会出现这种情况。奇怪的是,我的生产网站(与登台具有相同的代码库)在连接到登台数据库时运行良好。
我尝试将我的登台 Web 服务器连接到生产数据库(登台数据库的类似副本),但我得到了同样的错误。这个错误是暂时的,有时页面加载,有时我得到错误。
如果我将行数减少到 700 以下,则页面可以正常工作。
特定的存储过程在我的页面中只被调用一次。
我做了以下事情:
- 修改代码以在using块中使用命令对象。
- 使用完成后立即关闭连接。
- 比较暂存和生产 IIS 服务设置,它们看起来很相似。
- 两个 Web 服务器上都安装了相同的 MDAC。
但没有任何帮助,我仍然在登台 Web 服务器中遇到错误。该查询在 SQL Server Management Studio 中运行良好,耗时 < 3 秒。
任何人都可以提出任何解决方案吗?
这是调用存储过程的代码库:
string strSPName = SQLSchema.strSQLSchema + SPNames.<Some SP Name>;
using (conn)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = strSPName;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
cmd.Parameters.Add(SPParams.<Some Param>, SqlDbType.Int);
cmd.Parameters[0].Value = <value of Param>;
conn.Open();
dsSubmitter = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(dsSubmitter);
if (dsSubmitter.Tables.Count != 0)
{
dsSubmitter.Tables[0].TableName = DALConstants.<Table Name>;
}
conn.Close();
}
SP 非常简单,带有一个 select 语句以及主表和详细表之间的 INNER 连接。主表有约 400 行,明细表 > 10,000 行。SQL 查询返回大约 4000 行。