Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Подключение и проверка БД


Автор: s1lver 18.6.2008, 20:16
Вообщем проблема возникла при подключении и проверки наличия файла БД.
Подключаю БД MS Access

Код

void __fastcall TForm3::FormCreate(TObject *Sender)
{
char Connect='Provider=Microsoft.Jet.OLEDB.4.0;' +
               'Data Source=function.mdb';

if (FileExists('function.mdb')){
     ADOConnection1->Connected=false;
     ADOConnection1->ConnectionString=Connect;
     ADOConnection1->Connected=true;

ADOTable1->Active=True;
ADOTable2->Active=True;
ADOTable3->Active=True;
                               }   }
}

Автор: Dmi3ev 18.6.2008, 21:48
Цитата

char Connect='Provider=Microsoft.Jet.OLEDB.4.0;' +
               'Data Source=function.mdb';

как Вы в char смогли все это запихнуть, char-1 байт. smile  Для начала используйте AnsiString Connect. Напишите о результатах, остальные строчки даже и смотреть нечего

Добавлено через 7 минут и 39 секунд
когда вы используете строку, то используйте двойные ковычки
Цитата

char Connect='Provider=Microsoft.Jet.OLEDB.4.0;' +
               'Data Source=function.mdb';

а надо (я не говрю о правильности указания провайдера и т.д., а только о том как записывать строки )
Код

AnsiString Connect="Provider=Microsoft.Jet.OLEDB.4.0;" +
               "Data Source=function.mdb";

не так
Цитата

FileExists('function.mdb')

а так
Код

FileExists("function.mdb")


Добавлено через 10 минут и 44 секунды
если у вас переменная char, то тогда используйте одинарные ковычки
Код

char c='a';

если массив char, тогда двойные
char c[]="string";
а соединение может быть и правильное smile 

Автор: s1lver 19.6.2008, 11:11
Да, спасибо на счет кавычек я разобрался потом. 
Вот переделал так как вы говорите:
Код


void __fastcall TForm3::FormCreate(TObject *Sender)
{
AnsiString Connect="Provider=Microsoft.Jet.OLEDB.4.0;" + указывает на ошибку тут
               "Data Source=function.mdb";
               /*ADOConnection1->ConnectionString="Data Source=Data/function.mdb";
               ADOConnection1->Connected=true; */
{
if (FileExists("function.mdb")){
     ADOConnection1->Connected=false;
     ADOConnection1->ConnectionString=Connect;
     ADOConnection1->Connected=true;   

ADOTable1->Active=True;
ADOTable2->Active=True;
ADOTable3->Active=True;
   }}
}


Выходит такая ошибка [C++ Error] function.cpp(39): E2085 Invalid pointer addition
хотя я эту строку скопировал из ADOConnection1 


далее я попытался подключить по другому.
Код

ADOConnection1->ConnectionString="Data Source=Data/function.mdb";
               ADOConnection1->Connected=true; 

ADOTable1->Active=True;
ADOTable2->Active=True;
ADOTable3->Active=True;


компилируется, но при запуске выходит сообщение "Не выполнена проверка подлинности ".
Хотя таблица с данными отображается!!! smile 

Автор: Dmi3ev 19.6.2008, 11:36
я подключал не прогаммно только что, вот какой у меня ConnectionString
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Программирование\претензии\претензии\pretenzii1.mdb;Mode=ReadWrite;Persist Security Info=False
а у Вас раз так
Цитата

ADOConnection1->ConnectionString="Data Source=Data/function.mdb";

и раз так
Цитата

AnsiString Connect="Provider=Microsoft.Jet.OLEDB.4.0;" + указывает на ошибку тут
               "Data Source=function.mdb";

в последнем примере + не ставьте, какого ... он там делает, если он не производит никаких изменений, пишите так:
Код

AnsiString Connect="Provider=Microsoft.Jet.OLEDB.4.0; Data Source=function.mdb"


Добавлено через 32 секунды
а вот программно соединял
Код

ADOConnection1->LoginPrompt=false;
ADOConnection1->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Ïðîãðàììèðîâàíèå\\ïðåòåíçèè\\ïðåòåíçèè\\pretenzii1.mdb;Mode=ReadWrite;Persist Security Info=False";
ADOConnection1->Open();
ADOTable1->Active=true;


Добавлено через 55 секунд
ой, каркули, это путь к бд

