Проблема при подключении через ODB C в C ++ к базе данных Azure SQL - PullRequest
0 голосов
/ 17 апреля 2020

Это мой первый вопрос о StackOverflow, поэтому, пожалуйста, извините меня за невиновность!

Вот проблема: я пытаюсь подключиться через ODB C на Windows в C ++ к Azure SQL, но безуспешно, так как я получаю следующее сообщение:

[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0)

Я извлек строку подключения из Azure и убедился, что мой IP-адрес зарегистрирован в настройках брандмауэра.

В соответствии с примером, предоставленным Microsoft, я подключаюсь через:

    _retcode = SQLDriverConnect(
        _hDbc,
        NULL,
        ( SQLCHAR * ) connectionString,
        SQL_NTS,
        NULL,
        0,
        NULL,
        SQL_DRIVER_NOPROMPT );

, где connectionString определяется как:

const char * connectionString = "Driver = { ODBC Driver 13 for SQL Server };"
    "Server = tcp:<datasource>.database.windows.net, 1433;"
    "Database = <database>;"
    "Uid = <account>; Pwd = <password>;"
    "Encrypt = yes; TrustServerCertificate = no; Connection Timeout = 30;";

Кроме того, я попытался подключиться через. NET в C# и работает со следующей сборкой строки подключения:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder.DataSource = "<datasource>.database.windows.net";
    builder.UserID = "<account>";
    builder.Password = "<password>";
    builder.InitialCatalog = "<datavase>";

Мне удалось выполнить инструкцию «SELECT @@ VERSION» со следующим результатом:

Microsoft SQL Azure (RTM) - 12.0.2000.8
    Feb 26 2020 10:26:43
    Copyright (C) 2019 Microsoft Corporation

Так что я делаю не так ???

Заранее благодарю за помощь!

1 Ответ

1 голос
/ 17 апреля 2020

Я нашел решение! Сначала я предоставил информацию OutConnectionString для отображения рабочей строки соединения, если таковая имеется.

       SQLDriverConnect(hDbc,
                     GetDesktopWindow(),
                     pwszConnStr,
                     (SQLSMALLINT)wcslen(pwszConnStr),
                     OutConnectionString,
                     BufferLength,
                     &StringLength2Ptr,
                     SQL_DRIVER_COMPLETE));

Затем я вернулся к созданию файла DSN с помощью мастера, который запускается, когда не предоставлены аргументы команды (в Пример Microsoft).

Мне удалось предоставить правильные аргументы и я смог подключиться к моей базе данных Azure SQL.

Я распечатал OutConnectionString и вот результат (довольно далеко от что я ожидал):

const char * connectionString = "DRIVER=ODBC Driver 17 for SQL Server;SERVER=<server>.database.windows.net;UID=<account>;PWD=<password>;Trusted_Connection=No;DATABASE=<database>;";

Затем я вставил строку выше прямо в мой код, на этот раз без запроса:

    _retcode = SQLDriverConnect(
    _hDbc,
    NULL,
    ( SQLCHAR * ) connectionString,
    strlen( connectionString ),
    NULL,
    0,
    NULL,
    SQL_DRIVER_NOPROMPT );

И это работает!

Для справки, вот ссылки на официальную документацию Microsoft:

Подключение к SQL База данных с использованием C и C ++

Функция SQLDriverConnect

Подключение к источнику данных ODB C (SQL Мастер импорта и экспорта сервера)

Windows с C ++: Использование баз данных на Windows Azure

...