如何解决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 举报,一经查实,本站将立刻删除。