【问题标题】:Getting Delphi 7 to play with SQL Server Compact 3.5让 Delphi 7 与 SQL Server Compact 3.5 一起玩
【发布时间】:2012-12-22 17:01:35
【问题描述】:

我们有一个用 Delphi 7 编写的旧应用程序。它当前连接到一个即将停用的旧 Oracle Lite 数据库。选择将数据移动到 Microsoft SQL Server Compact 数据库的权力。在花费大量时间将所有内容转移到 SQL CE 数据库之后,我现在的任务是让 Delphi 应用程序与新数据库完美配合。

应该比我聪明的人(我的老板)告诉我,我应该能够简单地修改连接,一切都应该恢复正常。然而,两天来我一直在用头撞显示器,试图让 Delphi 应用程序中的 ADO 连接与我们的新 SQL CE 数据库一起工作。

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

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

procedure TGlobal.DataModuleCreate(Sender: TObject);
begin
    adoConn.ConnectionString := 'Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5;Data Source=path\db.sdf;';
    adoConn.Connected := True;
end;

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

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。我尝试了几种不同版本的连接字符串和几种不同的方法来尝试查询数据,但结果都是一样的。我要么无法连接到数据库,要么得到那个愚蠢的“多步”错误。

在此先感谢您提供的任何帮助。

【问题讨论】:

    标签: delphi sql-server-ce delphi-7 sql-server-ce-3.5


    【解决方案1】:

    不要将ExecSQL 用于返回记录集的查询。

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

    更新

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

    更新2

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

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

    所以:SQL Server Compact Edition 3.5 gives "Multiple-step operation generated errors" error for simple query

    ref1:http://www.tech-archive.net/Archive/SQL-Server/microsoft.public.sqlserver.ce/2008-07/msg00019.html

    ref2:https://forums.embarcadero.com/thread.jspa?messageID=474517

    ref3:http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/48815888-d4ee-42dd-b712-2168639e973c

    【讨论】:

    • 感谢您的建议。将 adoQuery.ExecSQL 替换为 adoQuery.Open 消除了“多步骤”错误,但将其替换为一个新错误,内容为:“对象已打开”adoQuery.Active := True 给出了相同的结果。
    • 用您建议的替换替换 adoQuery.ExecSQL 后,我的示例代码给出了“对象已打开”错误。为了简化事情并尝试更深入地挖掘,我创建了一个新项目,它创建一个 TADOQuery 对象,设置 ConnectionString,设置 SQL 文本,然后打开 TADOQuery 对象(而不是使用 TADOConnection 对象)。结果是一样的,当应用程序试图打开 TADOQuery 对象时,它返回“Object was open”错误。
    • 就是这样。该表有一列设置为 500 个字符。将列减少到 127 个字符后,我能够毫无错误地运行代码。将列调整为 128 个字符会导致错误返回。我真的很感谢你为我找到了这个。不幸的是,我将不得不回到绘图板上,因为这样的限制是不可接受的。我只想记录在案并声明存在限制已经足够糟糕了,但错误消息完全具有误导性也是非常可悲的。再次感谢您的帮助。
    • @SteveO:很高兴我能帮上忙。放弃 SQL CE,那里有很多不错的替代品(firebird、sql server express、mysql、..)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多