2012-06-14 9 views
24

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:

  1. ADO nie obsługuje wielu poleceń, lub przynajmniej owijarki Delphi nie. A może TADOCommand po prostu nie działa tutaj niezawodnie.

  2. Parametry są obszarem buggy we wszystkich ADO lub wszystkich opakowaniach ADO Delphi?

  3. 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.

+0

Czy różnica polega na rozdzieleniu dwóch poleceń za pomocą (dla SQL Server) średnika? –

+0

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ź) ... –

+0

SilentD: Spróbuję średnika. Przypominam sobie, że komponenty Delphi ado również nie obsługują separatorów. –

Odpowiedz

0

Tak, istnieją pewne przypadki, w których parametry z ? nie powiodą się. Zauważyłem, że czasami potrzebuję użyć parametrów :named. Parametry nazwane mają przewagę w pracy z wartościami parametrów bazy danych, ponieważ ustawienie właściwości Nazwa umożliwia również łatwiejsze debugowanie kwerendy ADO lub zestawu danych lub tabeli.

Nie rozumiem dlaczego. Jeśli masz ten problem, najpierw sprawdź, czy korzystasz z właściwego dostawcy OLEDB i sprawdź, która wersja. Sprawdź również potencjalne błędy parsowania spowodowane przez wygenerowany przez ciebie zły SQL.

Podejrzewam, że wewnętrzne zachowanie wewnątrz dostawcy OLEDB w kodzie, dla którego nie mam kodu źródłowego, jest obwiniane za to dziwactwo. Owijarki klasy ADO Delphi są tłumaczami z architektury warstwy komponentów Delphi do podstawowych funkcji API zapytań/tabel/dataset ADO, z których wszystkie znajdują się pod okapami wokół zestawu obiektów COM, które dotyczą ADO RecordSets.

0

Niestety, nie używałem Delphi przez jakiś czas, więc nie mam środków, aby potwierdzić tę odpowiedź z perspektywy Delphi.

Po raz pierwszy widziałem nazwane parametry z prefiksem z dwukropkiem (:).Zwykle w ADODB nazwane parametry mają prefiks o at (@) i tak, nienazwane parametry są oznaczone znakiem zapytania (?).

Istotną zaletą wymienionych parametrów jest ich zdolność do ponownego wykorzystania, tj

INSERT INTO TABLE T VALUES (@id, @id, 'Hello World'); 

Na poziomie ADODB. Gdy użyjesz parametrów nazwanych lub nienazwanych, możesz użyć CommandText.Parameters.Refresh jako szybkiego sposobu tworzenia parametrów.

+1

"Zwykle w ADODB nazwane parametry mają przedrostek at at (@)" - ADODB nie ma nazwanych parametrów z wyjątkiem parametrów procedur składowanych, chyba że masz specjalnego dostawcę, który dodaje do nich obsługę. Powszechnie używany dostawca SQLOLEDB ich nie ma. W ADO.NET parametry nazwane są możliwe, z wymienianym przedrostkiem @, ale ADO.NET nie może być łatwo użyty z Delphi. – hvd

1

Nazwane parametry z :? Zawsze używałem go z @, nawet w Visual Studio (ADO.NET). W parametrach i zmiennej T-SQL są poprzedzone @.

Nie pamiętam, z tym problemy ... Czy jesteś pewien, że nie wybiera Native Client (zainstalowane z klientem serwera SQL zainstalować) zamiast OLEDB Provider dla SQL Server (który pochodzi z systemu Windows)?

Powiązane problemy