Variablen an den Connectionstring (SQLDriverConnect) übergeben



  • Hallo Leute,

    meine Frage ist nur, wie ich Variablen übergeben kann? Mein kläglicher Versuch funktioniert nicht.

    SQLDriverConnect(hdbc, 0, (SQLCHAR*)"DRIVER=" + xxx + ";SERVER=......", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, SQL_DRIVER_COMPLETE);
    


  • 1. Das gehört nicht ins C++/CLI Forum, denn es handelt sich um C++.
    2. Hier eine Lösung, ev. hilft sie Dir weiter:

    array_util.h

    #pragma once
    #include <vector>
    
    template <typename T>
    T* c_array(std::vector<T>& v)
    {
        return v.empty() ? 0 : &v[0];
    }
    
    template <typename T>
    const T* const_c_array(const std::vector<T>& v)
    {
        return v.empty() ? 0 : &v[0];
    }
    

    sql_string_util.h

    #pragma once
    #include <sstream>
    #include <string>
    #include <vector>
    #include <windows.h>
    #include <sql.h>
    
    typedef std::basic_stringstream<SQLCHAR> sqlchar_stringstream;
    typedef std::basic_string<SQLCHAR> sqlchar_string;
    typedef std::vector<SQLCHAR> sqlchar_buffer;
    

    string_to_buffer.h

    #pragma once
    #include <string>
    #include <vector>
    #include <algorithm>
    
    template <typename T>
    std::vector<T> string_to_buffer(const std::basic_string<T>& s)
    {
        // include terminating zero.
        std::vector<T> b(s.size() + 1);
        std::copy(s.begin(), s.end(), b.begin());
        return b;
    }
    

    Demo:
    main.cpp

    #include "array_util.h"
    #include "sql_string_util.h"
    #include "string_to_buffer.h"
    
    int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
    {
        sqlchar_stringstream stream;
        stream << "DRIVER=" << "xyz" << ";SERVER=" << "127.0.0.1";
        sqlchar_string string = stream.str();
    
        sqlchar_buffer buffer = string_to_buffer(string);
    
        SQLCHAR* connection_string = c_array(buffer);
        connection_string;
    }
    

    Eigentlich könnte auf der Variable string (vom Typ sqlchar_string) die Memberfunktion c_str() aufgerufen werden um einen 0 terminierter String zu erhalten. Leider ist in der API Funktion (SQLDriverConnect) ein non-const String gefordert, desshalb ist der Buffer nötig. Der ist nämlich beschreibbar.

    Simon


Anmelden zum Antworten