Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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?


Наверх

Титульная страница Поиск, карта сайта Написать письмо