Announcement

Collapse
No announcement yet.

Keine Ergebnismenge wenn vorher noch andere SQL Befehle ausgeführt wurden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Keine Ergebnismenge wenn vorher noch andere SQL Befehle ausgeführt wurden

    Hallo,

    beim umstellen von BDE zu ADO habe ich folgendes Problem bekommen.

    In einer StoredProc wird zuerste ein Datensatz eingefügt und danach
    die ID des Datensatzes zurückgeliefert. (MS 7.0).

    z.B.

    Insert ....

    SELECT @@identity AS Next_PKey

    Bei der BDE hat das einwandfrei funktioniert bei ADO bekommen ich die
    Fehlermeldung das der Command Text kein Ergebnis zurückliefert.

    Wenn ich den Select Befehl an den Anfang setze funktioniert es, dann
    ist aber natürlich das Ergebnis falsch.

    Dieses Problem konnte ich bei allen ADO Komponenten nachvollziehen.

    Vielleicht weis jemand rat.

    Stefan Glock

  • #2
    Hallo,

    das hört sich so an, als ob die ADO-Patches von <b>Mark Edington</b> (dem zuständigen Entwickler bei Borland) noch nicht eingespielt worden sind (Patch für "ADOStoredProc: CommandText does not return a result set"). Um dies nachzuprüfen, sollte die folgende Implementierung in der Unit ADODB.PAS zu finden sein:
    <pre>
    procedure TCustomADODataSet.OpenCursor(InfoQuery: Boolean);
    const
    AsyncOptions = [eoAsyncExecute, eoAsyncFetch, eoAsyncFetchNonBlocking];
    var
    ActiveConnection,
    Source: OleVariant;

    procedure InitializeConnection;
    var
    UseCommand: Boolean;
    begin
    { Async operations require a connection component so we can hook events }
    if not Assigned(Connection) and (ExecuteOptions * AsyncOptions <> []) then
    DatabaseError(SConnectionRequired);
    FConnectionChanged := False;
    ActiveConnection := EmptyParam;
    UseCommand := not (CommandType in RSOnlyCommandTypes);
    if UseCommand then
    begin
    SetConnectionFlag(cfOpen, True);
    Command.Initialize;
    InitializeMasterFields(Self);
    Source := Command.CommandObject;
    end else
    begin
    { Can't use command for cmdFile and cmdTableDirect }
    if Assigned(Connection) then
    begin
    Connection.Open;
    ActiveConnection := Connection.ConnectionObject;
    end else if ConnectionString <> '' then
    ActiveConnection := ConnectionString;
    Command.CheckCommandText;
    Source := CommandText;
    end;
    end;

    procedure InitializeRecordset;
    begin
    FRecordsetObject := CreateADOObject(CLASS_Recordset) as _Recordset;
    Recordset.CursorLocation := CursorLocationValues[FCursorLocation];
    Recordset.CacheSize := FCacheSize;
    Recordset.MaxRecords := FMaxRecords;
    if FIndexName <> '' then
    begin
    Recordset.Index := FIndexName;
    RefreshIndexFields;
    end;
    EnableEvents;
    end;

    var
    VarRecsAffected: OleVariant;
    begin
    if not Assigned(Recordset) then
    begin
    InitializeConnection;
    InitializeRecordset;
    Recordset.Open(Source, ActiveConnection,
    CursorTypeValues[FCursorType], LockTypeValues[FLockType],
    CommandTypeValues[CommandType] + ExecuteOptionsToOrd(ExecuteOptions));
    while Recordset.State = adStateClosed do
    try
    FRecordsetObject := Recordset.NextRecordset(VarRecsAffected);
    if Recordset = nil then Abort;
    except
    DatabaseError(SNoResultSet, Self);
    end;
    end else
    EnableEvents;
    if (eoAsyncExecute in ExecuteOptions) and
    ((Recordset.State and adStateExecuting) <> 0) then
    SetState(dsOpening);
    inherited OpenCursor(False);
    end;
    </pre>
    Die aktuellste Patch-Fassung findet sich in der <b>CodeCentral</b>-Datenbank auf der Community-Webseite von Borland

    Comment


    • #3
      Danke, nach dem ADO Update hat es funktioniert

      Comment

      Working...
      X