Announcement

Collapse
No announcement yet.

ADO - Recordset - Value

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

  • ADO - Recordset - Value

    Folgende Ausgangssituation:

    aConnection := CoConnection.Create; <br>
    aRecordSet := CoRecordSet.Create; <br>
    // <br>
    strSqlSelect := 'SELECT Plz from Adressen'; <br>
    // <br>
    with aRecordSet do begin <br>
    CursorLocation := adUseClient; <br>
    Open(strSqlSelect,aConnection,adOpenKeyset,adLockO ptimistic,adCmdText);<br>
    end;<br>

    // mit Click auf Button<br>

    aRecordSet.MoveNext;<br>
    ...<br>
    if aRecordset.Fields.Item['Plz'].Value = NULL then<br>
    edtPlz.Text := ''<br>
    else<br>
    edtPlz.Text := aRecordset.Fields.Item['Plz'].Value;<br>
    ...<br>

    Problem:<br>
    Fehlermeldung "Ungültige Variant-Operation"<br>

    Die Spalte Plz wurde in Oracle als Number und in MS-Sql-Server als
    Numeric angelegt. Bei anderen Spalten (wie z.B. Name, Vorname...) <br>
    kann ich eine Prüfung ...Value = NULL <br> ohne Fehlermeldung
    drchführen. Nur bei Plz
    tritt der Fehler auf. Daraufhin habe ich in Oracle die Spalte Plz von
    Number in Float umbenannt <br> und in SqlServer von Numeric in Int.
    Der o.g. Fehler trat danach nichtmehr auf.
    <br>
    Frage:
    Kann mir jemand erklären, weshalb eine NULL-Prüfung bei Number/Numeric
    eine Fehlermeldung verursacht und Float/Int nicht ??

  • #2
    Hallo,

    das Problem tritt beim "offiziellen" Zugriff über <b>VarIsNull</b> nicht auf, wie das folgende Beispielprojekt für eine Microsoft SQL Server 2000-Datenbank (tempdb) demonstriert:
    <pre>
    {

    CREATE TABLE Test(
    TESTID INT NOT NULL IDENTITY PRIMARY KEY,
    Test NUMERIC)

    insert into test (Test) Values(12345)
    insert into test (Test) Values(NULL)
    insert into test (Test) Values(54321)

    }

    uses ADOInt;

    procedure TForm1.Button1Click(Sender: TObject);
    resourcestring
    cCS = 'Provider=SQLOLEDB.1;Password=;Persist Security Info=False;User ID=sa;'+
    'Initial Catalog=tempdb;Data Source=(local)';
    var
    aConnection : _Connection;
    aRecordSet : _RecordSet;
    strSqlSelect : String;
    begin
    aConnection := CoConnection.Create;
    aConnection.Open(cCS, '', '', adOpenForwardOnly);
    aRecordSet := CoRecordSet.Create;
    strSqlSelect := 'SELECT * from test order by testid';
    with aRecordSet do
    begin
    CursorLocation := adUseClient;
    Open(strSqlSelect,aConnection,adOpenKeyset,adLockO ptimistic,adCmdText);
    end;
    aRecordSet.MoveFirst;
    if VarIsNull(aRecordset.Fields.Item['Test'].Value) then
    edtPlz.Text := ''
    else
    edtPlz.Text := aRecordset.Fields.Item['Test'].Value;
    ShowMessage('1. Datensatz');
    aRecordSet.MoveNext;
    if VarIsNull(aRecordset.Fields.Item['Test'].Value) then
    edtPlz.Text := ''
    else
    edtPlz.Text := aRecordset.Fields.Item['Test'].Value;
    ShowMessage('2. Datensatz');
    aRecordSet.MoveNext;
    if VarIsNull(aRecordset.Fields.Item['Test'].Value) then
    edtPlz.Text := ''
    else
    edtPlz.Text := aRecordset.Fields.Item['Test'].Value;
    aRecordSet.Close;
    aConnection.Close;
    end;
    </pre&gt

    Comment

    Working...
    X