SQL-Verbindung aufbauen (c++)



  • Hi,

    #define MAXBUFLEN   255
    
    SQLHENV      henv = SQL_NULL_HENV;
    SQLHDBC      hdbc1 = SQL_NULL_HDBC;
    SQLHSTMT      hstmt1 = SQL_NULL_HSTMT;
    
    SQLCHAR      ConnStrIn[MAXBUFLEN] =
             "DRIVER={SQL Server};SERVER=MyServer";
    
    SQLCHAR      ConnStrOut[MAXBUFLEN];
    SQLSMALLINT   cbConnStrOut = 0;
    
    // Make connection without data source. Ask that driver 
    // prompt if insufficient information. Driver returns
    // SQL_ERROR and application prompts user
    // for missing information. Window handle not needed for
    // SQL_DRIVER_NOPROMPT.
    retcode = SQLDriverConnect(hdbc1,      // Connection handle
                      NULL,         // Window handle
                      ConnStrIn,      // Input connect string
                      SQL_NTS,         // Null-terminated string
                      ConnStrOut,      // Address of output buffer
                      MAXBUFLEN,      // Size of output buffer
                      &cbConnStrOut,   // Address of output length
                      SQL_DRIVER_PROMPT);
    

    Das ist aus der MSDN. Für Abfragen und weiteres steht da natürlich auch alles drinn.
    Achja und im Magazin gibt es Artikel über die MFC Klassen CRecordset und CDatabase mit dennen ich auch gute Erfahrungen gemacht habe.
    MfG schirrmie



  • Was willst du verwenden?
    ADO, OLEDB, ODBC ...?



  • eigentlich wollt ich ADO verwenden^^
    wie gesagt...ich hab vorher nie ne DB-Verbindung hergestellt^^



  • also mir wurde gesagt ich soll irgendwie den native driver benutzen...
    und das die anmeldung über windows authentification läuft...
    dazu hab ich dann noch den server namen...mehr hab ich nicht >.>
    Echt absolut keine Ahnung... 😞



  • #define MAXBUFLEN   255
    
    SQLHENV		henv = SQL_NULL_HENV;
    SQLHDBC		hdbc1 = SQL_NULL_HDBC;
    SQLHSTMT	hstmt1 = SQL_NULL_HSTMT;
    SQLRETURN	retcode;
    SQLCHAR		ConnStrIn[MAXBUFLEN] ="DRIVER={SQL Native Client};SERVER=(base-server3);Trusted_Connection=yes";
    
    SQLCHAR		ConnStrOut[MAXBUFLEN];
    SQLSMALLINT	cbConnStrOut = 0;
    
    // Make connection without data source. Ask that driver
    // prompt if insufficient information. Driver returns
    // SQL_ERROR and application prompts user
    // for missing information. Window handle not needed for
    // SQL_DRIVER_NOPROMPT.
    retcode = SQLDriverConnectA(hdbc1,NULL,ConnStrIn,SQL_NTS,ConnStrOut,MAXBUFLEN,&cbConnStrOut,SQL_DRIVER_PROMPT);
    cout << retcode;
    SQLDisconnect(hdbc1);
    

    das cout gibt mir nen -2 aus...jemand ne ahnung was das zu bedeuten hat?



  • also ich brauch nen connectionstring der halt die wichtigen "daten" beinhaltet
    wir benutzen MS SQL Server 2005

    der string sieht so aus bisher
    Driver={SQL Native Client};Server=base-server3;Database=******;Trusted_Connection=yes;

    aber wie benutz ich den? 😞



  • Ich persönlich würde es über ADO machen. ADO geht dann über OLEDB und OLEDB verwendet den "native SQL driver" (oder wie der genau heisst, geht auf jeden Fall NICHT über ODBC).
    Ist für mich "direkt genug". Am Server braucht dazu nix installiert zu werden, Connection kann über Named Pipes oder TCP/IP Port 1433 laufen, Connection String sieht dann z.B. so aus (für Port 1433):

    provider=SQLOLEDB;data source=SERVERNAME;initial catalog=DATABASENAME;integrated security=SSPI;application name=Hotzenplotz;network library=dbmssocn;
    

    Ahja, am Client muss evtl. das aktuelle MDAC (Microsoft Data Access Components) installiert werden, welches bei Windows XP und Server 2003 aber schon dabei ist, muss man also üblicherweise auch nix installieren.

    p.S.: "Ich persönlich würde es über ADO machen" einfach deswegen, weil ich mit ADO schon viel gearbeitet habe, die Geschwindigkeit immer ausreichen war, und ich das Interface schön einfach finde. Natürlich spricht auch nix gegen OLEDB direkt oder sonstwas, wenn man sich damit anfreunden kann.



  • mh...und wie benutze ich diesen connectionstring dann?
    ich such hier schon stundenlang nach irgendeiner guten lösung...werd aber nich fündig 😞

    bzw....wie kann ich denn testen ob die connection funktioniert?



  • In dem code den du (und ich) gepostet hattest benutzt du doch schon ein Connectionstring. Hier noch ne seite für dich http://www.connectionstrings.com/
    Da stehen alle möglichen drinn. Was klappt denn genau nicht?

    schirrmie



  • also mir wurde gerade gesagt dass diese -2 zu bedeuten hat, dass die verbindung steht.....und ich such mich hier dumm und dämlich...

    jetzt würd ich gern testen ob ich irgendwas aus der tabelle auslesen kann...kenne aber den syntax nicht 😞



  • Wie wärs wenn du mal selbst dein Kopf anstrengst und suchst, die MSDN wurde hier schon mehrfach genannt und das nicht ohne Grund 😉

    Das ist nur Ein Bsp. aus der MSDN und hast du dir den Artikel hier im Magazin (ganz unten im Forum) mal durchgelesen?

    #define NAME_LEN 50
    #define PHONE_LEN 50
    
    SQLCHAR      szName[NAME_LEN], szPhone[PHONE_LEN];
    SQLINTEGER   sCustID, cbName, cbAge, cbBirthday;
    SQLRETURN    retcode;
    SQLHSTMT     hstmt;
    
    retcode = SQLExecDirect(hstmt,
       "SELECT CUSTID, NAME, PHONE FROM CUSTOMERS ORDER BY 2, 1, 3",
       SQL_NTS);
    
    if (retcode == SQL_SUCCESS) {
       while (TRUE) {
          retcode = SQLFetch(hstmt);
          if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
             show_error();
          }
          if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
    
             /* Get data for columns 1, 2, and 3 */
    
             SQLGetData(hstmt, 1, SQL_C_ULONG, &sCustID, 0, &cbCustID);
             SQLGetData(hstmt, 2, SQL_C_CHAR, szName, NAME_LEN, &cbName);
             SQLGetData(hstmt, 3, SQL_C_CHAR, szPhone, PHONE_LEN,
                &cbPhone);
    
             /* Print the row of data */
    
             fprintf(out, "%-5d %-*s %*s", sCustID, NAME_LEN-1, szName, 
                PHONE_LEN-1, szPhone);
          } else {
             break;
          }
       }
    }
    

    schirrmie



  • mhh...okay...danke..
    bei der msdn such ich die ganze zeit schon^^
    und auch hier im forum..
    aber hab vorher nie mit ner DB gearbeitet.

    aber irgendwie scheint der sich doch nicht verbunden zu haben....und wirklich keine ahnung wieso...kommt auf jedenfalls nen SQL_ERROR nach SQLDRIVERCONNECT raus
    zugriffsrechte auf den server hab ich...mein kollege weiß auch nicht woran das liegen kann 😞

    hab auch alle möglichen connectionsstrings ausprobiert...also in verschiedenen formen und so...
    aber das funkzt einfach nich... 😞 😞

    hier mal der sourcecode...

    int cl_event::sql_open()
    {
    
    	SQLHENV henv;
    	SQLHDBC hdbc;
    	SQLHSTMT hstmt;
    	SQLRETURN retcode;
    	SQLPOINTER rgbValue;
    	int i = 5;
    	rgbValue = &i;
    
    SQLCHAR InConnStr[255]="Driver={SQL Server};Server=BASE-1;Database=TESTDB;Trusted_Connection=yes;Network=dbnmpntw;";
    
    SQLWCHAR OutConnStr[255];
    SQLSMALLINT OutConnStrLen;
    
    // Allocate environment handle
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    
    // Set the ODBC version environment attribute
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
    
    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0); 
    
    	// Allocate connection handle
    	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
    	retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 
    
    		// Set login timeout to 5 seconds
    		if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
    		SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)(rgbValue), 0);
    
    retcode = SQLDriverConnect( // SQL_NULL_HDBC
    hdbc, 
    NULL, 
    (SQLWCHAR*)InConnStr, 
    _countof(InConnStr),
    OutConnStr,
    255, 
    &OutConnStrLen,
    SQL_DRIVER_NOPROMPT ); 
    
    		// Allocate statement handle
    		if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {              
    		retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    
    		// Process data
    		if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
    		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    
                   }
                   SQLDisconnect(hdbc);
                }
                SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
             }
          }
          SQLFreeHandle(SQL_HANDLE_ENV, henv);
    }
    
    return 0;
    }
    

Anmelden zum Antworten