На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> Как подключить базу данных к SQL-серверу , MS SQL Server -> ADO
    Работаю через ADO с Microsoft SQL server -ом.
    Всё конектится, отображается, меняется и вообще все запросы работают путём.

    Но всё это происходит с теми базами данных, что уже ручками подключены к SQL-server-у.

    Теперь встаёт задача - подключить программно ещё одну базу данных (то есть - пару *.ldf и *.mdf файлов). Лезу в Help по SQL-server-у - вижу там команду (пример ниже)
    ExpandedWrap disabled
      EXEC sp_attach_db @dbname = N'pubs',
         @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',
         @filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'

    А теперь может кто-нибудь просветить идиотика, как мне эту самую команду подать SQL-серверу подать, каким кодом?

    И через какой компонент? через TADOConnection или TADOStoredProc ? Если у кого есть подобный примерчик - буду премного благодарен.

    P.S. В принципе - работаю на BCB6, но и код Delphi думаю расшифрую без труда...
      ExpandedWrap disabled
        Драйвер ODBC для SQL Server
         
        Стандартная политика безопасности:
         
        oConn.Open "Driver={SQL Server};" & _
                           "Server=carl2;" & _
                           "Database=pubs;" & _
                           "Uid=sa;" & _
                           "Pwd=;"
         
        Trusted Connection:
         
        oConn.Open "Driver={SQL Server};" & _
                           "Server=carl2;" & _
                           "Database=pubs;" & _
                           "Uid=;" & _
                           "Pwd=;"
         
        Примечание: используйте пустой UID и PWD
         
        С запросом имени пользователя и пароля
         
        oConn.Properties("Prompt") = adPromptAlways
        oConn.Open "Driver={SQL Server};" & _
                           "Server=carl2;" & _
                           "DataBase=pubs;"
        Мало что понял, простите идиотика.
        Кто такой oConn?
        Database=pubs - насколько понимаю имя базы данных (по видимому pubs - задаю сам, какое хочу? или нет?).
        А вот где указать вместе с путём - из каких файлов брать собственно базу данных?
          Цитата Шурик П. @
          через TADOConnection или TADOStoredProc ?
          да какая разница? в обоих случаях команда сработает. главное - иметь соответствуишие права.
          попробуи, есл что не так, тогда будем разбератся :yes:
          Сообщение отредактировано: Kobra -
            Цитата Kobra @
            да какая разница? в обоих случаях команда сработает. главное - иметь соответствуишие права.

            Всё-таки ещё раз - мне надо подключить базу к SQL-серверу.
            А не подключиться к базе, уже подключённой к SQL-серверу.
            Я так понимаю, тот кусок справки, что писал Bas - это собственно подключение к уже подключённой к SQL серверу базе данных, аналог вот такого примерно С-шного кода:
            ExpandedWrap disabled
                ADOConnection1->Connected = false ;
                ADOConnection1->ConnectionString =
                  "Provider=serverType;"
                  "Integrated Security=SSPI;"
                  "Persist Security Info=False;"
                  "Data Source=serverName;"
                  "Initial Catalog=dbName;";
                ADOConnection1->Connected = true ;

            У меня же проблемка вот в чём:
            1. Есть запущенный MS SQL server. К нему подключены некие базы данных. К ним я достукиваюсь с помощью конструкции приведённой выше без проблем
            2. Теперь - мне надо получить доступ к данным, лежащим в паре файлов, допустим:
            'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',
            'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.ldf'
            при этом про эти файлы пока SQL-server знать не знает и ведать не ведает.
            3. Чтобы получить доступ к данным из этих файлов, ИМХО, надо чтобы SQL-server их увидел, подключил и сопоставил этим двум файлам некое имя dbName, которое потом подставляю в ADOConnection1->ConnectionString = "Initial Catalog=dbName;" и получу доступ к данным.
            4. Лезу в help по SQL-server - и нахожу там функцию SQL-server-а sp_attach_db которая идеально решила бы мою проблему (пример ниже)
            ExpandedWrap disabled
              EXEC sp_attach_db @dbname = N'pubs',
                 @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',
                 @filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.ldf'

            5. А теперь - главная проблема. Я не знаю, как, пользуя TADOConnection или TADOStoredProc подать серверу эту самую команду.
            6. Порывшись в help - нашёл коллекцию Commands у TADOConnection. Недолго думая сляпал вот такой С-шный код:
            ExpandedWrap disabled
                AnsiString  dr = "c:\\Program Files\\Microsoft SQL Server\\MSSQL\\Data"
                AnsiString mdf = dr + "\\" + dbName + ".mdf";
                AnsiString ldf = dr + "\\" + dbName + ".ldf";
                ADOConnection1->Commands[0]->CommandText = "EXEC sp_attach_db @dbname=N'" +
                     dbName + "', @filename1=N'" + mdf + "', @filename2=N'" + ldf + "'";
                ADOConnection1->Commands[0]->Execute();

            и само собой налетаю при выполнении на сообщение о том, что нету у меня Commands[0] . Что резонно, вот только найти - как добавить в коллекцию команду. Ибо ничего похожего на метод Add я у TADOCommands найти не смог
              TADOCommands имеет своиство Text. но так как я им не пользуюс, дам пример с TADOStoredProc, только на делфи.
              ExpandedWrap disabled
                procedure TForm1.TntButton1Click(Sender: TObject);
                var
                  SP: TADOStoredProc;
                begin
                  SP := TADOStoredProc.Create(nil);
                  SP.Parameters.Clear;
                  SP.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=master;Data Source=MERABK\M0';
                  SP.ProcedureName := 'sp_attach_db';
                  SP.Parameters.CreateParameter('@dbname',
                                                ftWideString,
                                                pdInput,
                                                255,
                                                'test');
                    SP.Parameters.CreateParameter('@filename1',
                                                ftWideString,
                                                pdInput,
                                                255,
                                                'C:\Program Files\Microsoft SQL Server\MSSQL$M0\Data\test_Data.mdf');
                    SP.Parameters.CreateParameter('@filename2',
                                                ftWideString,
                                                pdInput,
                                                255,
                                                'C:\Program Files\Microsoft SQL Server\MSSQL$M0\Data\test_Log.ldf');
                  SP.ExecProc;
                  FreeAndNil(SP);
                end;
                Ну вот. После долгих мучений родил таки код:
                ExpandedWrap disabled
                    // Подключаем новую базу данных
                    ADOConnection1->Connected = false;
                    TADOStoredProc *SP = new TADOStoredProc(NULL);
                    SP->ConnectionString = ADOConnection1->ConnectionString;
                    SP->ProcedureName = "sp_attach_db";
                    SP->Parameters->CreateParameter("@dbname="   , ftWideString, pdInput, 255, dName);
                    SP->Parameters->CreateParameter("@filename1=", ftWideString, pdInput, 255, mdf  );
                    SP->Parameters->CreateParameter("@filename2=", ftWideString, pdInput, 255, ldf  );
                    SP->ExecProc();
                    ADOConnection1->Connected = true ;
                    delete SP;

                Вроде бы подключить новую DataBase получилось. Во всяком случае, при попытке подключить базу два раза подряд Сервер вернул сообщение что такая база данных уже существует.
                Хотя данных пока считать не удалось :( ... разбираюсь дальше

                Всё одно - спасибо
                  Чтобы подключить базу, сначала надо подключится к серверу и базе Master
                  Ну а дальше ты уже знаешь.
                    Цитата Шурик П. @
                    Работаю через ADO с Microsoft SQL server -ом.
                    Всё конектится, отображается, меняется и вообще все запросы работают путём.

                    может осталась программка? уже недели три бьюсь и всё не могу никак извлечь данные из базы. поделитесь, пожалуйста. или объясните что и как надо правильно делать :(
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0728 ]   [ 17 queries used ]   [ Generated: 24.04.24, 02:20 GMT ]