我正在尝试使用Dataset
填充SqlDataAdapter
。为此我写了一个简单的函数,如下所示
public static DataTable GetData(string Query, SqlParameter[] parameters=null)
{
using (ReliableSqlConnection con = new ReliableSqlConnection(DBUtility.ConnectionString))
{
try
{
var cmd = con.CreateCommand();
cmd.CommandText = Query;
if (parameters != null)
{
foreach (SqlParameter p in parameters)
{
cmd.Parameters.Add(p);
}
}
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataSet ds = new DataSet();
//da.FillSchema(ds, SchemaType.Source);
da.Fill(ds);
return ds.Tables[0];
}
catch (StackOverflowException ex)
{
return null;
}catch
{
return null;
}
}
}
这是最新修改的版本,当我调用此函数时,我得到了
Exception of type 'System.StackOverflowException' was thrown.
异常,我的IIS崩溃并关闭实时服务器上的应用程序池。 (在Visual Studio中,它只是停止调试器)。哦,当我的Query返回一个Empty记录集时会发生这种情况,即我的查询有效但返回零行。如果数据存在,它就可以正常工作。
我搜索并且因为这个问题(How to fill a dataset with metadata even if the select query return no rows)建议使用FillSchema,我尝试但没有发现任何变化。我有" table"填写的名称定义,我删除但仍然没有变化。即使这段代码在Try catch
中,它仍然会崩溃服务器(我没有看到典型的ASP.NET错误页面,但发生这种情况时会出现503 Service not found
类错误。
我正在使用.NET Framework 4.5.1 / 4.6.1(是的,尝试在2版本上运行)。
An unhandled exception of type 'System.StackOverflowException' occurred in System.Data.dll
我只是意识到我的其他查询空记录并没有失败,然后我意识到,对于查询,它失败了一个列为" varchar(max)"作为数据类型,测试它是否为真,但我认为这是错误原因。
失败的查询是:select TitleName, [Message] from tblVerbiage where SaleId=@SaleID
我尝试强制转换为varchar(200),但它仍然会出错。所以,我的想法可能是我的表有点腐败?我做了DBCC checktable
,返回成功。我注意到此错误仅在此表中出现。
事实证明,代码中存在迭代查询的逻辑问题,因此可能会发生一些导致错误的内存泄漏。