OleDbDataAdapter internal error: invalid row set accessor. Status=UNSUPPORTEDCONVERSION

OleDbDataAdapter internal error: invalid row set accessor. Status=UNSUPPORTEDCONVERSION

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

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

在查看 Whosebug 和 google 后,我发现这通常是使用 ntext 列的结果。但是我没有使用任何东西,但是我在 table 的第 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

这产生了以下结果(顺便说一句,'Profile' 是我从 nvarchar(MAX) 更改为 nvarchar(255) 的列):

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

我的错误是在进行更改后没有将我的 SQL 服务器数据库转换为 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)