Проблем с ADODataSet.Locate
20 отговора
599 прегледа
Проблем с 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, понеже при стойност без апостроф нямаше такива проблеми.
Проблемът не можах да го реша и с форматиране на стринга понеже тогава се получаваше промяна на стойността която се търси, а и пак гърмеше :(
Моля, ако някой е имал подобен проблем нека каже как го е преборил.
Поздрави на всички.
При извикване на следната последователност се получава
гърмеж на Locate-a:
FieldName := '04';
Value := 'Client's project';
if not Table.Locate(FieldName,Value,[loCaseInsensitive]) then
Exit;
Средата е Delphi 6 Pro а базата данни е Oracle 9.2.
Подозрението ми е, че е заради апострофа ( ' ) в стойността на Value, понеже при стойност без апостроф нямаше такива проблеми.
Проблемът не можах да го реша и с форматиране на стринга понеже тогава се получаваше промяна на стойността която се търси, а и пак гърмеше :(
Моля, ако някой е имал подобен проблем нека каже как го е преборил.
Поздрави на всички.
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
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
Re: Проблем с ADODataSet.Locate
FieldName е string, свързаността си е коректна, проблема е ако в стойността по която се търси има апостроф, т.е. нещо от типа "ALA'ALA". Тогава Locate нещо гърми.
Надявам се поне някой да е успял да намери решение на такъв проблем, ако му се е случвало.
Засега ще видя това, което колегата по-горе е пост-нал дали няма да ми свърши работа.
Благодаря на всички отзовали се и Успех.
Надявам се поне някой да е успял да намери решение на такъв проблем, ако му се е случвало.
Засега ще видя това, което колегата по-горе е пост-нал дали няма да ми свърши работа.
Благодаря на всички отзовали се и Успех.
Re: Проблем с ADODataSet.Locate
Не знам защо, но при опит за свързване към SQL Server база ми дава "Invalid variant type conversion", а с обикновен ADODataSet този проблем го няма.
Някакви идеи от какво би могло да бъде ?
Някакви идеи от какво би могло да бъде ?
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
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
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
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
Re: Проблем с ADODataSet.Locate
> Някакви идеи от какво би могло да бъде ?
Вероятно ползваш Delphi 7.00, където има такъв бъг. Ъпдейт до 7.02 ще отстрани този проблем.
Вероятно ползваш Delphi 7.00, където има такъв бъг. Ъпдейт до 7.02 ще отстрани този проблем.
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 ?
Моля, ако има нещо нередно или нещо съм направил не както трябва при задаването на свързването на компонентите, кажи.
Поздрави
Изключението се получава, когато задам 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 ?
Моля, ако има нещо нередно или нещо съм направил не както трябва при задаването на свързването на компонентите, кажи.
Поздрави
Re: Проблем с ADODataSet.Locate
Значи да уточня:
Ползвам DataSet.Locate(FieldName,FieldValue,[loCaseInsensitive]), за да проверя дали запис с дадена стойност, в случая FieldValue, го има в базата.
Полето в базата е стрингово. Проблема е ако има апостроф в FieldValue, тогава при работа на приложението се вади изключение : Parameters are not acceptible or out of range.
При стойност без апостроф, всичко си работи нормално.
Установих, че апострофа е проблема, но досега не намерих начин как да го оправя.
Може би единия начин е да обхождам записите в таблицата и да симулирам нещо подобно на Locate, което ще е бавно разбира се.
Лошото е че и при SQL заявка ще се получи същото, понеже няма кой знае какъв контрол върху това което се въвежда (това е изрично изискване).
Ползвам DataSet.Locate(FieldName,FieldValue,[loCaseInsensitive]), за да проверя дали запис с дадена стойност, в случая FieldValue, го има в базата.
Полето в базата е стрингово. Проблема е ако има апостроф в FieldValue, тогава при работа на приложението се вади изключение : Parameters are not acceptible or out of range.
При стойност без апостроф, всичко си работи нормално.
Установих, че апострофа е проблема, но досега не намерих начин как да го оправя.
Може би единия начин е да обхождам записите в таблицата и да симулирам нещо подобно на Locate, което ще е бавно разбира се.
Лошото е че и при SQL заявка ще се получи същото, понеже няма кой знае какъв контрол върху това което се въвежда (това е изрично изискване).
Re: Проблем с ADODataSet.Locate
Parameters are not acceptible or out of range.
Нещо не правиш както трябва и проблема не е това да знаеш?
дай целия код! така няма да стане. Искам да дебугнеш...
Нещо не правиш както трябва и проблема не е това да знаеш?
дай целия код! така няма да стане. Искам да дебугнеш...
Re: Проблем с ADODataSet.Locate
Хи, точно това си е проблема. Дебъгвал съм го и си пролича че е от апострофа. Впрочем в началото на поста ми можеш да видиш за какво става въпрос. Същия поблем съм го срещал и в чужди форуми, само че там проблема беше с писането в базата, което е по-различно от моя случай :(
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;
Ти искаш да намериш някави данни.
Пробвай с 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;
Re: Проблем с ADODataSet.Locate
pich vij posta mi za Fiskalnia printer ako mojesh da pomognesh, ako poznavash niakoi ...:(
Re: Проблем с ADODataSet.Locate
Това няма да помогне. защото може да се получи следната заявка:
Select * from Table
Where Name = "dgdfdf"fdfdfdfdf"
Това примерно на Oracle.
В тоя случай това не е коректна заявка към базата и ще гръмне при опит за изпълнение.
Разглеждал съм го варианта, но се оказа че просто няма как да стане и май ще трябва да се забранят някои специални символи
Select * from Table
Where Name = "dgdfdf"fdfdfdfdf"
Това примерно на Oracle.
В тоя случай това не е коректна заявка към базата и ще гръмне при опит за изпълнение.
Разглеждал съм го варианта, но се оказа че просто няма как да стане и май ще трябва да се забранят някои специални символи
Re: Проблем с ADODataSet.Locate
Форматиране на SQL заявка става безпроблемно така:
SQL:=StringReplace (SQL,#39,#39#39,[rfReplaceAll])
чети и дишай по-леко
SQL:=StringReplace (SQL,#39,#39#39,[rfReplaceAll])
чети и дишай по-леко
Re: Проблем с ADODataSet.Locate
Pechenia, това няма ли да се намаже ако базата е MSSQL Server, защото там форматиращия символ също е " ' " и може да се получи намазване.
Иначе това за заместването с двойни кавички или апострофи го видях, но не ми върши работа в случая.
Иначе това за заместването с двойни кавички или апострофи го видях, но не ми върши работа в случая.