2017-04-02 2 views
1

Mein odbc verwendet den folgenden Code (von hier: http://www.dreamincode.net/forums/topic/127959-odbc-c-example/):kann nicht auf Microsoft Azure-Datenbank über ODBC verbinden

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; 
} 

} 

In meiner Haupt-Datei, die ich mit diesem Code ausführen (es ist wieder das gleiche Codebeispiel von der Website oben)

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); 

    } 



} 

ich weiß, es ist diese Seite: https://msdn.microsoft.com/en-us/magazine/dn630643.aspx aber ich frage mich, ob es möglich war, es mit diesem Code zu tun . Ich konnte mich mit meiner lokalen DB verbinden, aber ich brauche meine Teamkollegen, um den Code von ihrem Haus aus ausführen zu können, so dass ich meine db auf azure gehostet habe.

Wenn ich den obigen Code mit der Zeichenfolge wie angegeben ausführen, endet ich mit einem "-2" SQLRETURN von der SqlConnect(). (kommt nur mit der azure db vor, also nehme ich an, dass ich nicht richtig damit verbinde)

Irgendwelche Einblicke, wie man diesen Code laufen lässt oder ist es zwecklos?

Danke

+0

Wenn jemand das obige Tutorial benutzt und neu bei cpp ist (wie ich) und versucht zu verstehen, warum, nimmt SQLConnect einen Benutzernamen und ein Passwort. Ich hätte tiefer suchen sollen. – Pepe

Antwort

Verwandte Themen