/ / TFDQuery.Prepare nemôže určiť typy parametrov pre dotaz INSERT na MS SQL SERVER - sql-server, delphi, firedac, delphi-10.2-tokyo

TFDQuery.Prepare nemôže určiť typy parametrov pre dotaz INSERT na MS SQL SERVER - sql-server, delphi, firedac, delphi-10.2-tokyo

Otváram a TFDConnection pre MS SQL Server s parametrami:

DriverID=MSSQL
Password=test
User_Name=test
Server=VS2003-2008
Database=test
Single Connection=TRUE
Max Cursors=256
USE OLEDB=TRUE

Potom vytvorím TFDQuery (čas spustenia), nastavte pripojenie k vyššie uvedenému, vyplňte ho pomocou parametrového dotazu INSERT:

insert into TT_ACT (TT_ACT_ID,TT_PARENT_ID,TT_FROMDATE,TT_TODATE,TT_NAME,TT_NR,TT_CODE,TT_GROUP...)
values (:TT_ACT_ID,:TT_PARENT_ID,:TT_FROMDATE,:TT_TODATE,:TT_NAME,:TT_NR,:TT_CODE,:TT_GROUP,...)

Potom volám Pripravte sa na dotaz a získajte:

[FireDAC][Phys][MSSQL]-335 Parameter [TT_ACT_ID] data type is unknown.
Hint: Specify TFDParam.DataType or Assign TFDParam.Value before Prepare/Execute call

Ak urobím to isté pre databázu FireBird, nie sú žiadne problémy.
Myslím, že to má niečo spoločné s používaním OLEDB. Na stroji nie je natívny klient MS SQL.
Neexistuje žiadny FDPhysMSSQLDriverLink na datamodule, kde TFDConnection býva, ale pridanie nie je nijako rozdielne.
Tabuľka TT_ACT existuje.

Čo som zabudol, aby som túto prácu urobil?

odpovede:

1 pre odpoveď č. 1

Bol by som tu nasledovať pomoc a vyhýbať sa volaniu pripraviť pred definovaním parametrov (ich dátové typy sú úplne špecifikované). Nebolo vám nič, ale táto poznámka z pomoci:

Odporúčame nastaviť parametre pred pripraviť zavolať.

Pre bežné ovládače ODBC (stále hovoríteovládač ODBC, bez ohľadu na to, či vnútorne používa OLE DB na komunikáciu so systémami DBMS), FireDAC neurčuje parametre dátových typov pripraveného príkazu, ale pripravuje príkazový riadok na cieľovej DBMS a pokúša sa spojiť existujúce z params kolekcie. To je to, ako pripraviť (Tokyo).

ODBC API poskytuje SQLDescribeParam funkcia pre získanie podrobností parametrov prepripravený príkaz, ale FireDAC ho nepoužíva nikde (v tomto okamihu), namiesto toho ponecháva zbierku parametrov budov ručne, čo nie je nesprávne, pretože v konečnom dôsledku je to vývojár, ktorý potrebuje vedieť, akú hodnotu priradiť určitý príkazový parameter, aby bol známy tento typ hodnoty.


0 pre odpoveď č. 2

Nastavte si každý z vašich parametrov Dátový typ majetku a potom môžete zavolať pripraviť ie:

  qry.ParamByName("foo").DataType := TFieldType.ftString;
qry.ParamByName("bar").DataType := TFieldType.ftInteger;
qry.Prepare;

Na DataType ubytovanie je typu Data.DB.TFieldType, tu je zoznam všetkých možných hodnôt