1

我有以下问题,当我在过程中运行此代码时,从我的 SQL COMPACT DATABASE(sdf) 获取 SQL,它给我一个错误“对象已打开”。我怎样才能解决这个问题。以下是我的程序代码

Function GetSQL(sName: String; Var App: TApplication): String;
Var
  Q: TADOQuery;
Begin
  Q                  := TADOQuery.Create(App);
  Q.ConnectionString := GetConnectionStringFromRegistry;
  Q.Close;
  Q.SQL.Text                              := 'SELECT * FROM SQLs WHERE Name = :sname';
  Q.Parameters.ParamByName('sname').Value := sName;
  Try
    Q.Open;
    If Q.RecordCount >= 1 Then
      Begin
        Q.First;
        Result := Q['Query'];
        Q.Close;
      End;
  Finally
    Q.Free;
  End;
End;

[这是错误的样子] 这就是错误的样子 [这是我按下 Break 时代码的样子] 这就是我按下 Break 时代码的样子

4

2 回答 2

2

我看到的唯一可能是一个问题是,如果没有返回行,您的代码会使查询保持打开状态:

Q.Open;
Try
  If Q.RecordCount >= 1 Then
  Begin
    Q.First;
    Result := Q['Query'];
    Q.Close;   // If Q.RecordCount = 0 above, this line never executes
  End;
Finally
  Q.Free;
End;

移动Q.Close你的内部finally,所以它总是被调用:

Q.Open;
Try
  If Q.RecordCount >= 1 Then
  Begin
    Q.First;
    Result := Q['Query'];
  End;
Finally
  Q.Close;   // This will always run, even if no rows are returned
  Q.Free;    // or if an exception occurs.
End;

顺便说一句,您应该使用参数化查询而不是连接文本,特别是如果您多次运行相同的查询,唯一的变化是sName. 服务器足够智能,可以缓存已编译的查询并仅替换参数值,这意味着您的代码执行速度更快,服务器上的负载更少。

Function GetSQL(sName: String; Var App: TApplication): String;
Var
  Q: TADOQuery;
Begin
  Q                  := TADOQuery.Create(App);
  Q.ConnectionString := GetConnectionStringFromRegistry;

  // I've even tried closing it first
  Q.Close;
  Q.SQL.Text         := 'SELECT Query FROM SQLs WHERE Name = :sname'; 
  Q.ParamByName('sname').AsString := sName;
  Try
    // Error occurs here
    Q.Open;
    //Q.Active := True;
    If Q.RecordCount >= 1 Then
    Begin
      Q.First;
      Result := Q['Query'];
    End;
  Finally
    Q.Close;
    Q.Free;
  End;
End;
于 2013-05-24T11:13:09.630 回答
1

感谢@user582118 提醒这个...

这实际上是 SQL CE 的 OleDB 提供程序中的一个错误。如果您的表中有超过 127 个字符的 nvarchar 字段并且您对该表执行选择查询,您将收到 DB_E_OBJECTOPEN 错误。

原帖:https ://stackoverflow.com/a/14222561/800214

于 2013-05-24T17:29:23.700 回答