Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/26: Рейтинг темы: голосов - 26, средняя оценка - 4.50
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2

Создание ADOConnection

28.02.2013, 12:42. Показов 4907. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создаю подключение к MS Sql server:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function OpenConnection(ConnectionString: AnsiString): boolean;
var
  ADODBConnection: OleVariant;
begin
  ADODBConnection := CreateOleObject('ADODB.Connection');
  ADODBConnection.CursorLocation := 3; // User client
  ADODBConnection.ConnectionString := ConnectionString;
  Result := true;
try
   ADODBConnection.Open;
except
   Result := false;
end;
end;
 
function DBConnection(bMessage: Boolean): AnsiString;
var
  asTimeout,
  asUserName,
  asPassword,
  asDataSource,
  ConnectionString: AnsiString;
  Res: Boolean;
  OldCursor: TCursor;
begin
  asTimeout := '150';
  asUserName := 'Login.EdLogin.text';
  asPassword := 'Login.EdPassword.Text';
  asDataSource := 'Login.EdIpServer.Text';
  ConnectionString := 'Data Source = ' + asDataSource +
   'User ID = ' + asUserName +
   'Password = ' + asPassword +
   'Mode = Read|Write;Connect Timeout = ' + asTimeout;
  try
     Res := OpenConnection(ConnectionString);
     if (bMessage) then
     begin
       if Res  then
       begin
         Application.MessageBox('Connection OK!', 'Information', MB_OK);
         Result := ConnectionString;
       end;
       if not Res then
       begin
         Application.MessageBox('Connection Error!', 'Error', MB_ICONERROR + MB_OK);
         Result := '';
       end;
     end;
  finally
    Screen.Cursor := OldCursor;
  end;
end;
Сначала вылетал на строчке asUserName := Login.EdLogin.text, а так работает asUserName := 'Login.EdLogin.text' - почему?? Но появилась еще 1 ошибка:
Project1.exe raised exception class EOleException with message '[Microsoft][Диспетчер драйверов ODBC]Слишком длинное имя источника данных'.Process stoped.
Что я делаю не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.02.2013, 12:42
Ответы с готовыми решениями:

ADOConnection
В общем проблема в следующем. В компоненте ADOConnection есть свойство ConnectionString возле которого при нажатии троеточия открывается...

ADOConnection
Элемент ADOConnection подвязываю базу ms access из папки где лежит проект, проблема в том что при заауске на другом пк вылетает ошибка пути...

Delphi и AdoConnection
Я создал базу данных в Accessе и с помощю AdoCONNECTION я связал с Delphi но не могу туда сохранить *.jpg рисунки а *.bmp, *.ico рисунками...

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
28.02.2013, 14:20
Цитата Сообщение от NotBeginner Посмотреть сообщение
а так работает asUserName := 'Login.EdLogin.text'
Это тебе кажется, что работает. Вместо реального логина подставляется строка 'Login.EdLogin.text', именно в таком виде, а не то, что ты ввел в EdLogin. То же самое - с паролем. И что это даст?
Цитата Сообщение от NotBeginner Посмотреть сообщение
Сначала вылетал на строчке asUserName := Login.EdLogin.text
форма Login точно существует в тот момент, когда выполняется это действие? Откуда вызывается функция DBConnection?
0
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
28.02.2013, 16:55  [ТС]
но я чот туплю:
я вызываю после того как создал

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
class function TLogin.Execute: boolean;
begin
 with TLogin.Create(nil) do
 begin
  DBConnection(true);
 try
   Result := ShowModal = mrOk;
 finally
   Free;
 end;
end;
end;
Добавлено через 1 час 57 минут
чот тоже не то.. кто нить хелпаните

Добавлено через 13 минут
нашел тут такую функцию построения строки подключение:
Delphi
1
2
3
4
5
Function BuildConnectionString(Database, Server, Login, Password:string):Widestring;
begin
if Password<>'' then Password:=';Password='+Password+';Persist Security Info=True' else Password:=';Persist Security Info=False';
result:=Format('Provider=SQLOLEDB.1%s;User ID=%s;Initial Catalog=%s;Data Source=%s', [Password, Login, Database, Server]);
end;
Так или как в первом сообщении? как правильно?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
28.02.2013, 17:11
NotBeginner, а тебе не кажется, что лучшее место для проверки - по нажатию кнопки на TLogin?

Delphi
1
2
3
4
5
6
7
procedure TLogin.LogInButtonClick(Sender: TObject);
begin
  if DBConnection(true) <> '' then
     ModalResult := mrOK
   else
     ModalResult := mrAbort;
end;
0
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
28.02.2013, 17:54  [ТС]
а как такое сделать если я использую поток??

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
procedure TMyThread.DBConnection;
var
  asUserName,
  asPassword,
  asDataBase,
  asServer,
  ConnectionString: String;
  Res: Boolean;
  OldCursor: TCursor;
  ADODBConnection: OleVariant;
begin
  OldCursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  asUserName := 'Login.EdLogin.Text';
  asPassword := 'Login.EdPassword.Text';
  asDataBase := 'Login.EdDataBase.Text';
  asServer := 'Login.EdIpServer.Text';
  if asPassword <> '' then
    asPassword:=';Password='+asPassword+';Persist Security Info=True'
  else
  asPassword:=';Persist Security Info=False';
  ConnectionString:=Format('Provider=SQLOLEDB.1%s;User ID=%s;Initial Catalog=%s;Data Source=%s',[asPassword, asUserName, asDataBase, asServer]);
  ADODBConnection := CreateOleObject('ADODB.Connection');
  ADODBConnection.CursorLocation := 3; // User client
  ADODBConnection.ConnectionString := ConnectionString;
  ShowMessage(ConnectionString);
  try
    Res:= ADODBConnection.Open;
      if Res  then
         Application.MessageBox('Connection OK!', 'Information', MB_OK)
      Else
        Application.MessageBox('Connection Error!', 'Error', MB_ICONERROR + MB_OK);
  finally                                                                       
    Screen.Cursor := OldCursor;
  end;
