Istnieje kilka pytań na temat StackOverflow, które wydają się mieć odpowiedzi sprzeczne ze sobą na temat ADO/OleDB, delphi TADOQuery/TADOCommand i przedmiotu parametrów.Czy komponenty ADO, szczególnie TADOCommand, działają w bardziej niezawodny sposób z nienazwanymi lub nazwanymi parametrami, w niektórych przypadkach?
Parametry można wprowadzić na dwa sposoby w właściwości CommandText lub SQL składnika ADO. Nazwane parametry, które pracują przez większość czasu dla mnie, są wprowadzane z dwukropkiem:
select a, b, c from bar where bat = :baz
To działa, 99% czasu dla mnie, po prostu w porządku. Co jakiś czas, a potem okaże się, że ADO lub owijarki Delphi wokół niego, nie będzie akceptować „Baz” i wymaga, że piszę to w zamian:
select f, g, h from bar where bat = ?
Wynika to w nienazwanej parametru, zamiast nazwanego parametru. Gdy zapytanie ADO lub polecenie ADO zawiera tylko jeden parametr, nie jest to wielka sprawa. Ale to nie jest, gdy ADO działa na mnie. Wczoraj działał w jedną stronę, a dziś inny sposób z podwójnym polecenia w jednym obiekcie TADOCommand, jak ten, z dwóch komend w jednej CommandText wyrażenie:
delete from bar where id = :id1
delete from bat where id = :id2
musiałem go zmienić na to:
delete from bar where id = ?
delete from bat where id = ?
Pracował cały dzień wczoraj. Dzisiaj musiałem zmienić to z powrotem w pierwszą wersję, aby działało. Symptomem było to, że parametry ADO zniknęły i nie wróciły, a kiedy spróbuję wykonać polecenie, otrzymuję błąd, indeks poza zakresem, kiedy próbuję uzyskać dostęp do Parameters[0]
. Nic nie daje mi ostrzeżenia, że parametry znikają. Wygląda na to, że kilka połączeń z zestawem danych ADO, w wyznaczonym czasie, uruchamia komponent TADOCommand
, a zwłaszcza "po prostu mnie przerwie". Jest to szczególnie denerwujące, gdy próbujesz napisać zapytanie lub polecenie, i wiesz, że to działa, ale komponent ADO postanowił nie akceptować "?" lub ": x" właśnie teraz. Możesz obejść jego całkowitą niezdolność do funkcjonowania, przełączając się z jednego do drugiego. Ale to mnie frustruje i prawdopodobnie całkowicie blokuje innych ludzi. Wiem, że niektórzy ludzie zawsze dynamicznie budują swój kod SQL w kodzie i unikają używania Parameters
, a może dlatego właśnie jest to.
Możliwe odpowiedzi na moje pytanie, że jestem przewidywanie to:
ADO nie obsługuje wielu poleceń, lub przynajmniej owijarki Delphi nie. A może
TADOCommand
po prostu nie działa tutaj niezawodnie.Parametry są obszarem buggy we wszystkich ADO lub wszystkich opakowaniach ADO Delphi?
Robisz to źle.
używam Delphi XE2, ale widziałem podobnie podejrzanie zachowanie w roku 2007, 2009, 2010 i XE. Korzystam z dostawcy Microsoft OLEDB Provider dla serwera SQL jako mój dostawca OLEDB.
Czy różnica polega na rozdzieleniu dwóch poleceń za pomocą (dla SQL Server) średnika? –
W projektach, które nie wymagają kontroli nad danymi, przełączyłem się bezpośrednio na używanie ADODB i ADOInt. Tak jak tutaj: http://xxm.svn.sourceforge.net/viewvc/xxm/trunk/Delphi/demo2/03%20Data/xxmData.pas?view=markup Nie sprawdziłem, co to robi dla wydajności, ale naprawdę powinno sprawdź jeden z tych dni (i opublikuj moje wyniki tutaj jako odpowiedź) ... –
SilentD: Spróbuję średnika. Przypominam sobie, że komponenty Delphi ado również nie obsługują separatorów. –