![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
При Open у TQuery c RequestLive = True получаю AV…
Kolan © (2008-01-09 18:18:00)Такой код на строке Open вызывает AV по адресу 00000000.
function TPeriodDataAccessService.GetApprovedMonthPeriods: TDataSet;
var
Query: TQuery;
begin
Result := nil;
Query := TQuery.Create(nil);
{Iano?ieou Query}
Query.RequestLive := True;
try
with Query do
begin
DatabaseName := 'db';
SQL.Clear;
SQL.Add('SELECT cdmes AS [Ianyo], utvper AS [Oaenoiaue aea(noa?ue)], daten AS [C], datev AS [Ii] FROM PAKETDOC ');
Open;
end;
except
Query.Close;
Query.Free;
end;
Result := Query;
end;
Почему? Как исправить?
Loginov Dmitry (2008-01-12 16:18:00) [1]А если так переписать:
function TPeriodDataAccessService.GetApprovedMonthPeriods: TDataSet;
var
Query: TQuery;
begin
Query := TQuery.Create(nil);
try
Query.RequestLive := True;
with Query do
begin
DatabaseName := 'db';
SQL.Text := 'SELECT cdmes as t."Ianyo", utvper as t."Oaenoiaue aea(noa?ue)", daten as t."C", datev as t."Ii" FROM PAKETDOC';
Open;
end;
except
Query.Free;
raise;
end;
Result := Query;
end;
Kolan (2008-01-12 15:05:00) [2]> тип базы видать такой, секретный.
MSSQL Server 2000
> ты пройди дальше в CreateHandle
В ПН продолжу
sniknik (2008-01-11 12:16:00) [3]> Query := TQuery.Create(nil);
> :)
точно блин... ;(
ну тогда сегодня день чудес... проверил сам запрос для BDE -> MSSQL, никаких AV от смены названия... и [] и "" проходят "только в путь"
и RequestLive не влияет...
чтото там не то. тип базы видать такой, секретный.
еще вариант... основан на странных кавычках в [13]
а не умудряешся ли ты посылать запрос в юникоде? /другой кодировке отличной от win-1251.
clickmaker (2008-01-11 12:05:00) [4]
> [19] sniknik © (11.01.08 11:59)
> хм... а у тебя случаем не созданы поля в "десигне"
Query := TQuery.Create(nil);
:)
sniknik (2008-01-11 11:59:00) [5]хм... а у тебя случаем не созданы поля в "десигне" по оригинальным названиям? после меняешь имена, старые поля остались с несуществующими ссылками, но гдето есть обращение вот и AV...
а вернул старые названия и все встало на свои места, ссылки валидны...
clickmaker (2008-01-11 11:51:00) [6]
> [16] Kolan © (11.01.08 11:32)
ты пройди дальше в CreateHandle, может, что и прояснится
Kolan (2008-01-11 11:50:00) [7]Тоже ав в том же месте
Kolan (2008-01-11 11:32:00) [8]> какие-то кавычки у тебя жесткие
:)
> просто любопытно в чем дело.
Шас проверю.
Правильный_Вася (2008-01-11 11:29:00) [9]
> Kolan © (11.01.08 11:15) [13]
какие-то кавычки у тебя жесткие
sniknik (2008-01-11 11:27:00) [10]может дело в самих алиасах? значениях.
если
SQL.Add('SELECT cdmes AS "Field1", utvper AS "Field2", daten AS "Field3", datev AS "Field4" FROM PAKETDOC');
?
и вдруг пройдет, восстанавливай по одному из оригиналов.
просто любопытно в чем дело.
Kolan (2008-01-11 11:15:00) [11]
> но проверь с ними SELECT cdmes AS «Ianyo
SQL.Add('SELECT cdmes AS Месяц, utvper AS Текстовый вид(старый), daten AS C, datev AS По FROM PAKETDOC ');
тожесамое AV.
clickmaker (2008-01-11 11:12:00) [12]в D7/BDE/MSSQL, кстати, такой код выводит "Table is read only", но не AV
sniknik (2008-01-11 11:07:00) [13]не указана база... но по компонентам вроде BDE, а в BDE вроде скобки [] не приняты, а приняты кавычки "".
поздновато конечно, но проверь с ними SELECT cdmes AS "Ianyo", utvper AS .... так же само.
(естественно в рабочем варианте оставить решение из [9], либо аналог (например в гриде "титлы" с нужными именами сделать, тогда и присваивать после запроса ничего не надо))
clickmaker (2008-01-11 10:56:00) [14]
> [9] Kolan © (11.01.08 10:01)
так, кстати, лучше. Потому как можно в ресурсы всю локализацию вынести
Kolan (2008-01-11 10:01:00) [15]Победил так:
SQL.Add('SELECT cdmes, utvper, daten, datev FROM PAKETDOC ');
Open;
FieldByName('cdmes').DisplayLabel := 'Месяц';
FieldByName('utvper').DisplayLabel := 'Текстовый вид(старый)';
FieldByName('daten').DisplayLabel := 'C';
FieldByName('datev').DisplayLabel := 'По';
Kolan (2008-01-11 09:47:00) [16]> отладчиком в Open заходил?
Нет. Шас. Так
Заходим сюда:
OpenCursor;
Теперь сюда:
procedure TDBDataSet.OpenCursor(InfoQuery: Boolean);
begin
SetDBFlag(dbfOpened, True);
inherited OpenCursor(InfoQuery);
SetUpdateMode(FUpdateMode);
if Database.IsSQLBased then
SetupAutoRefresh
end;
тут АВ.
procedure TBDEDataSet.OpenCursor(InfoQuery: Boolean);
var
CursorLocale: TLocale;
begin
if FHandle = nil then
FHandle := CreateHandle;
а если без AS
То работает.
Что такое TPeriodDataAccessService?
Синглетон в котором находятся методы доступа к БД.
ЗЫ
Сорри за молчание
Правильный_Вася (2008-01-10 12:49:00) [17]
> это только мои предположения
позновато ты их озвучил, когда носом ткнули в писаную тобой фигню
Lexer (2008-01-10 12:45:00) [18]>Правильный_Вася (10.01.08 12:09)
сказано "c RequestLive = True получаю AV", так что это только мои предположения что SQLQUERYMODE установлен не LOCAL
Правильный_Вася (2008-01-10 12:09:00) [19]
> при RL = True запрос выполняет само bde а не сервер
во-1 про сервер или не сервер ни слова не сказано
во-2 кто выполняет запрос определяется настройкой драйвера в БДЕ
SQLQRYMODE specifies the mode for handling queries to SQL data
Lexer (2008-01-10 11:41:00) [20]Если при RequestLive = False ошибок нет, то скорее всего ядро bde не понимает такой синтаксис, т.к. при RL = True запрос выполняет само bde а не сервер. Посмотри будет ли ошибка при элементарном запросе.