Добавлено через 2 минуты и 5 секунд
Open() и Connected=true, это одно и то же

Автор: s1lver 19.6.2008, 11:45
Ага, ошибка из-за + была.
Но теперь другая проблема даные не отображаются.
Т.е похоже подключение не произошло

Автор: Dmi3ev 19.6.2008, 11:49
присылайте текст, он же каждый раз меняется у Вас, но сначала возьмите мой вариант и поменяйте только путь к бд. если не получится, тогда будем думать  smile

Добавлено через 3 минуты и 9 секунд
а в Table DBGRID DATASOURCE, Вы все правильно указали? Просто я не пойму, подключение программно, c Table и тд Вы работаете вручную. изберательно у Вас как-то  smile 

Автор: s1lver 19.6.2008, 11:53
вот как сейчас выглядит:
Код


void __fastcall TForm3::FormCreate(TObject *Sender)
{
               
AnsiString Connect="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=function.mdb";

if (FileExists("function.mdb")){
     ADOConnection1->Connected=false;
     ADOConnection1->ConnectionString=Connect;
     ADOConnection1->Connected=true;   
      }
ADOTable1->Active=True;
ADOTable2->Active=True;
ADOTable3->Active=True;
  }
 


Да, и теперь выводит сообщение что не выполнена проверка подлинности

Автор: Dmi3ev 19.6.2008, 11:57
а как у меня попробывали?

Автор: s1lver 19.6.2008, 11:59
Да пробовал.
Вообщем заработало. Но при открытии выходит сообщение "Не выполнена проверка подлинности"

PS. может из-за того что я настроил поля отображения не программно?

Автор: Dmi3ev 19.6.2008, 12:06
попробуйте руками соединить пока что, пишите что получилось. умеете ручками соединять, непрограммно

Автор: s1lver 19.6.2008, 12:14
Если руками то, при попытке выбрать таблицу выходит сообщение "Не выполнена проверка подлинности"

Вот на всякий случай весь код на форме:

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdio.h>

#include "function.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "sSpeedButton"
#pragma resource "*.dfm"
TForm3 *Form3;

//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::TabSet1Change(TObject *Sender, int NewTab,
      bool &AllowChange)
{
switch (TabSet1->TabIndex)
{
case 1: DBGrid2->Visible=true;
{DBGrid1->Visible=false;
 DBGrid3->Visible=false;
 DBNavigator1->DataSource=DataSource2;}
         break;
case 0: DBGrid1->Visible=true;
{DBGrid2->Visible=false;
DBGrid3->Visible=false;
DBNavigator1->DataSource=DataSource1;}
         break;
case 2: DBGrid3->Visible=true;
{DBGrid2->Visible=false;
DBGrid1->Visible=false;
DBNavigator1->DataSource=DataSource3;}
break;  }
}
//---------------------------------------------------------------------------


void __fastcall TForm3::FormCreate(TObject *Sender)
{
         
AnsiString Connect="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=function.mdb";

if (FileExists("function.mdb")){
     ADOConnection1->Connected=false;
     ADOConnection1->ConnectionString=Connect;
     ADOConnection1->Connected=true;   
      }
ADOTable1->Active=True;
ADOTable2->Active=True;
ADOTable3->Active=True;

}
//---------------------------------------------------------------------------


Собственно меня сейчас вот это сообщение заботит "Не выполнена проверка подлинности" - из-за чего оно может выводится?

Автор: Dmi3ev 19.6.2008, 12:31
я вообще такого не встречал, если я не задаю путь к бд, у меня появляется такое сообщение, но у Вас все указано, попробуйте вот такое еще добавить, как у меня
Код

Persist Security Info=False

просто проверка подлинности скорее всего связана с паролями и тд, если рассуждать логически
еще этот пароль можно убрать, зачем он нужен
Код

ADOConnection1->LoginPrompt=false;

я не сталкивался с такой ошибкой, хотя по ADO делал много чего, хз, попробуйте пока вот такие варианты

Добавлено через 55 секунд
это в ConnectionString
Persist Security Info=False

Автор: Dmi3ev 19.6.2008, 12:54
о кстати, если ты подключаешь программно, то св-во TableName У ADOTable тоже лучше программно задавать, ведь до начала соединения (пока событие не произошло) Table не знает где находится таблица.  попробуй программно задать имя таблицы, это может помочь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)