Вверх ↑
Этот топик читают: Гость
Ответов: 689
Рейтинг: 20
#61: 2006-10-05 10:57:49 ЛС | профиль | цитата
Начал работу над функциональностью, направьте в нужное русло пожалуйста.
Цель: открыть базу и передать структуру в TreeView. Здесь столкнулся со сложностями, так как не работал с TreeView вообще. Структура должна быть приблизительно такая:
0-й уровень: Раздел
1-й уровень: Название базы [Путь к базе данных].
2-й уровень: Название таблицы []
3-й уровень: Название полей базы [тип, длина].

В трее она выглядит вот так:
Пользовательские базы[]
(
Test.db ([D:TempTest.db]
)
(
main[]
(
id [8, int]
RecTime[8, timestamp]
Name [1000. varchar]
)
temp[]
)
)
Как сделать это статично понятно. Не понятно как динамично.
Вот какой-то начальный код, см.вложение.
карма: 0

0
файлы: 1code.rar [3.7KB] [352]
Администрация
Ответов: 15295
Рейтинг: 1519
#62: 2006-10-05 15:34:32 ЛС | профиль | цитата
войдет ли этот модифицированный ListBox в новую версию Hiasm в качестве стандартного?

почему бы и нет

там в коде ListBox есть такое:

Удалить это нужно Задел на распознавание смайликов, однако делать это в любом случае надо иначе.
карма: 27
0
Ответов: 689
Рейтинг: 20
#63: 2006-10-09 12:50:09 ЛС | профиль | цитата
Леонид, как получить список столбцов базы с типом данных? Типа так:
Как хочу Пример
== Название столбца (Тип, Длина) ==== idRecord (int, 8) ==



Речь только о SQLite. Но если кто знает как в MSSQL это получить, было бы интересно это увидеть здесь.
карма: 0

0
Ответов: 2125
Рейтинг: 159
#64: 2006-10-09 13:08:24 ЛС | профиль | цитата
select sql from sqlite_master where tbl_name='groups'[/code]
Получишь такую строку
CREATE TABLE groups(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(64), info
 varchar(128), pos int)
"CREATE TABLE groups(" можешь выкинуть, остальное через запятую - нужные тебе данные.

[size=-2]------ Добавлено в 13:08 [/size]
Для MSSQL:
SELECT     syscolumns.colid, syscolumns.name, systypes.name AS type, syscolumns.length, syscolumns.xprec, syscolumns.xscale
FROM         syscolumns INNER JOIN
systypes ON syscolumns.xtype = systypes.xtype INNER JOIN
sysobjects ON syscolumns.id = sysobjects.id
WHERE (sysobjects.name = N'MyTable') AND (sysobjects.xtype = 'U')
ORDER BY syscolumns.colid
карма: 1

0
Ответов: 689
Рейтинг: 20
#65: 2006-10-09 14:25:24 ЛС | профиль | цитата
tsdima, спасибо за запрос, но это не совсем конечно то. Потому что хотелось бы получать по каждому полю отдельно.

Вот наваял открытие таблиц в TreeView. Не совсем то что хотелось бы, может поможете добить эту ерунду. Код во вложении. Что хотелось бы сделать:
1. Добавлять регистрации (Регистрация - запись в INI файле о пути к базе данных). Всего предполагается 2 раздела (1-й Пользовательские базы, 2-й Базы HiAsm). Так как добавление идет по ID в Tree, перед добавлением надо знать позицию верхнего уровня. С этим и заковыка. Работает когда курсор ставлю туда куда надо, а автоматом мозги кипят, не знаю как.
2. После получения регистраций из INI файла, получить таблицы. С этим проще, но если тыкать все время на уровень базы, то таблицы по новой в нее запихиваются.
3. Получить естественно поля. С полями пока не возился, но видимо придется как tsdima предлагает. по другому видимо никак.
4. Далее на Tree предполагается меню, которое будет свое, в зависимости от уровня вложенности Tree, который я получить не могу. Прошу уже неделю помочь, никто. Нажал узер на руте в трее - получил меню "добавить базу", нажал на уровне базы - получил "Добавить базу", "Удалить базу", "Открыть базу". Ну и далее на уровне таблиц таже пестня.
карма: 0

