[Access i MSSQL] dziwny błąd: Invalid data type

0

Cześć, za pomocą komponentów ado łączę się z bazą Accessową i MSSQL. Problem jest taki, że mam przenieść dane z bazy Access do bazy MSSQL.

Oto kawałek kodu:

var
  SourceQuery, DestQuery: TADOQuery;
begin

  try
  //import
  //pobieranie danych z accessa
  //selectSQL działa tak, że pobiera dane do przekazanego ADO(robi open)
    myQuery:='SELECT * FROM tb_userInfo WHERE dtExpireDate>'+DateToStr(now);
    selectSQL(myQuery, Source, SourceQuery);

  //pobranie danych z MSSQL
    myQuery:='SELECT * FROM users';
    SelectSQL(myQuery, Dest, DestQuery);

    DestQuery.First;
    SourceQuery.First;

    //dodawanie nowych pracowników
    while not SourceQuery.Eof do
     begin
       if IsValueInDataset(SourceQuery.FieldByName('nUserID').AsInteger, 'ID', DestQuery) then
       begin  //modyfikacja
         DestQuery.Locate('ID', SourceQuery.FieldByName('nUserID').AsInteger, []);
         DestQuery.Edit;
         DestQuery.FieldByName('name').AsString:=SourceQuery.FieldByName('strUserName').AsString;
         DestQuery.FieldByName('DID').AsInteger:=SourceQuery.FieldByName('nDepartment').AsInteger; //błąd
         DestQuery.Post;
       end else
       begin  //dodanie
         DestQuery.Append;
         DestQuery.FieldByName('ID').AsInteger:=SourceQuery.FieldByName('nUserID').AsInteger;
         DestQuery.FieldByName('name').AsString:=SourceQuery.FieldByName('strUserName').AsString;
         DestQuery.FieldByName('DID').AsInteger:=SourceQuery.FieldByName('nDepartment').AsInteger;
         DestQuery.Post;
       end;

       SourceQuery.Next;
     end;

Problem polega na tym, że na jednym kompie działa ok, na drugim wywala mi Invalid Variant Type.
Co jest nie tak z linijką:

DestQuery.FieldByName('DID').AsInteger:=SourceQuery.FieldByName('nDepartment').AsInteger;

??

Pole DID w MSSQL jest typu BigInt, natomiast uDepartment w Accessie Numberic(tak mi pokazuje MDB Viewer plus)

Próbowałem też rzutowania na wszelkie możliwe sposoby, a także zamiast AsInteger pisałem AsVariant.

0

zamień

DestQuery.FieldByName('DID').AsInteger := SourceQuery.FieldByName('nDepartment').AsInteger;

na

i: Integer;
i := SourceQuery.FieldByName('nDepartment').AsInteger;
DestQuery.FieldByName('DID').AsInteger := i;

będziesz wiedział z czym jest problem (ale na 99% z nDepartment).

potem zrób tak

v: Variant;
v := SourceQuery.FieldByName('nDepartment').AsVariant;

i zobacz co debuger pokazuje Ci w v - bardzo możliwe, że zwraca nil

0
Juhas napisał(a)

OK, jeśli nawet zwraca nil, to co zrobić, żeby robiło dobrze? Bo w bazie accessowej w tym polu nie ma żadnych nulli.

to może byś łaskawie sprawdził co zwraca a nie będziemy w ciemno gadać

1 użytkowników online, w tym zalogowanych: 0, gości: 1