c# - OleDbDataAdapter 内部错误 : invalid row set accessor. Status=UNSUPPORTEDCONVERSION

标签 c# sql-server database sql-server-ce oledb

我目前正在尝试将应用程序从 Microsoft Access 数据库迁移到 SQL Server Compact Edition。我已经设法使用 SSMA 和 SQL 工具箱转换数据库,但是我在使用旧的 c# 代码进行查询时遇到了一些错误(正如预期的那样)。到目前为止,我已经能够解决问题,但我对这个有点难过:

OleDbDataAdapter internal error: invalid row set accessor: Ordinal=# Status=UNSUPPORTEDCONVERSION

在查看 stackoverflow 和谷歌后,我发现这通常是使用 ntext 列的结果。但是,我没有使用任何内容,而是在表的第 18 列上使用了 NVARCHAR(MAX) 列。显然这些are supported适用于 SQL Server 2012。

无论如何,我决定将该列转换为 nvarchar(255) 以尝试使用此 T-SQL 查询进行修复:

UPDATE dbo.Table1 SET Col1 = LEFT(Col1, 255)
GO
ALTER TABLE dbo.Table ALTER COLUMN Col1 NVARCHAR(255)

这仍然没有修复错误,而且由于我不确定序数位置是什么,所以我使用以下查询来仔细检查:

SELECT COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
ORDINAL_POSITION
FROM GPLADB.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table1'
ORDER BY ORDINAL_POSITION

这产生了以下结果(顺便说一句,“配置文件”是我从 nvarchar(MAX) 更改为 nvarchar(255) 的列):

enter image description here

有人对下一步的调试有什么建议吗?一种选择是使用 SQL Server CE 类重写我的所有代码,但这需要很长时间,所以这是最后的手段。

最佳答案

我的错误是在进行更改后没有将我的 SQL Server 数据库转换为 SQL CE。然而,OleDb 似乎仍然不支持 nvarchar(max),因此我的解决方案是使用以下代码查找所有使用 nvarchar(max) 的列,因为这些字段的长度为 -1:

SELECT 
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE,
FROM [DatabaseName].COLUMNS
WHERE CHARACTER_MAXIMUM_LENGTH = '-1'

然后通过为找到的每个字段创建一个包含以下代码的脚本:

UPDATE dbo.Table1 SET Col1 = LEFT(Col1, 4000)
GO
ALTER TABLE dbo.Table ALTER COLUMN Col1 NVARCHAR(4000)

关于c# - OleDbDataAdapter 内部错误 : invalid row set accessor. Status=UNSUPPORTEDCONVERSION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35420135/

相关文章:

sql - 将行分组为 5 组

php - SQL 使用 replace() 选择 LIKE 结果和精确结果

java - 在 Android 中存储数据的最佳方式

C# 从不同语言环境解析 int

c# - 您会购买哪本 C# 4.0 书籍,为什么?

c# - 使用knockoutjs过滤有界项目

sql - 是否可以告诉 SSMS 不检查 t-sql 脚本中是否存在列?

java - 如何修剪 StringBuilder 字符串?

sql - 在 Groundhog Haskell 中通过投影键选择行的理想方法是什么

mysql - 向大表添加列 : datatype or INT or reference table?