0
файлы: 1tree.rar [8.1KB] [374]
Ответов: 2125
Рейтинг: 159
#66: 2006-10-09 14:28:53 ЛС | профиль | цитата
по каждому полю отдельно
SQLite по каждому полю отдельно не выдаёт.
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#67: 2006-10-09 15:17:55 ЛС | профиль | цитата
Где то читал, что у SQLite два типа полей - INTEGER и TEXT. Так что вполне можно задавать
CREATE TABLE groups(id INTEGER PRIMARY KEY AUTOINCREMENT, name , info , pos int)

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 262
Рейтинг: 6
#68: 2006-10-09 15:30:34 ЛС | профиль | цитата
oldTV, есть способ получить список столбцов, с типами данных. Понадобятся следующие процедуры из sqlite3api
sqlite3_column_count:function(pStmt:pointer):integer;
sqlite3_column_name:function(pStmt:pointer; idx:integer):pchar;
sqlite3_column_type:function(pStmt:pointer; col:integer):integer;
column_type возвращает:
SQLITE_INTEGER = 1
SQLITE_FLOAT = 2
SQLITE_TEXT = 3
SQLITE_BLOB = 4
SQLITE_NULL = 5
справка по адресу http://www.codenet.ru/db/other/sqlite/
Выглядеть будет примерно так:
count:=sqlite3_column_count(pStmt);
for i:=0 to count-1 do begin
ColName:=sqlite3_column_name(pStmt, i);
ColType:=sqlite3_column_type(pStmt, i);
...дальше вывод куда Вам надо..
end;
В принципе можно написать элемент вроде sqliteinfo. скажите что нужно на выходе.
карма: 0

0
Ответов: 2125
Рейтинг: 159
#69: 2006-10-09 18:32:22 ЛС | профиль | цитата
справка по адресу
Ага, в этой же справке написано, что если запрос pStmt не вернул записей то sqlite3_column_count(pStmt) будет равен нулю. Прежде чем предлагать вариант решения проблемы убедись в том, что он верный.
карма: 1

0
Ответов: 262
Рейтинг: 6
#70: 2006-10-09 18:48:23 ЛС | профиль | цитата
tsdima, и сразу критика Скажем запрос SELECT * FROM table LIMIT 1 вернет все столбцы таблицы если они там есть. И sqlite3_column_count(pStmt) сработает я думаю верно.
карма: 0

0
Ответов: 2125
Рейтинг: 159
#71: 2006-10-09 18:51:39 ЛС | профиль | цитата
сработает я думаю верно
... если в таблице есть хотя-бы одна запись.
карма: 1

0
Ответов: 262
Рейтинг: 6
#72: 2006-10-09 19:10:38 ЛС | профиль | цитата
tsdima, Ваша правда...
карма: 0

0
Ответов: 689
Рейтинг: 20
#73: 2006-10-09 21:13:43 ЛС | профиль | цитата
tsdima писал(а):
... если в таблице есть хотя-бы одна запись.

Видимо на этом принципе построены все SQLite DB Builder'ы, ссылки смотрите выше. По крайней мере SQLite Analyzer реализован именно так (на мой взгляд).

Chesh, если не трудно, это будет в помощь, напишите sqliteinfo. На выходе(как одна из точек) имя столбца с типом данных и длинной, ну например в виде colname (int, 8). Еще можно recordtablecount (число записей в таблице).

Ладно, со столбцами более менее понятно. Хотя и трудновато будет реализовывать.

Огромная просьба, помогите по TreeView. Просто ступор. Бьюсь неделю, ничего приятного по коду на ум не приходит, кроме этого. Но это не приятное, а тяжелое и неверное.
карма: 0

0
Ответов: 262
Рейтинг: 6
#74: 2006-10-10 14:16:39 ЛС | профиль | цитата
oldTV, вот попробуй первую версию. Выложу на SVN, если одобрите и Dilma даст добро.
tsdima писал(а):
... если в таблице есть хотя-бы одна запись.
как ни странно, но практика показала, что все работает и с пустой таблицей. так как читать нужно между строк
Первая функция позволяет получить число столбцов сразу после успешной компиляции SQL инструкции, то есть после выполнения функции sqlite3_prepare()
тоесть sqlite3_step еще не выполнялся.
Если ошибки пишите.

если в hic файле я напишу Database вместо DataBase то HIAsm создаст новую вкладку, что ни есть хорошо. Для сравнения строк лучше использовать TStrList.IndexOf_NoCase или подобную.
Удачи.
карма: 0

1
файлы: 1SQLite_info.zip [10.1KB] [365]
Голосовали:ajaxii
Ответов: 689
Рейтинг: 20
#75: 2006-10-10 16:31:30 ЛС | профиль | цитата
Chesh, я пока получаю RunTime Error at 216. Сейчас попробую на чистом проекте. Если имя таблицы отсутствует в базе, то сразу RunTime at 216.
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)