SqlDataReader与主键列有关的行为异常

如何解决SqlDataReader与主键列有关的行为异常

在对我们的一个内部数据库应用程序进行的琐碎修改造成严重破坏之后,我将其归因于sqlDataReader行为不当,与sqlDataAdapter及其对应的OleDb相比。 还是我错过了什么?

我使用OleDb和sql的经典northWind数据库使用此代码重现了该代码,其中“ Employees”表在第0列中具有典型的主键:

   Imports System.Data.sqlClient
   Imports System.Data.OleDb
   Private Sub test()
      Dim dtResult As DataTable
      Using cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=northWind.mdb;Mode=Share Deny None;Jet OLEDB:Database Locking Mode=1;")
         cn.open()
         Dim cmd As New OleDbCommand("SELECT TOP 5 * FROM Employees",cn)

         ' Fill table using OleDBDataAdapter
         dtResult = New DataTable
         Dim da As New OleDbDataAdapter(cmd)
         da.Fill(dtResult)
         Console.WriteLine("Table from OleDBAdapter: PrimaryKey.Length={0}  Column(0).Allowdbnull={1} .AutoIncrement={2}",dtResult.PrimaryKey.Length,dtResult.Columns(0).Allowdbnull,dtResult.Columns(0).AutoIncrement)
         Console.WriteLine("NewRow.Column(0)='{0}'",dtResult.NewRow.ItemArray(0).ToString)

         ' Load table using OleDbDataReader
         dtResult = New DataTable
         dtResult.Load(cmd.ExecuteReader)
         Console.WriteLine("Table from OleDBReader: PrimaryKey.Length={0}  Column(0).Allowdbnull={1} .AutoIncrement={2}",dtResult.NewRow.ItemArray(0).ToString)
      End Using

      Using cn As New sqlConnection("Server=sqlSVR01;Database=northWind;Integrated Security=True")
         cn.open()
         Dim cmd As New sqlCommand("SELECT TOP 5 * FROM Employees",cn)

         ' Fill table using sqlDataAdapter
         dtResult = New DataTable
         Dim da As New sqlDataAdapter(cmd)
         da.Fill(dtResult)
         Console.WriteLine("Table from sqlAdapter: PrimaryKey.Length={0}  Column(0).Allowdbnull={1} .AutoIncrement={2}",dtResult.NewRow.ItemArray(0).ToString)

         ' Load table using sqlDataReader
         dtResult = New DataTable
         dtResult.Load(cmd.ExecuteReader)
         Console.WriteLine("Table from sqlReader: PrimaryKey.Length={0}  Column(0).Allowdbnull={1} .AutoIncrement={2}",dtResult.NewRow.ItemArray(0).ToString)
      End Using

   End Sub

产生此输出

来自OleDBAdapter的

表:PrimaryKey.Length = 0列(0).Allowdbnull = True .AutoIncrement = False NewRow.Column(0)=''

来自OleDBReader的

表:PrimaryKey.Length = 0列(0).Allowdbnull = True .AutoIncrement = False NewRow.Column(0)=''

sqlAdapter中的

表:PrimaryKey.Length = 0列(0).Allowdbnull = True .AutoIncrement = False NewRow.Column(0)=''

来自sqlReader的表:PrimaryKey.Length = 0列(0).Allowdbnull = False .AutoIncrement = True NewRow.Column(0)='6'

请注意,即使未设置PrimaryKey,四个表中的最后一个表的第0列也具有Allowdbnull = False和AutoIncrement = True。更重要的是,这导致对NewRow()的调用根据sql中TOP 5检索到的有限数据用6填充Column(0),而 其他3例没有。

这肯定是错误的吗?

阅读What does MissingSchemaAction.AddWithKey really do?我意识到这可能与DataReader中的基础 CommandBehavIoUr 设置有关, 但是您肯定会期望 OleDBDataReader sqlDataReader 行为相同吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?