end;
 
procedure TMyThread.Execute;
begin
  Synchronize(DBConnection);
end;
end.
и сразу появился вопрос: будет ли работать этот адоконект на главной форме?? если да то каким образом:??
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
28.02.2013, 18:06
NotBeginner, кроме того, что я написал выше, лучше сделать DBConnection методом класса TLogin, потому что смотри, что происходит:
Delphi
1
2
3
procedure TLogin.LogInButtonClick(Sender: TObject);
begin
  if DBConnection(true) <> '' then ...
В DBConnection у тебя есть обращение к полям формы Login. А где ты инициализируешь эту переменную Login, не задумывался? Нет у тебя ее инициализации, потому как создается безымянный экземпляр: with TLogin.Create(nil) do, с которым (и только с ним) ты можешь безопасно работать, потому что только он инициализирован. А вот если ты сделаешь DBConnection методом того же класса TLogin - то всё встанет на свои места: метод будет вызываться именно для того самого безымянного экземпляра, и работать с его же полями.

Теперь - о потоке. Во-первых, непонятно, зачем ты выносишь это дело в поток, и тут же всё тело TMyThread.DBConnection оборачиваешь в Synchronize. В чем преимущество? DBConnection будет выполняться в контексте основного потока (потому что так реализован Synchronize), и что это тебе даст?

Ну, и потом, ADODBConnection у тебя - локальная переменная, и уничтожится она в момент завершения потока. Если она будет описана в другом Unit-е - можно будет работать с ней и после того, как поток завершится, из любого места программы.
0
174 / 160 / 71
Регистрация: 22.02.2013
Сообщений: 1,769
Записей в блоге: 2
01.03.2013, 10:04  [ТС]
я не особо различаю такие вещи как: Create(nil), Create(self) и Create(application) видимо в этом проблема

Добавлено через 10 часов 40 минут
все заработало))
теперь хочу сделать такую штуку как запоминание пароля . По этому поводу как я понимаю надо использовать ini файлы и компонент CheckBox?? МБ у кого есть код? или с чего начать, а то как работать с ini файлами поверхностные знания

Добавлено через 22 минуты
Записываю:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 procedure TLogin.BtnConnectClick(Sender: TObject) ;
 var
  Ini : TiniFile;
 begin
  if CheckBox1.Checked=true then
  begin
    Ini := TiniFile.Create('ConnectOption.ini');
    With Ini do
    begin
      EdIpServer.Text:=ReadString('ConnectionIption','IP','IP Server');
      EdDataBase.Text:=ReadString('ConnectionIption','DB','Data Base');
      EdLogin.Text:=ReadString('ConnectionIption','Login','Login');
      EdPassword.Text:=ReadString('ConnectionIption','Password','Pass');
    end;
  end;
Считываю:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
 procedure TLogin.FormShow(Sender: TObject);
 var
  Ini : TiniFile;
 begin
    Ini := TiniFile.Create('ConnectOption.ini');
    With Ini do
    begin
      WriteString('ConnectionIption','IP', EdIpServer.Text);
      WriteString('ConnectionIption','DB', EdDataBase.Text);
      WriteString('ConnectionIption','Login', EdLogin.Text);
      WriteString('ConnectionIption','Password', EdPassword.Text);
    end;
  end;
Сделал вот так - правильно??
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
01.03.2013, 13:10
Экземпляр Ini разрушать после завершения записи в файл кто будет?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 procedure TLogin.BtnConnectClick(Sender: TObject) ;
 var
  Ini : TiniFile;
 begin
  if CheckBox1.Checked=true then
  begin
    Ini := TiniFile.Create('ConnectOption.ini');
    With Ini do
    begin
      EdIpServer.Text:=ReadString('ConnectionIption','IP','IP Server');
      EdDataBase.Text:=ReadString('ConnectionIption','DB','Data Base');
      EdLogin.Text:=ReadString('ConnectionIption','Login','Login');
      EdPassword.Text:=ReadString('ConnectionIption','Password','Pass');
      Free; // Ini.Free;
    end;
  end;
Во втором фрагменте - аналогично. Но я бы не стал записывать в файл пароли в открытом виде. Хоть как-то зашифруй, а потом уже записывай, а после чтения - расшифровывай обратно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.03.2013, 13:10
Помогаю со студенческими работами здесь

Работа с ADOConnection
Можно ли динамически во время выполнения программы вывести форму подключения в БД, как при редактировании строки ConnectionString? Или...

ADOConnection в Delphi
Здравствуйте! Подскажите пожалуйста, что может быть не так! У меня Delphi7_Lite_Full_Edition_Setup_7.3.4.2_Build_20110501.exe Я когда...

Подключение ADOConnection
Доброго времени суток, у меня такой вопрос к всем форумчанам Я использую SQL EXPRESS объясните мне банальную схему того чтобы к моей базе...

ADOConnection, настройка
Здравствуйте, у меня проблема с ADOConnection. Есть программка, к неи подключена БД(Access), подключена через ConnectionString. Подскажите...

adoconnection.GetTableNames
Обнаружил, что adoconneсtion.GetTableNames почему-то не видит обычные таблицы, только системные. В чем может быть проблема? Подключаюсь к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru