Announcement

Collapse
No announcement yet.

ADO-Recordset ist immer 'readonly' (MS SQL Server)

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

  • ADO-Recordset ist immer 'readonly' (MS SQL Server)

    Hallo Experten,
    ich habe ein Problem mit den ADO-Recordset und SQL-Server 2000.
    Mein Programm ist mit Delphi 6 geschrieben und verbindet sich korrekt mit der Datenbank.
    Mit dem Kommando 'SELECT * FROM Table1 WHERE Number = '12345' hole ich einen Datensatz. Dieser ist zwar lesbar, kann aber nicht modifziert werden. Die Eigenschaft CanModfy ist false. Ich habe ohne Erfolg mit

    verschiedenen Parametereinstellungen experimentiert.
    Hier ein kurzer Überblick der verwendeten Parameter:
    Connection1.ConnectOptions := coConnectUnspecified
    RecordSet1.CursorLocation := clUseClient;
    RecordSet1.CursorType := ctStatic;
    RecordSet1.LockType := ltOptimistic;
    RecordSet1.MarshalOptions := moMarshalModifiedOnly;
    Was mache ich falsch ? Auf die Datenbank habe ich vollen Zugriff. Z.B. kann ich ohne weiteres mittels des
    ADO-Kommandos und der SQL-Anweisung UPDATE die Table1 ändern.

    Vielen Dank im voraus, falls mir jemand einen Hinweis hierzu geben kann.

  • #2
    Hallo,

    ich kann das Problem nicht reproduzieren - bei dem folgenden Beispiel (das auf die <i>Northwind</i>-Beispieldatenbank des lokal installierten MS SQL Server 2000 Developer Edition über die integrierte Windows-Authentifizierung zugreift) zeigt die MessageBox immer "Editierbar" an:

    <pre>

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, DB, Grids, DBGrids, ADODB, StdCtrls;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    ADOConnection1: TADOConnection;
    ADODataSet1: TADODataSet;
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    procedure Button1Click(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ADOConnection1.Connected := True;
    ADODataSet1.Active := True;
    if ADODataSet1.CanModify then
    ShowMessage('Editierbar.')
    else
    ShowMessage('Nicht Editierbar.');
    ADODataSet1.Active := False;
    ADOConnection1.Connected := False;
    end;

    end.

    </pre>

    Konfiguration im Objektinspektor:

    <pre>

    object Form1: TForm1
    Left = 192
    Top = 114
    Width = 870
    Height = 640
    Caption = 'Form1'
    Color = clBtnFace
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Sans Serif'
    Font.Style = []
    OldCreateOrder = False
    PixelsPerInch = 96
    TextHeight = 13
    object Button1: TButton
    Left = 152
    Top = 64
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
    end
    object DBGrid1: TDBGrid
    Left = 40
    Top = 112
    Width = 521
    Height = 257
    DataSource = DataSource1
    TabOrder = 1
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    end
    object ADOConnection1: TADOConnection
    ConnectionString =
    'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In' +
    'fo=False;Initial Catalog=Northwind;Data Source=.'
    LoginPrompt = False
    Provider = 'SQLOLEDB.1'
    Left = 40
    Top = 64
    end
    object ADODataSet1: TADODataSet
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText = 'select RegionID, RegionDescription from Region where RegionID=3'
    Parameters = <>
    Left = 80
    Top = 64
    end
    object DataSource1: TDataSource
    DataSet = ADODataSet1
    Left = 112
    Top = 64
    end
    end

    </pre&gt

    Comment


    • #3
      Hallo Werner Peter,

      Bei mir funktioniert es ebenfalls anstandlos.

      Mir ist aber noch aufgefallen, das Du in Deiner Where Bedingung das Feld Number mit '12345' abfragst. Ist dies nur ein Versehen !?

      Generell ist es zwar möglich, Number oder Integer Felder nach Strings zu durchsuchen, jedoch bremst dies Deine Abfrage erheblich aus.

      SELECT * FROM Table1 WHERE Number = '12345'

      Gruß, To

      Comment


      • #4
        Hallo Herr Kosch, hallo Tom, <br> vielen Dank für Ihre Unterstützung. Die Fehler habe ich inzwischen gefunden und behoben. Das Beispiel von Herrn Kosch funktioniert auch bei mir und es funktioniert auch mit meinem Programm, wenn ich die SELECT-Anweisung direkt in das DataSet-Objekt einschreibe. Rief ich aber die gespeicherte Prozedur mit der SELECT-Anweisung auf, so bekam ich keinen Datensatz zurück.
        <p>
        Die Ursachen:<br>
        1.Leider hatte ich meine Diagnoseanzeige falsch interpretiert und angenommen es wäre ein Datensatz gelesen worden.<br>
        2. Die Verbindung zur Datenbank hatte ich mit Connection.CursorLocation := clUseClient hergestellt und anschließend verschiedenen Datenbankoperationen durchgeführt.
        Um die nachfolgende Operation 'Auffüllen eines BLOB-Feldes' mit einer Datei optimal zu gestalten, stellte ich die CursorLocation um. <br><br>
        <pre> DataSet.Close
        DataSet.CursorLocation := clUseServer; {<--???}
        DataSet.LockType := ltOptimistic;
        </pre>
        <br>
        Eine darauf folgend ausgeführte gespeicherte Prozedur mit SELECT-Anweisung lieferte keinen, die direkte Ausführung der SELECT-Anweisung dagegen den gewünschten Recordset.<br>
        <br>
        Vielen Dank noch für den Hinweis bezüglich des Stringfeldes. In meinem vorliegenden Fall werden außer den Ziffern auch andere Zeichen für die Nummer verwendet.<br>
        <br>
        Werner Peter
        <br><br>
        P.S. Besonderen Dank noch an Herr Kosch. Das Buch 'ADO und Delphi' war und ist mir sehr hilfreich bei meiner Einbarbeitung in das Datenbankthema.<br&gt

        Comment


        • #5
          Hallo,

          wenn die Anwendung im Fall einer MS SQL Server-Datenbank auf <b>clUseServer</b> konfiguriert wird, würde ich die 30 Seiten aus dem Kapitel 7 nochmals lesen. Der serverseitige Cursor hat einige Nebenwirkungen, die man vorher kennen sollte :-

          Comment


          • #6
            Danke, werde das Kapitel nochmals sorgfältig studieren

            Comment

            Working...
            X