none
利用OLEDB读取SQL Compact Edition数据库出错,请问如何解决 RRS feed

  • คำถาม

  • 大家好:

    我开发了一款Windows桌面程序DBSync,使用OLEDB或ODBC连接数据库,实现数据库增量同步,目前大多数数据库工作正常,但在读取SQL Compact Edition数据库时遇到以下问题:
    如果数据表中包含ntext和image字段,执行select SQL语句会报错:OleDbDataAdapter内部错误: 无效的行集访问器: 序号=3状态=不支持的转换。

    vb.net代码如下:

    Try
            Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.SQLSERVER.CE.OLEDB.4.0;Data Source=c:\northwind.sdf")
            conn.Open()
            Dim com As OleDbCommand = New OleDbCommand("select * from Categories", conn)
            Dim reader As OleDbDataReader = com.ExecuteReader()
            reader.Close()
            conn.Close()
    Catch ex As Exception
            Console.WriteLine(ex.Message)
    End Try

    如果删除Categories表的ntext和image字段,或者select其它不含ntext和image字段的表,如:select * from customers,都没问题,因此可以确认问题来自于ntext、image字段。
    我知道,使用System.Data.SqlServerCe可能是另一种解决方案,但由于该程序需要适应各种数据库,统一使用OLEDB或ODBC是最方面的,因此目前还不想采用System.Data.SqlServerCe。

    请问如何解决,谢谢。


    30 พฤศจิกายน 2564 16:29

ตอบทั้งหมด

  • Hi bhguo,

    该问题是由不受支持的数据类型引起的,尝试将数据库中的列类型由 ntext 改成 nvarchar,将 image 改成 varbinary.

    希望对你有帮助。

    Best Regards,

    Xingyu Zhao


    Visual Basic and CLR forum will be migrating to a new home on Microsoft Q&A! (VB.NET and CLR) We invite you to post new questions in the new home on Microsoft Q&A ! For more information, please refer to the sticky post(VB.NET and CLR).

    1 ธันวาคม 2564 1:51
    ผู้ดูแล
  • 谢谢Xingyu Zhao的回复,

    修改列类型的方式应该不行。首先,原有的ntext、image字段,数据长度可能大于8000,而nvarchar、varbinary最长只能8000,会容纳不下。其次,由于SQL Server CE每行容量不得超出8060字节,因此才使用ntext、image,该类型字段的数据是存储在行外的,不占用行容量,所以能容纳下。如果换成nvarchar、varbinary.,这些数据就只能存储在行内,会超出8060限制,也容纳不下了。



    • แก้ไขโดย bhguo 1 ธันวาคม 2564 4:36
    1 ธันวาคม 2564 4:17
  • Hi bhguo,

    考虑到你要适应各种数据库,有以下两种方法你可以尝试一下。

    1. 不使用 OleDbDataAdapter, 如果是填充 DataTable, 直接用 DataTable.Load(...)方法。

    2. 如果是字符串超过长度,就截断这些超长的字符串,可能有用的链接: 

        How to run a more than 8000 characters SQL statement from a variable?

        如果是图片,考虑只在数据库中存储图片的路径。

    Best Regards,

    Xingyu Zhao


    Visual Basic and CLR forum will be migrating to a new home on Microsoft Q&A! (VB.NET and CLR) We invite you to post new questions in the new home on Microsoft Q&A ! For more information, please refer to the sticky post(VB.NET and CLR).


    1 ธันวาคม 2564 7:15
    ผู้ดูแล
  • Hi Xingyu Zhao,

    更改图片存储方式,这样不行。我这个DBSync是用于数据库同步的,是作为产品投放市场的,不是针对性的定制开发,因此,用户数据库的既有结构是不能动的,否则可能影响既有数据库程序的运行,事情就更复杂了。

    我用OLEDB、ODBC方案已实现十几种主流数据库的同步,包括SQL Server常规版本(2000、2005、2008、2012、2014等,唯独SQL Server CE不行。我注意到,SQL Server CE能搜到的最后版本是4.0,相关dll文件的日期是2012年,相当于近10年没升级修改,这是否意味微软已放弃SQL Server CE?能否帮我提交一下需求,常规SQL Server一样支持OLEDB或ODBC访问ntext、image字段?

    谢谢!

    1 ธันวาคม 2564 10:19
  • 这是SQL CE的ADO.Net OLEDB提供者没有支持的字段类型。这个提供者是从面向Windows CE的代码移植而来,因而功能并不完整。如果不能用System.Data.SqlServerCe,你可以尝试用Entity Framework或者NHibernate来支持多种数据库。如果你会C++,也可以考虑直接用SQL CE的本地OLEDB提供者的ISequentialStream接口访问ntext字段,记得用本地OLEDB提供者是可以select * 包含ntext字段的。这个需求已经提了好多年,微软没有发布新版本的SQL CE的ADO.Net OLEDB提供者的迹象。


    Visual C++ MVP

    1 ธันวาคม 2564 14:39
    ผู้ดูแล
  • 谢谢 Sheng Jiang 蒋晟

    知道了,既然微软知道这个问题好多年,也不发布新版本,说明SQL CE已经过气,用户群应该很少了。因此,我们也不强求尽善尽美,做到有限支持即可,日后有实际需要时再说,毕竟DBSync已支持Oracle、MySQL、MSSQL、PostgreSQL、DB2、SQLite、Firebird、Access等绝大多数数据库。

    3 ธันวาคม 2564 2:21
  • Hi @bhguo ,

    是的,SQL CE确实已被弃用,现在可以使用 SQL Server Express 作为其替代品。


    Visual Basic and CLR forum will be migrating to a new home on Microsoft Q&A! (VB.NET and CLR) We invite you to post new questions in the new home on Microsoft Q&A ! For more information, please refer to the sticky post(VB.NET and CLR).


    6 ธันวาคม 2564 6:34
    ผู้ดูแล