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.JdbcOdbc...