Проблем с ADODataSet.Locate

20 отговора 599 прегледа
#1

Проблем с ADODataSet.Locate

Здравейте, имам следния проблем с метод Locate ADODataSet:

При извикване на следната последователност се получава
гърмеж на Locate-a:

FieldName := '04';
Value := 'Client's project';
if not Table.Locate(FieldName,Value,[loCaseInsensitive]) then
Exit;

Средата е Delphi 6 Pro а базата данни е Oracle 9.2.
Подозрението ми е, че е заради апострофа ( ' ) в стойността на Value, понеже при стойност без апостроф нямаше такива проблеми.
Проблемът не можах да го реша и с форматиране на стринга понеже тогава се получаваше промяна на стойността която се търси, а и пак гърмеше :(
Моля, ако някой е имал подобен проблем нека каже как го е преборил.

Поздрави на всички.

Отговор
в отговор на Daniel #2

Re: Проблем с ADODataSet.Locate

Виж тук:
[линк]

Отговор
в отговор на Daniel #3

Re: Проблем с ADODataSet.Locate

незнам би трябвало да гърми още на
FieldName := '04';

освен ако FieldName не е стринг
var
FieldName, Value :String ;
Table1: TTable;

begin
Table1 := TTable.Create(nil);
Value := 'fdfdfd';
try
(*провери дали табле е свързан коректно с bazata za, koqto se zakachash
mojesh da se zakachish i v dizain mode*)
//Table1.TableName := '';

if not (Table1.Locate('imetona_pole_ot_bazata_ne_moje_da_e_string',Value,[])) then begin
...
end;//if

finally
Table1.Free;
енд;//try

end;//begin

Отговор
в отговор на hi #4

Re: Проблем с ADODataSet.Locate

FieldName е string, свързаността си е коректна, проблема е ако в стойността по която се търси има апостроф, т.е. нещо от типа "ALA'ALA". Тогава Locate нещо гърми.
Надявам се поне някой да е успял да намери решение на такъв проблем, ако му се е случвало.
Засега ще видя това, което колегата по-горе е пост-нал дали няма да ми свърши работа.

Благодаря на всички отзовали се и Успех.

Отговор
в отговор на Nazarov #5

Re: Проблем с ADODataSet.Locate

Не знам защо, но при опит за свързване към SQL Server база ми дава "Invalid variant type conversion", а с обикновен ADODataSet този проблем го няма.
Някакви идеи от какво би могло да бъде ?

Отговор
в отговор на Daniel #6

Re: Проблем с ADODataSet.Locate

AKO V POLE OT BAZA DANNI IMA APOSTOF. tAKA LI?
eMI TOVA POLE STRING LI. iLI mEMO
KO NE E NAPRAVIGO DA E .
i MISLIA CHE NIAMA DA GARMI.
I KATO GARMI KADE KARMI PRI KOMPILIRANETO - GRESHKA NA OKMPILATORA ILI PRI STARTIRANETO .
i KAKVO PISHE . zA GRESHKATA

Отговор
в отговор на Daniel #7

Re: Проблем с ADODataSet.Locate

AHA MISLI CHE TAKA TRIABVA DA STANE


tABLE1.lOCATE(FIELDVALUE('').Value, 'DRAN-DRAN',[]);
ILI
TABLE1.lOCATE(FiledByName('dfdf').AsValue,'gfgf',[]);

ili
Table1.Locate(Fields.Fields[1].Value,'gfgf'[]);

ako ot toza primer ne stane. Ne sam gledal za spazvane vij tam doopravi go..
No ti shtom iskash da vzemesh stoinosta probva s ASVALUE ili samo s Value.
Vij tam niakoi primer.
I ako mojesh pomogni za Fiskalnite printeri

Отговор
в отговор на Daniel #8

Re: Проблем с ADODataSet.Locate

> Някакви идеи от какво би могло да бъде ?

Вероятно ползваш Delphi 7.00, където има такъв бъг. Ъпдейт до 7.02 ще отстрани този проблем.

Отговор
в отговор на Nazarov #9

Re: Проблем с ADODataSet.Locate

Ползвам Delphi 6.
Изключението се получава, когато задам Active na BetterAdoDataSet на True.
Преди това съм вързал всичко коректно - АdoConnection, udl, CommandText DataSource, DBGrid:

DataSource.DataSet = BetterAdoDataSet
AdoConnection.Connection -> udl file
BetterAdoDataSet.Connection = AdoConnection
BetterAdoDataSet.CommandText = "Select id from table1"
DBGrid.DataSource = DataSource

Когато сетна Active на BetterAdoDataSet на True, се огърмява с посоченото изключение.
При ADODataset, това не се случваше и не успях да разбера кое е грешката.
Може би някой event се задейства при промяна стойността на свойството Active ?
Моля, ако има нещо нередно или нещо съм направил не както трябва при задаването на свързването на компонентите, кажи.

Поздрави

Отговор
в отговор на Hl #10

Re: Проблем с ADODataSet.Locate

Значи да уточня:
Ползвам DataSet.Locate(FieldName,FieldValue,[loCaseInsensitive]), за да проверя дали запис с дадена стойност, в случая FieldValue, го има в базата.
Полето в базата е стрингово. Проблема е ако има апостроф в FieldValue, тогава при работа на приложението се вади изключение : Parameters are not acceptible or out of range.
При стойност без апостроф, всичко си работи нормално.
Установих, че апострофа е проблема, но досега не намерих начин как да го оправя.
Може би единия начин е да обхождам записите в таблицата и да симулирам нещо подобно на Locate, което ще е бавно разбира се.
Лошото е че и при SQL заявка ще се получи същото, понеже няма кой знае какъв контрол върху това което се въвежда (това е изрично изискване).

Отговор
в отговор на Daniel #11

Re: Проблем с ADODataSet.Locate

Инсталирал ли си всички ъпдейти за Delphi 6 ?

Отговор
в отговор на Nazarov #12

Re: Проблем с ADODataSet.Locate

Уеи не, според теб това ли ще да е проблема ?

Отговор
в отговор на Daniel #13

Re: Проблем с ADODataSet.Locate

> според теб това ли ще да е проблема ?

99.99%

Отговор
в отговор на Daniel #14

Re: Проблем с ADODataSet.Locate

Parameters are not acceptible or out of range.

Нещо не правиш както трябва и проблема не е това да знаеш?
дай целия код! така няма да стане. Искам да дебугнеш...

Отговор
в отговор на xи #15

Re: Проблем с ADODataSet.Locate

Хи, точно това си е проблема. Дебъгвал съм го и си пролича че е от апострофа. Впрочем в началото на поста ми можеш да видиш за какво става въпрос. Същия поблем съм го срещал и в чужди форуми, само че там проблема беше с писането в базата, което е по-различно от моя случай :(

Отговор
в отговор на Daniel #16

Re: Проблем с ADODataSet.Locate

Виж сега това дали ще ти помогне.
Ти искаш да намериш някави данни.

Пробвай с Query.

function hi(sss: String;)Boolean;
var
S:String;
begin
Result := False;
S := Edit1.text;

AdoQuery1.SQL.ADD(' select * from c:\fff.mdbf ');
AdoQuery1.SQL.ADD('where Name_filed= +"'s'" ');
AdoQuery1.Open;


AdoQuery1.First;
if AdoQuery1.FieldByName('Name_filed').AsString <> '' then
Result := True;

Отговор
в отговор на xи #17

Re: Проблем с ADODataSet.Locate

pich vij posta mi za Fiskalnia printer ako mojesh da pomognesh, ako poznavash niakoi ...:(

Отговор
в отговор на xи #18

Re: Проблем с ADODataSet.Locate

Това няма да помогне. защото може да се получи следната заявка:

Select * from Table
Where Name = "dgdfdf"fdfdfdfdf"

Това примерно на Oracle.
В тоя случай това не е коректна заявка към базата и ще гръмне при опит за изпълнение.
Разглеждал съм го варианта, но се оказа че просто няма как да стане и май ще трябва да се забранят някои специални символи

Отговор
в отговор на Daniel #19

Re: Проблем с ADODataSet.Locate

Форматиране на SQL заявка става безпроблемно така:

SQL:=StringReplace (SQL,#39,#39#39,[rfReplaceAll])

чети и дишай по-леко
Отговор
в отговор на Pechenia #20

Re: Проблем с ADODataSet.Locate

Pechenia, това няма ли да се намаже ако базата е MSSQL Server, защото там форматиращия символ също е " ' " и може да се получи намазване.
Иначе това за заместването с двойни кавички или апострофи го видях, но не ми върши работа в случая.

Отговор