Asp.net SqlDataAdapter Fill提供空主键
所以我有点头痛,我正在寻求帮助。我们最近将ASP.Net web表单应用程序从.Net 3.5、Win 2003和SQL 2008移动到了.Net 4.5、Win 2008和SQL 2012。该应用程序在旧平台上运行了4年多,没有任何问题。在新平台上,我们遇到了间歇性故障,导致其崩溃。我们添加了错误捕获,以隔离问题发生的确切位置以及我们所看到的没有任何意义 引发错误的行位于我们的DAL中,它查询表以获取与指定父键相关的主键列表:Asp.net SqlDataAdapter Fill提供空主键,asp.net,sql-server,sqldataadapter,Asp.net,Sql Server,Sqldataadapter,所以我有点头痛,我正在寻求帮助。我们最近将ASP.Net web表单应用程序从.Net 3.5、Win 2003和SQL 2008移动到了.Net 4.5、Win 2008和SQL 2012。该应用程序在旧平台上运行了4年多,没有任何问题。在新平台上,我们遇到了间歇性故障,导致其崩溃。我们添加了错误捕获,以隔离问题发生的确切位置以及我们所看到的没有任何意义 引发错误的行位于我们的DAL中,它查询表以获取与指定父键相关的主键列表: 选择 ItemKey 从项目 其中ItemParentKey=@K
选择
ItemKey
从项目
其中ItemParentKey=@Key
创建表项
(
ItemKey int标识(1,1)不为空
,ItemParentKey int
,约束PK_项主键群集(ItemKey)
)
在.net端,我们使用SQL数据适配器的fill方法调用包含上述select语句的存储过程,并将结果加载到数据表中。当我们尝试循环遍历datatable的行并对键执行某些操作时,会发生错误,所有键都为null,这会导致无效的强制转换异常。数据表在xsd文件中定义,其中有一个名为Key的整数列
Adapter.Fill(数据);
foreach(data.KeyList中的KeyListRow行)
{
Item.Children.Add(Row.Key);//无效的强制转换异常
}
应该注意的是,实际上是设计器生成的代码在尝试转换为强类型列时抛出异常,我们可以在这里捕获异常
对此进行一次尝试,并添加代码以记录查询参数和结果的详细信息,这表明查询返回的参数值行数正确,但它们都返回null…(这在上述查询和表定义中是不可能的)
其他几点,这是间歇性的,它可以工作几天或几周而没有问题,然后在一周内每小时崩溃一次。当应用程序关闭时,手动执行存储的过程并检查导致错误的记录的数据将显示预期值,而不是应用程序在日志中报告的结果。重新启动站点的应用程序池将清除问题并使我们恢复正常,直到再次发生。在流量水平和应用程序宕机的频率之间似乎有轻微的相关性,但到目前为止,我们还无法具体分离出什么
对可能的原因或进一步的调查途径有何建议
编辑2015-03-16 例外情况详情: ExceptionType-ExceptionMessage(钻取内部异常)
data.KeyList[0]。键:NULL
data.KeyList[1]。键:NULL
data.KeyList[2]。键:NULL
data.KeyList[3]。键:NULL
data.KeyList[4]。键:NULL
data.KeyList[5]。键:NULL
data.KeyList[6]。键:NULL 设计器生成的代码: 公共部分类dsXXXX:global::System.Data.DataSet { 私有KeyListDataTable表keylist; [全局::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute(“System.Data.Design.TypedDataSetGenerator”,“4.0.0.0”)] [全局::System.ComponentModel.Browsable(false)] [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] PublicKeyListDataTableKeyList{ 得到{ 返回此.tableKeyList; } } /// ///表示强命名的DataTable类。 /// [全局::System.Serializable()] [global::System.Xml.Serialization.XmlSchemaProviderAttribute(“GetTypedTableSchema”)] 公共部分类KeyListDataTable:global::System.Data.TypedTableBase{ 私有全局::System.Data.DataColumn columnKey; [全局::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute(“System.Data.Design.TypedDataSetGenerator”,“4.0.0.0”)] 公钥ListDataTable(){ this.TableName=“KeyList”; this.BeginInit(); this.InitClass(); this.EndInit(); } [全局::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute(“System.Data.Design.TypedDataSetGenerator”,“4.0.0.0”)] 内部KeyListDataTable(全局::System.Data.DataTable){ this.TableName=table.TableName; if((table.CaseSensitive!=table.DataSet.CaseSensitive)){ this.CaseSensitive=table.CaseSensitive; } if((table.Locale.ToString()!=table.DataSet.Locale.ToString()){ this.Locale=table.Locale; } if((table.Namespace!=table.DataSet.Namespace)){ this.Namespace=table.Namespace; } this.Prefix=table.Prefix; this.MinimumCapacity=table.MinimumCapacity; } [全局::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute(“System.Data.Design.TypedDataSetGenerator”,“4.0.0.0”)] 受保护的KeyListDataTable(全局::System.Runtime.Serialization.SerializationInfo,全局::System.Runtime.Serialization.StreamingContext上下文): 基础(信息、上下文){ this.InitVars(); } [全局::System.Diagnostics.DebuggerNonUserCodeAttribute()] [g]