Announcement

Collapse
No announcement yet.

ADOQuery Parameter zur Laufzeit setzen geht schief

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

  • ADOQuery Parameter zur Laufzeit setzen geht schief

    Hallo,

    Hab eine ADOQuery die auf eine MS SQL 7.0 Datenbank zugreift:

    Ich weise Ihr zur Laufzeit einen SQL String zu. Dieser enzhält einen Parameter, nämlich datum;

    Das Property Parameter Check ist auf false;

    Ich führe ein Parameters.refresh durch.
    Dann setze ich für den Parameter den Datentyp: Es tritt eine Exception auf weil es keinen Parameter datum gibt.
    Wenn ich mir aber vor dem zuweisen des Datentyps den zugewiesenen SQL String ansehe dann ist da aber der Parameter sehr wohl vorhanden.

    Wenn ich den SQL String im Objektinpektor zuweise funktioniert es auch und das SQL Statement kann auch aufgelöst werden.

    Hab ich irgendwas vergessen?

    LG
    Peter

  • #2
    Hallo,

    es gibt (glaube ich) schon antworten hier.

    vielleicht hilft Dir folgendes weiter (Datentransfer):

    aCommand: _Command;
    aCommand := CoCommand.Create;

    with aCommand do
    begin
    CommandType := adCmdText;
    CommandText := Edit1.Text;

    for i := 0 to ListBox1.Count - 1 do

    begin
    if ListBox2.Items.Strings[i] = 'nvarchar' then
    Parameters.Append(CreateParameter(ListBox1.Items.S trings[i], adVarChar, adParamInput, 40, EmptyParam));

    if ListBox2.Items.Strings[i] = 'char' then
    Parameters.Append(CreateParameter(ListBox1.Items.S trings[i], adChar, adParamInput, 40, EmptyParam));

    if ListBox2.Items.Strings[i] = 'float' then
    Parameters.Append(CreateParameter(ListBox1.Items.S trings[i], TOleEnum(ftFloat), adParamInput, 40, EmptyParam));

    if ListBox2.Items.Strings[i] = 'real' then
    Parameters.Append(CreateParameter(ListBox1.Items.S trings[i], TOleEnum(ftFloat), adParamInput, 40, EmptyParam));

    if ListBox2.Items.Strings[i] = 'bit' then
    Parameters.Append(CreateParameter(ListBox1.Items.S trings[i], adboolean, adParamInput, 40, EmptyParam));

    if ListBox2.Items.Strings[i] = 'int' then
    Parameters.Append(CreateParameter(ListBox1.Items.S trings[i], adInteger, adParamInput, 40, EmptyParam));
    end;
    end;

    with aCommand do
    begin
    CommandType := adCmdText;
    CommandText := Edit1.Text;


    Set_ActiveConnection(aCon);
    for i := 0 to ListBox1.Count - 1 do

    begin
    if ListBox2.Items.Strings[i] = 'nvarchar' then
    Parameters[i].Value := ADOQuery2.FieldByName(ListBox1.Items.Strings[i]).AsVariant;
    if ListBox2.Items.Strings[i] = 'varchar' then
    Parameters[i].Value := ADOQuery2.FieldByName(ListBox1.Items.Strings[i]).AsVariant;

    if ListBox2.Items.Strings[i] = 'char' then
    Parameters[i].Value := ADOQuery2.FieldByName(ListBox1.Items.Strings[i]).AsString;
    if ListBox2.Items.Strings[i] = 'tinyint' then
    Parameters[i].Value := ADOQuery2.FieldByName(ListBox1.Items.Strings[i]).AsVariant;

    if ListBox2.Items.Strings[i] = 'float' then
    Parameters[i].Value := ADOQuery2.FieldByName(ListBox1.Items.Strings[i]).AsFloat;
    if ListBox2.Items.Strings[i] = 'real' then
    Parameters[i].Value := ADOQuery2.FieldByName(ListBox1.Items.Strings[i]).AsFloat;
    if ListBox2.Items.Strings[i] = 'bit' then
    Parameters[i].Value := ADOQuery2.FieldByName(ListBox1.Items.Strings[i]).AsBoolean;


    if ListBox2.Items.Strings[i] = 'datetime' then
    Parameters[i].Value := ADOQuery2.FieldByName(ListBox1.Items.Strings[i]).AsDateTime;
    if ListBox2.Items.Strings[i] = 'int' then
    Parameters[i].Value := ADOQuery2.FieldByName(ListBox1.Items.Strings[i]).AsInteger;
    end;


    Execute(vRows, EmptyParam, adExecuteNoRecords);
    ADOQuery2.Next;
    end

    Comment


    • #3
      Danke,

      Schon erledigt,

      Ganz klar das die Parameterliste nicht refreshed werden kann, wenn im SQL-String sich ein kleiner wenn auch bedeutender Fehler einschleicht (Beistrich statt Punkt).
      Und damit der SQL-String gar nicht interpretiert werden kann also auch keine Parameterlister erstellt werden kann.

      Trotzdem danke für Hilfe

      LG
      Peter

      P.S. Das SQL-Statement besteht aus 96 Zeilen und geht über 3 Datenbanken und 16 Tabellen

      Comment


      • #4
        Hallo Peter,

        ->und geht über 3 Datenbanken.
        Kann man sich mit einer Query auf 3 DB's connecten, wie geht das ? Man kann doch nur eine Connection angeben, oder

        Comment


        • #5
          Hallo,

          >Man kann doch nur eine Connection angeben, oder ?

          Das ist zwar richtig, aber beim MS SQL Server darf man den Bezug auf mehrere Datenbanken (die sich sogar auf unterschiedlichen Servern befinden dürfen) direkt in der SQL-Anweisung (siehe zum Beispiel OPENROWSET) angeben:

          <pre>
          SELECT a.Feld1, e.Feld2
          FROM Tabelle1 AS a INNER JOIN OPENROWSET('SQLOLEDB','192.168.10.1';'sa';'passwor t',tempdb.dbo.Tabelle2) AS e
          ON a.FeldKey = e.Feldkey

          </pre&gt

          Comment

          Working...
          X