база данных
Хочу сделать приложение, использующее базу данных через Access в билдере.Подскажите, как?
Используя либо BDE либо АДО-компоненты, по другому никак...:D Или написав свои классы доступа...:D :D :D
Вобще то в билдере работает кнопка Фы1....
Подключаю базу через ADO, база MS Access. В режиме проектирования жму ADOTable->TableName - вываливаются все таблицы, содержащиеся в контейнере, всё путём... Но некоторые имена талиц начинаются с "диеза" - #. Если выбрать одну из них и установить свойство ADOTable->Active = true - вылетает ошибка, Syntax error in FROM clause. Тоже вылетает, если всё это производить программно. Кто знает, такое дело лечится?
Привет всем! Небольшая проблемка с базами данных, может кто сталкивался:
Подключаю базу через ADO, база MS Access. В режиме проектирования жму ADOTable->TableName - вываливаются все таблицы, содержащиеся в контейнере, всё путём... Но некоторые имена талиц начинаются с "диеза" - #. Если выбрать одну из них и установить свойство ADOTable->Active = true - вылетает ошибка, Syntax error in FROM clause. Тоже вылетает, если всё это производить программно. Кто знает, такое дело лечится?
Это проблемка не с базами данных - это проблема в коде. Генетическом. Лечится переименованием без использования символов типа #%@ и им подобных, тем более в первом символе названия. В MS-диалекте SQL этот символ имеет свое специальное значение. Если переименовывать в лом, или еще какие либо причины - тогда надо в запросе использовать select * from [#TableName] - тогда отработает нормально. Но лучше обходится без подобных имен.
Хочу сделать приложение, использующее базу данных через Access в билдере.Подскажите, как?
Ну, вообщем, с форума http://www.progz.ru. Где-там это в архиве...
З.Ы.: Аксес медленный, неповоротливый. Если на нём что-то делать, так на вбейсике прилагаемом к нему писать, ИМХО.
2kot_:База служебная, используется иной програмой, так что переименовывать таблицы нельзя =)) Но проблему я уладил, спасибо. Кстати, у меня возникли сбои при попытке подключить через BDE. В режиме проектирования Builder выкидывает окошко Login + Password, если попытаться указать имя таблицы в TableName. В ADO подобная шутка отключается прямо в свойствах, а вот можно ли это сделать в BDE?
Укажи ему DSN-name и в нем удали логин или укажи логин и пароль.
1. Итак, есть подключение к mdb базе через ADO. Можно ли как-нибудь узнать имена всех таблиц, содержащихся в базе, чтобы потом пользователь мог сам выбрать из списка таблиц нужную и установить подключение?
2. Не подскажете, где можно найти достаточно информативные источники или книги для работы с Excel-ем в С++ Builder 6.0?
Привет всем. Есть два вопроса (по базам данных и Excel), может кто сталкивался - подскажите, буду благодарен.
1. Итак, есть подключение к mdb базе через ADO. Можно ли как-нибудь узнать имена всех таблиц, содержащихся в базе, чтобы потом пользователь мог сам выбрать из списка таблиц нужную и установить подключение?
Спэшл фор акцесс:
SELECT [Connect], [Database], [Name], [Id] FROM [MSysObjects] WHERE [Type] = 1 AND [Flags] = 0;
А для моего любимого Oracle есть SELECT OWNER, TABLE_NAME FROM ALL_TABLES; 8)
Спэшл фор акцесс:
SELECT [Connect], [Database], [Name], [Id] FROM [MSysObjects] WHERE [Type] = 1 AND [Flags] = 0;
Можно на примере? Потому как у меня он чегой-то на MSysObj ругается...
Можно на примере? Потому как у меня он чегой-то на MSysObj ругается...
MSysObjects -- скрытая псевдотаблица базы даннных MDB (типа словарь). Для работы с ней надо открыть БД в среде M$ Access, в настройках (сервис --> параметры) поставить галочку "показывать скрытые объекты", а потом в меню "защита" дать права админу (или другому пользователю, под которым ты к базе коннектишься) на чтение из таблицы MSysObjects, после чего у тебя этот запрос будет нормально выполняться.
Нужно в таблице DBASE расширить одно символьное поле на 10 символов, программным образом. Пытаюсь сделать это черех fDbiDoRestructure пока не получается, может кто знает как это сделать.
1. Создаешь новое поле необходимой длины
2. Копируешь в новое поле значения из старого поля
3. Старое поле удаляешь
4. Новое поле переименовываешь
1. Создаешь новое поле необходимой длины
2. Копируешь в новое поле значения из старого поля
3. Старое поле удаляешь
4. Новое поле переименовываешь
Лучше использовать SQL - запрос alter table.
rslt = Chk(DbiGetCursorProps(hXCur, &CurProps));
Как правильно указать Handle курсора?
А как это сделать на практике, может есть код для примера. Пытаюсь использовать пример DBIResult fDbiDoRestructure1 из Help(a), но компилятор ругается на "&CurProps"
rslt = Chk(DbiGetCursorProps(hXCur, &CurProps));
Как правильно указать Handle курсора?
Посмотри здесь http://www.w3schools.com/sql/sql_alter.asp
MSysObjects -- скрытая псевдотаблица базы даннных MDB
...
нормально выполняться.
Great thanks. Ещё бы если это можно было организовать как-нито на программном уровне =) (я имею ввиду включение доступа к MSysObjects)
Есть контейнер mdb, в нём содержится до 100 таблиц. При попытке подключиться к некоторым таблицам (в основном - с длиными именами) через ADO, возникает ошибка типа "A component named PrimaryKey already exists". Притом, что SQL запрос к любой из этих таблиц проходит на "ура", и никаких проблем не возникает. Кто-нибудь знает, можно ли всё-таки установить подключение через ADO и с чем это может быть сязано?
И ещё вопрос: для того, чтобы подключиться к БД (локальной!) и найти там необх. данные, что будет быстрее: через ADO компоненты, с последующим установлением фильтра, или же через SQL запрос?
Ошибка PrimaryKey:
Есть контейнер mdb, в нём содержится до 100 таблиц. При попытке подключиться к некоторым таблицам (в основном - с длиными именами) через ADO, возникает ошибка типа "A component named PrimaryKey already exists". Притом, что SQL запрос к любой из этих таблиц проходит на "ура", и никаких проблем не возникает. Кто-нибудь знает, можно ли всё-таки установить подключение через ADO и с чем это может быть сязано?
Для начала выполни в базе запрос примерно такого вида
FROM OrderMain
GROUP BY DOCID
где DOCID - ключевое поле таблицы,OrderMain - соответственно сама таблица. Скорее всего у тебя поле, указанное как ключевое, на самом деле таковым не является, т.е. для этого поля количество будет больше еденицы.
И ещё вопрос: для того, чтобы подключиться к БД (локальной!) и найти там необх. данные, что будет быстрее: через ADO компоненты, с последующим установлением фильтра, или же через SQL запрос?
Через АДО компоненты, используя SQL-запрос с последующим установлением нужного фильтра...:) Используй компонент типа ADOQuery - и жизнь твоя будет гораздо проще.
Он позволяет работать с SQL напрямую:
AnsiString SQL = "SELECT * FROM TABLE WHERE FIELD1="+MYPARAM1+" AND FIELD2="+MYPARAM2;
ADOQuery1->SQL->Add(SQL);
ADOQuery1->Active = true;
или через параметры. А также позволяет использовать локальный фильтр:
ADOQuery1->Filtered = true;
Получаю данные из таблицы (.mdb контейнер) при помощи ADOQuery, что-то изменяю в них, сортирую по определённым полям ( <... Order By...> ), а как потом эту модифицированную таблицу можно записать на место старой?
(если коротко - как, к примеру, установить сортировку в таблице и сохранить проведёные изменения)
Прива. Такой вопрос:
Получаю данные из таблицы (.mdb контейнер) при помощи ADOQuery, что-то изменяю в них, сортирую по определённым полям ( <... Order By...> ), а как потом эту модифицированную таблицу можно записать на место старой?
(если коротко - как, к примеру, установить сортировку в таблице и сохранить проведёные изменения)
Не очень понятно зачем, но скажем так:
ADOQueryDel->ExecSQL();
ADOQueryUpd->SQL->Add("update table set (f1 = :p_f1,f2 = :p_f2..."); //Изменяем поля в таблице
ADOQuery->First();
while(!ADOQuery->Eof)
{
ADOQueryUpd->Parameters->ParamByName("p_f1")->Value = ADOQuery->FiledByName("f1")->Value;
ADOQueryUpd->Parameters->ParamByName("p_f2")->Value = ADOQuery->FiledByName("f2")->Value;
.......
ADOQueryUpd->ExecSQL();
ADOQuery->Next();
}
...ADOQueryDel->SQL->Add("delete * from table"); //Удаляем все нафиг из таблицы...
За пример изменения таблицы - спасибо. А как насчёт сохранения сортировки по какому-либо полю? Без удаления нафиХ всего из таблицы... ;)
За пример изменения таблицы - спасибо. А как насчёт сохранения сортировки по какому-либо полю? Без удаления нафиХ всего из таблицы... ;)
Насколько я понял вопрос, хочется хранить таблицу в упорядоченном по какому-то полю виде?
Зачем тебе "лошадь"? Пиши "конь" и всё! (с)...
Зачем хранить отсортированные таблицы, когда есть чудная конструкция [FONT=courier new]SELECT * FROM table ORDER BY field1, field2[/FONT]? Для ускорения операции выборки советую создать индекс по тем колонкам, по которым указан [FONT=courier new]order by[/FONT].
Насколько я понял вопрос, хочется хранить таблицу в упорядоченном по какому-то полю виде?
Зачем тебе "лошадь"? Пиши "конь" и всё! (с)...
Зачем хранить отсортированные таблицы, когда есть чудная конструкция [FONT=courier new]SELECT * FROM table ORDER BY field1, field2[/FONT]? Для ускорения операции выборки советую создать индекс по тем колонкам, по которым указан [FONT=courier new]order by[/FONT].
Блин, если б весь вопрос в этом был - так никаких проблем! :!!!: Просто есть mdb база, в которой одна не совсем умная программка из записей сделала винегрет. Вот и хотел сделать небольшую лечилку, чтобы всё можно было упорядочить.
И ещё: как можно из программы отключить ключевое поле в выбранной таблице? Ну типа сделать его не ключевым.
Блин, если б весь вопрос в этом был - так никаких проблем! :!!!: Просто есть mdb база, в которой одна не совсем умная программка из записей сделала винегрет. Вот и хотел сделать небольшую лечилку, чтобы всё можно было упорядочить.
И ещё: как можно из программы отключить ключевое поле в выбранной таблице? Ну типа сделать его не ключевым.
Посмотри команду sql alter table