让Delphi7与SQL Server Compact 3.5配合使用
我们有一个用Delphi7编写的旧应用程序。它当前连接到一个正在退役的旧Oracle Lite数据库。将选择将数据移动到Microsoft SQL Server Compact数据库的权限。在花了大量时间将所有内容转移到SQLCE数据库之后,我现在的任务是让Delphi应用程序更好地处理新数据库 那些应该比我(我的老板)聪明的人告诉我,我应该能够简单地修改连接,一切都应该恢复正常。然而,为了让Delphi应用程序中的ADO连接与我们新的SQL CE数据库一起工作,我已经用我的头撞了我的监视器两天了 我正在使用的一个稍微简化的示例: 该连接在名为“adoConn”的TADOConnection的全局对象中建立: 此后不久,将调用一个过程来填充一些消息。为了解决应用程序的问题,我简化了代码,以进行简单的查询并在消息框中显示结果。该过程接收SQL字符串的一个参数,但我暂时忽略它,并手动插入一个简单的select语句:让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数据库一起工作,我已经用我的头撞了我的监视器两天
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;