невозможно подключиться к базе данных Microsoft Azure через odbc

Мой odbc использует следующий код (отсюда: http://www.dreamincode.net/forums/topic/127959-odbc-c-example/):

odbc.cpp:

ODBC_Class::ODBC_Class()
{
ODBC_Class Example;
// Initialize The Return Code Variable
rc = SQL_SUCCESS;
// Allocate An Environment Handle
rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvHandle);
// Set The ODBC Application Version To 3.x
if (rc == SQL_SUCCESS)
rc = SQLSetEnvAttr(EnvHandle, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER)SQL_OV_ODBC3, SQL_IS_UINTEGER);
// Allocate A Connection Handle
if (rc == SQL_SUCCESS)
rc = SQLAllocHandle(SQL_HANDLE_DBC, EnvHandle, &ConHandle);
}

// Define The Class Destructor
ODBC_Class::~ODBC_Class()
{
// Free The Connection Handle
if (ConHandle != NULL)
SQLFreeHandle(SQL_HANDLE_DBC, ConHandle);
// Free The Environment Handle
if (EnvHandle != NULL)
SQLFreeHandle(SQL_HANDLE_ENV, EnvHandle);
}

// Get the data for one column and return the info in the form
// of a std::string.  The ODBC driver will make all necessary
// data conversions from whatever type the data is in the database
// to SQL_CHAR.  You could make this function more comples by
// getting the return type as it appears in the database then constructing
// a VARIANT object to hold the data.
SQLRETURN ODBC_Class::GetColData(int colnum, string& str)
{
SQLCHAR buf[255] = { 0 };
if ((rc = SQLGetData(StmtHandle, colnum, SQL_CHAR, buf, sizeof(buf), NULL)) == SQL_SUCCESS)
str = reinterpret_cast<char*>(buf);
return rc;
}

//
// Define The ShowResults() Member Function
SQLRETURN ODBC_Class::GetResultset()
{
// Get all column description
DescribeColumns();
// erase anything that's in the colData vector
colData.clear();
// fetch a row from the resultset
while (SQLFetch(StmtHandle) == SQL_SUCCESS)
{
// vector of strings to hold the column data
vector<string> col;
string data;
// column counter
int i = 1;
// get the data for each column and add it to
// the col vector
while (GetColData(i, data) == SQL_SUCCESS)
{
col.push_back(data);
++i; // increment the column number
}
// add column data to the colData vector
colData.push_back(col);
}
return SQL_SUCCESS;
}

// Get the description for one column in the resultset.
// This was made a seprate function to simplify the coding
SQLRETURN  ODBC_Class::Describe(ColDescription& c)
{
return SQLDescribeCol(StmtHandle, c.colNumber,
c.colName, sizeof(c.colName), &c.nameLen,
&c.dataType, &c.colSize, &c.decimalDigits, &c.nullable);
}

// Get the description for all the columns in the resultset.
void ODBC_Class::DescribeColumns()
{
ColDescription c;
c.colNumber = 1;
cols.clear();
while (Describe(c) == SQL_SUCCESS)
{
cols.push_back(c);
++c.colNumber;
}

}

В моем основном файле я выполняю его с этим кодом (это опять тот же пример кода с сайта выше)

void Game::sqlConnection(const char *select) {

SQLCHAR DBName[] = "Driver=SQL Server Native Client 11.0;Server=tcp:myserver.ctp.database.windows.net;Database=PandemicMain;Uid=concordia;Pwd=University4;";
SQLCHAR SQLStmt[255] = { 0 };

SQLRETURN rc = SQL_SUCCESS;

if (Example.ConHandle != NULL)

{

rc = SQLConnect(Example.ConHandle, DBName, SQL_NTS, (SQLCHAR *) "", SQL_NTS, (SQLCHAR *) "", SQL_NTS);

// Allocate An SQL Statement Handle

rc = SQLAllocHandle(SQL_HANDLE_STMT, Example.ConHandle,  &Example.StmtHandle);

rc = SQLExecDirect(Example.StmtHandle, SQLStmt, SQL_NTS);

if (rc == SQL_SUCCESS)

{

// Define A SELECT SQL Statement

strcpy((char *)SQLStmt,  select);

// Prepare And Execute The SQL Statement

rc = SQLExecDirect(Example.StmtHandle, SQLStmt, SQL_NTS);

// Display The Results Of The SQL Query
if (!rc == SQL_SUCCESS) {
cout << "*************************** failed ***************"<< endl;
}
if (rc == SQL_SUCCESS)

{

Example.GetResultset();// At this point you would want to do something

// with the resultset, such as display it.

}

}

// Free The SQL Statement Handle

if (Example.StmtHandle != NULL)

SQLFreeHandle(SQL_HANDLE_STMT, Example.StmtHandle);

// Disconnect From The Northwind Sample Database
rc = SQLDisconnect(Example.ConHandle);

}}

Я знаю, что есть этот сайт: https://msdn.microsoft.com/en-us/magazine/dn630643.aspx но мне было интересно, если это было возможно сделать с этим кодом. Я смог подключиться к своей локальной БД, но мне нужно, чтобы мои товарищи по команде могли запускать код из их дома, поэтому я разместил свой db на Azure.

При запуске приведенного выше кода со строкой, как указано, я получаю SQLRETURN «-2» из SqlConnect (). (происходит только с лазурной БД, поэтому я предполагаю, что не подключаюсь к ней правильно)

Любое понимание того, как заставить этот код работать или это бесполезно?

Спасибо

1

Решение

Также имейте в виду, что Azure SQL имеет межсетевой экран на основе IP-адреса, который потребует от вас внесения в белый список домашних маршрутизаторов вашей команды (которые, вероятно, будут меняться не часто):

https://docs.microsoft.com/en-us/azure/sql-database/sql-database-firewall-configure

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]