让Delphi7与SQL Server Compact 3.5配合使用

让Delphi7与SQL Server Compact 3.5配合使用,delphi,sql-server-ce,delphi-7,sql-server-ce-3.5,Delphi,Sql Server Ce,Delphi 7,Sql Server Ce 3.5,我们有一个用Delphi7编写的旧应用程序。它当前连接到一个正在退役的旧Oracle Lite数据库。将选择将数据移动到Microsoft SQL Server Compact数据库的权限。在花了大量时间将所有内容转移到SQLCE数据库之后,我现在的任务是让Delphi应用程序更好地处理新数据库 那些应该比我(我的老板)聪明的人告诉我,我应该能够简单地修改连接,一切都应该恢复正常。然而,为了让Delphi应用程序中的ADO连接与我们新的SQL CE数据库一起工作,我已经用我的头撞了我的监视器两天

我们有一个用Delphi7编写的旧应用程序。它当前连接到一个正在退役的旧Oracle Lite数据库。将选择将数据移动到Microsoft SQL Server Compact数据库的权限。在花了大量时间将所有内容转移到SQLCE数据库之后,我现在的任务是让Delphi应用程序更好地处理新数据库

那些应该比我(我的老板)聪明的人告诉我,我应该能够简单地修改连接,一切都应该恢复正常。然而,为了让Delphi应用程序中的ADO连接与我们新的SQL CE数据库一起工作,我已经用我的头撞了我的监视器两天了

我正在使用的一个稍微简化的示例:

该连接在名为“adoConn”的TADOConnection的全局对象中建立:

此后不久,将调用一个过程来填充一些消息。为了解决应用程序的问题,我简化了代码,以进行简单的查询并在消息框中显示结果。该过程接收SQL字符串的一个参数,但我暂时忽略它,并手动插入一个简单的select语句:

procedure Select(const SQL: string);
var
    adoQuery : TADOQuery;
begin
    adoQuery := TADOQuery.Create(nil);
    try
        adoQuery.Connection := Global.adoConn;
        adoQuery.SQL.Text := 'select * from CLT_MESSAGES';
        adoQuery.ExecSQL;
        While not adoQuery.Eof do
        begin
            // Here I just created a MessageDlg to output a couple of fields.
            adoQuery.Next;
        end;
    finally
        adoQuery.Free;
    end;
end;
一切都可以正常编译,但当我运行应用程序时,会出现以下错误:

“多步骤操作生成错误。请检查每个状态值。”

我还做了一些额外的故障排除,发现错误发生在adoQuery.ExecSQL上。我尝试了几种不同版本的连接字符串和几种不同的数据查询方法,但结果都是一样的。我要么无法连接到数据库,要么就出现了愚蠢的“多步”错误


我提前感谢您提供的任何帮助。

对于返回记录集的查询,不要使用
ExecSQL

AdoQuery.Active
属性设置为
True
或使用
AdoQuery.Open
执行
SELECT
语句

更新

更改代码后,我们看到了真正的错误,即DB_E_OBJECTOPEN

更新2

深入挖掘之后,这似乎是OLE DB provider和大于127个字符的nvarchar字段中的一个已知错误

这些参考资料似乎证实了这一点:

因此:

参考文献1:

参考文献2:


参考3:

将光标类型更改为服务器端解决了127字符的问题:)

谢谢您的建议。将
adoQuery.ExecSQL
替换为
adoQuery.Open
消除了“多步”错误,但将其替换为一个新的错误,该错误为:“Object was Open”
adoQuery.Active:=True
给出了相同的结果。在使用建议的替换替换替换替换项替换
adoQuery.ExecSQL
后,我的示例代码给出了“Object was open”错误。为了简化操作并尝试深入挖掘,我创建了一个新项目,创建一个TADOQuery对象,设置ConnectionString,设置SQL文本,然后打开TADOQuery对象(而不是使用TADOConnection对象)。结果相同,当应用程序尝试打开TADOQuery对象时,它返回“对象已打开”“错误,就是这样。该表有一列设置为500个字符。在将列减少到127个字符后,我能够运行代码而没有错误。将列调整为128个字符导致返回错误。我真的很感谢你为我找到这个。不幸的是,我不得不回到绘图板上,因为这样的限制是不可接受的。我只想记录在案,指出限制已经存在,这已经够糟糕的了,但同样令人遗憾的是,错误消息完全是误导性的。再次感谢你的帮助。@SteveO:很高兴我能帮忙。抛开SQL CE不谈,有很多好的替代方案(firebird、SQL server express、mysql等等)
procedure Select(const SQL: string);
var
    adoQuery : TADOQuery;
begin
    adoQuery := TADOQuery.Create(nil);
    try
        adoQuery.Connection := Global.adoConn;
        adoQuery.SQL.Text := 'select * from CLT_MESSAGES';
        adoQuery.ExecSQL;
        While not adoQuery.Eof do
        begin
            // Here I just created a MessageDlg to output a couple of fields.
            adoQuery.Next;
        end;
    finally
        adoQuery.Free;
    end;
end;