![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FieldName в DBexpress и ADO [D7, MSSQL]
GrBob © (2006-08-16 12:45:00)Добрый день. Предположим, у нас есть таблица x в базе Northwind, у которой есть поле (под номером 0) с длинным имененем типа
"y123456789y123456789z123456789z123456789r123456789m123456789". Имеем программку, почти полный текст которой представлен ниже:
..........
SQLDataSet1: TSQLDataSet;
SQLConnection1: TSQLConnection;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
..........
procedure TForm1.Button1Click(Sender: TObject);
begin
with SQLDataSet1 do
begin
CommandText := 'select * from Northwind..x';
Open;
ShowMessage(Fields[0].FieldName);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
with ADOQuery1 do
begin
SQL.Text := 'select * from Northwind..x';
Open;
ShowMessage(Fields[0].FieldName);
end;
end;
При этом почему то в первом случае получаем только
y123456789y123456789z123456789z,а во втором полностью y123456789y123456789z123456789z123456789r123456789m123456789. Почему? Может где-то настраивается ограничение или есть какая другая особенность? Никак не могу понять.
Desdechado (2006-08-17 18:13:00) [1]> ограничение оффициально заявлено
да, читать документацию
GrBob (2006-08-17 14:30:00) [2]
> Ну, ни в FB, ни в Оракле - не может. В DBF, Paradox - тоже.
> В остальных - не знаю.
> Да и смысл в длинных? Ведь безразмерными их сделать нельзя,
> а любое ограничение приведет к фразе "Борланд решил, что
> имен длиннее N символов быть не может".
Т.е. такое ограничение оффициально заявлено разработчиками?
Desdechado (2006-08-17 11:26:00) [3]> Борланд решил, что имен длиннее 31 символ быть не может.
Ну, ни в FB, ни в Оракле - не может. В DBF, Paradox - тоже. В остальных - не знаю.
Да и смысл в длинных? Ведь безразмерными их сделать нельзя, а любое ограничение приведет к фразе "Борланд решил, что имен длиннее N символов быть не может".
> зачем они выпустили DBXpress, по сути ухудшенный вариант БДЕ
Имхо, гораздо удобнее. Причем с открытой спецификацией на драйвера. И работает стабильнее.
А что, БДЕ имена полей более 30 знаков поддерживает?
Anatoly Podgoretsky (2006-08-16 19:12:00) [4]Проблема в том, что Борланд решил, что имен длиннее 31 символ быть не может.
Я до сих пор не могу понять, зачем они выпустили DBXpress, по сути ухудшенный вариант БДЕ
GrBob (2006-08-16 16:24:00) [5]Ну как это нечего.
Ты еще пожелай, чтобы я таблички не в Northwind'e создавал, а в своей базе, так еще лучше будет :)
Пойду искать спецификацию на просторах интернета, всем спасибо за помощь (в основном только sniknik'a касается, но все же...) ;)
sniknik (2006-08-16 16:20:00) [6]> уже обошел другим способом (укоротив названия :))
сделай их еще более осмысленными... и все, больше желать нечего... (по теме...).
GrBob (2006-08-16 16:10:00) [7]Ну сейчас то это уже больше исследовательская работа. Просто на dbexpress навешан уже большой проект, чтобы его переписывать, а этот косяк я уже обошел другим способом (укоротив названия :)). Теперь мне просто интересно, описано ли это ограничение в спецификации или нет.
sniknik (2006-08-16 16:03:00) [8]> Может у кого есть спецификация, в которой это описано?
зачем? и так все очевидно...
> Тогда можно будет и не париться дальше :)
а и не парься, и до того не надо было, используй ADO и всех делов то. (для mssql "родная" технология)
Desdechado (2006-08-16 16:02:00) [9]твой dbExpress-драйвер для твоей СУБД
GrBob (2006-08-16 15:59:00) [10]Именно сюда я и полез после изменения. Структура FldDsc изменилась, в поле szName стало больше символов, но после getColumnName установились только первые 32 символа, все остальные остались #0. Добавив сюда FSQLCursor.getColumnLength получил 32. Так что проблема в курсоре, интерфейс которого есть, а вот реализация, как я понял в какой-то dll, разобрать которую я не могу. Может у кого есть спецификация, в которой это описано? Тогда можно будет и не париться дальше :)
sniknik (2006-08-16 15:12:00) [11]уверен что используется именно исправленный модуль? в проект его включил?
хотя... может в используемой dll уже есть такое же ограничение, DBXpress же использует свои, под себя (и с теми же константами) писанные...
ну можеш еще проверить, с модуле SqlExpr на
procedure TCustomSQLDataSet.LoadFieldDef(FieldID: Word; var FldDesc: FLDDesc);
var
ReadOnly: LongBool;
begin
FldDesc.iFldNum := FieldID;
FSQLCursor.getColumnName(FieldId, FldDesc. szName);
FSQLCursor.getColumnType(FieldId, FldDesc.iFldType, FldDesc.iSubtype);
...
точку останова поставь, и посмотри размер массива... он меняется если ты размерность типа поменяеш?
но в общем это неважно, причина в этом (вопрос [0]), а вот можно ли это исправить другой вопрос.
GrBob (2006-08-16 14:35:00) [12]
> sniknik
Нет, ничего не изменилось.
Desdechado (2006-08-16 13:09:00) [13]Очень осмысленное имя...
Остальные в таком же духе? Сочувствую...
sniknik (2006-08-16 13:08:00) [14]> Ну так и пользуйся, нафиг тебе ADOQuery???
наоборот, нафиг DBXpress, проблема то в нем.
(хотя и с ADOQuery согласен, ADODataSet - более правильный выбор)
Ega23 (2006-08-16 13:05:00) [15]Ну так и пользуйся, нафиг тебе ADOQuery???
sniknik (2006-08-16 13:05:00) [16]проверь...
перепиши и подключи модуль DBXpress.pas к себе в проект (чтоб генофонд не править)
и измени тип в нем,
DBINAME = packed array [0..31] of Char; { holds a name }
вернее размерность. чтонибудь изменилось?
GrBob (2006-08-16 12:57:00) [17]
procedure TForm1.Button2Click(Sender: TObject);
begin
with ADODataSet1 do
begin
CommandText := 'select * from Northwind..x';
Open;
ShowMessage(Fields[0].FieldName);
end;
end;
говорит полный y123456789y123456789z123456789z123456789r123456789m123456789
Ega23 (2006-08-16 12:49:00) [18]А что по этому поводу говорит TADODataSet?