Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[MSSQL 2008] Incorrect syntax in query via SQLNCLI10

Pagina: 1
Acties:

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik probeer mijn Delphi applicatie te laten samen werken met Microsoft SQL Server 2008. Ik maak verbinding met ADO via de SQL native client (SQLNCLI10).

Alles lijkt goed te gaan, op 1 query na:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
  Query: TADOQuery;
  Connection: TADOConnection;
begin
  Connection := TADOConnection.Create(nil);
  Connection.ConnectionString := 'Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=(local)';
  Connection.Open;
  Connection.BeginTrans;
  Query := TADOQuery.Create(nil);
  Query.Connection := Connection;
  Query.SQL.Text := 'DELETE FROM "Table1" WHERE "Column1" IN ' +
    '(SELECT "Column2" FROM "Table2" WHERE "Column3" < :Param1)';
  Query.Parameters.ParamByName('Param1').Value := Now;
  Query.ExecSQL;
end;


De foutmelding die ik krijg is:
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleException with message 'Incorrect syntax near the keyword 'set''.
Wat ik heb ontdekt:
• Zonder een transactie (BeginTrans) gaat het goed.
• Zonder de parameter gaat het ook goed.
• De query werkt wel gewoon via de SQL native client van Microsoft SQL Server 2005.

Iemand enig idee wat hier aan de hand is?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik heb om het probleem heen kunnen werken door de parameters in de vorm van vraagtekens op te geven. Dit scheelt namelijk ook extra query's naar de database (hier meer info daar over). Deze extra query's zorgen volgens mij voor problemen als je SQLNCLI10.1 gebruikt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
  Query: TADOQuery;
  Param: TParameter;
begin
  Query := TADOQuery.Create(nil);
  Query.Connection := ADOConnection1;
  Query.ParamCheck := False;

  Query.SQL.Text := 'DELETE FROM "Table1" WHERE "Column1" IN (SELECT "Column2" FROM "' +
    'Table2" WHERE "Column3" < ?)';
  Query.Parameters.CreateParameter('Param1', ftInteger, pdInput, 0, 0);

  Query.Connection.Open;
  try
    Query.Connection.BeginTrans;
    Query.ExecSQL;
  finally
    Query.Connection.Close;
  end;
end;

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Hij geeft aan dat er iets mis gaat bij het keyword "SET" maar die zie ik niet terug in je query.
Draait er toevallig een trigger oid op die tabel die mis kan gaan?

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
4of9 schreef op woensdag 24 september 2008 @ 14:45:
Hij geeft aan dat er iets mis gaat bij het keyword "SET" maar die zie ik niet terug in je query.
Draait er toevallig een trigger oid op die tabel die mis kan gaan?
Klopt, en dat vond ik dus ook vreemd. Ik heb via de MSSQL Profiler gekeken welke query's er worden uitgevoerd. Als ik gebruik maak van named parameters (:parameter) dan voert ADO extra query's uit voor meta data o.i.d.. En in deze query's zit dus een SET statement. Ik snap nog steeds niet waarom dit fout gaat met de SQLNCLI10, maar ik heb er sowieso om heen gewerkt door parameters op een andere manier op te geven (zie mijn vorige post hier). Dit scheelt ook extra query's en dus sneller.

Bovenstaande wordt uitgelegd in de link die ik eerder ook al plaatste: http://forums.microsoft.c...px?PostID=570896&SiteID=1

"The shell stopped unexpectedly and Explorer.exe was restarted."