Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.185.103] |
|
Данный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
Я не понял. Создаю объект TTable. Выставляю параметры в Инспекторе объектов:
TableType:=ttFoxPro FieldDefs[0]: Name:=SID DataType:=ftWord FieldDefs[1]: Name:=FNAME DataType:=ftString Size:=20 Запускаю. В рантайме делаю CreateTable. В *.dbf создаются поля N(6) и C(20). В инспекторе делаю <Fields->Add All Fields>. Что я вижу? FieldDefs[0]: Name:=SID DataType:=ftFloat <<--!! FieldDefs[1]: Name:=FNAME DataType:=ftString Size:=20 То же самое происходит если DataType:=ftSmallInt, ftInteger, любое целочисленное. Хоть я проставляю тип полей в инспекторе, хоть в рантайме через AddFieldDef. Все равно формируется поле типа "N", которое делфи считает вещественным. А потом в рантайме появляется ексепт: что-то типа "Float отсутствует, actual Integer". Далее. Если создаю *.dbf в Fox'e, поля при загрузке в инспекторе числовые поля также коверкаются. Кроме Integer. Но и с Integer беда. Если создаю новую таблицу (CreateTable'ом), то вместо поля I(4) /как было после Fox'a/, появляется N(11). Помню долбался с этим в 5 делфи. И тогда либо после создания нового файла правил байты в заголовке, либо вообще создавал файл "вручную". Делфи-то их понимал(а,о ?) как надо. Но почему бы не создать сразу как просят? Причем проблема почему-то только с числовыми полями, остальные создаются нормально. О, еще вспомнил (насчет править "ручками"). Были проблемы с удалеными *.cdx. Если в заголовке прописано, что должен быть индекс, а его нет, то BDE открывать файл отказывался (т. е. и реиндекс сделать не мог). Самое простое, что удалось придумать - обнулять 28 байт. Есть способ лучше? ВОПРОС: Как заставить BDE делать ТРЕБУЕМУЮ структуру таблиц (числовые поля)? И , может кто знает, как отсоединить отсутсутствующий индексный файл программно (не копаясь в заголовке *.dbf)? |
Сообщ.
#2
,
|
|
|
Используй кверю "Create Table" - работает корректнее и типы делает именно такие как ты укажешь, так как выполнять будет драйвер напрямую, а не через трансляцию через VCL.
|
Сообщ.
#3
,
|
|
|
Цитата Vit, 18.03.03, 17:13:43 Используй кверю "Create Table" - работает корректнее и типы делает именно такие как ты укажешь, так как выполнять будет драйвер напрямую, а не через трансляцию через VCL. Может я не так понял, но попробывал так: Var DBPath:ShortString; ........ Procedure CreatTWithSQL(MyTable:TTable); Var MyQry:TQuery; Begin ... MyTable.DatabaseName:=DBPath; If Not(MyTable.Exists) Then Begin MyQry:=TQuery.Create(nil); MyQry.DatabaseName:=DBPath; MyQry.SQL.Clear; MyQry.SQL.Add('CREATE TABLE '+MyTable.TableName+'.dbf'); // MyQry.SQL.Add('(SID INTEGER NOT NULL,'); // MyQry.SQL.Add('FNAME CHAR(20) CHARACTER SET WIN1251 COLLATE PXW_CYRL);'); MyQry.SQL.Add('(SID INTEGER,'); MyQry.SQL.Add('FNAME CHAR(20));'); MyQry.ExecSQL; MyQry.Free; End; ... End; Если пишу "MyQry.SQL.Add('CREATE TABLE '+MyTable.TableName+'.dbf')", то ВСЕГДА создается файл с именем "dbf.DD" независимо от TableName (у MyTable стоит TableType:=ttFoxPro и расширение в TableName не укзано), а если пишу "MyQry.SQL.Add('CREATE TABLE '+MyTable.TableName)", то создается файл "<TableName>.DD" (т. е. имя правильное, но файл Paradox, а мне надо Foxpro), . Я подозреваю, что PARADOX получается от того, что DEFAULT DRIVER в BDE - это PARADOX. Как создать файл Foxpro не меняя DEFAULT DRIVER в BDE? Или Vit не то имел ввиду, говоря "Используй кверю"? |
Сообщ.
#4
,
|
|
|
У меня вот это в Д6 работает
CurrentDir := GetCurrentDir(); with TableRadio do begin Active := False; DatabaseName := CurrentDir; TableName := 'SpisRadio'; TableType := ttFoxPro; with FieldDefs do begin Clear; Add('LS',ftString,6,False); Add('FIO',ftString,30, False); ... end; CreateTable; end; |
Сообщ.
#5
,
|
|
|
Ты присваиваешь путь, а надо Alias. Что в параметрах Alias будет стоять, такой тип и создаст кверя. Alias в данном случае должен иметь параметры: Type=Standard, Default Driver = FOXPRO (можно попробовать использовать и DSN от ODBC - его тоже в Run-time при желании можно создать, а работать с ним через BDE). Через объект session можешь легко создать временный Alias и его использовать, по завершении сессии этот Alias автоматически прекратит существование.
|
Сообщ.
#6
,
|
|
|
priklad'у:
Цитата priklad, 19.03.03, 14:43:08 У меня вот это в Д6 работает ... Clear; Add('LS',ftString,6,False); Add('FIO',ftString,30, False); ... end; CreateTable; end; Неужели из ftString ftInteger получится? Попробую. Vit'у: В том то и дело, что не люблю я алиасы. Помню как-то давно мучился и что-то до сих к ним предубеждение. Возможно, я не прав. Все равно спасибо! То-же попробую. Пока ждал ответ с форума, поковырял BDE API и порешал проблему через DbiCreateTable. Довольно гибкие параметры передаются в эту функцию. Всё, что хотел - получается! |