如何在Linux上从C++连接并执行对SQL Server的简单查询

Jac*_*ian 8 c++ linux sql-server

我想,我有设置连接和查询SQL Server数据库的所有先决条件,因为我可以从我的Python代码中做到这一点.我这样做是这样的:

#1. Set connection using pyodbc library

db = pyodbc('DRIVER=FreeTDS;SERVER='+host+';PORT='+port+';DATABASE='+ \
            db_name+ ';UID='+ user+ ';PWD='+ pwd+ ';TDS_Version=7.0;ClientCharset=UTF8;') 

#2. List all table names in a particular database

cursor = db.cursor()
cursor.execute('SELECT TABLE_NAME FROM ' + db_name + '.INFORMATION_SCHEMA.Tables WHERE ' + \
'TABLE_TYPE=\'BASE TABLE\'')
res = cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)

而且我已经完成了.现在我想实现相同的东西,使用C++.我见过像一些示例代码,但他们气色好糟糕五个if小号嵌套一个到另一个.但是我需要一些非常简单的东西,考虑到可能满足所有先决条件(如果可能不是,请指示还应该安装什么).

我想知道的最后一件事是如何编译这个程序(我通常使用这个g++).并且,请不要发布唯一的参考FreeTDSODBC- 我已经看过它们了.在这个阶段我想要的是一个在世界查询中执行最简单的最小化的例子(就像我上面所做的那样,使用Python).

raj*_*kar 5

这不是用unixodbc的freetds驱动程序测试的.这就是我用postgres或mysql设置unixodbc的方法. https://k3ut0i.github.io/work/2015/08/09/odbc-setup-linux.html

ODBC的驱动程序和数据源的全局设置在/etc/odbc.ini/etc/odbcinst.ini.某些操作系统可能将这些文件设置为空或不同的名称.这是我的配置文件.

/etc/odbcinst.ini文件中的驱动程序,库.

    [MySQL]
    Description     = ODBC driver for mariaDB
    Driver          = /usr/lib/libmyodbc.so
    Setup           = /usr/lib/libmyodbc5S.so
    FileUsage       = 1
Run Code Online (Sandbox Code Playgroud)

python文件中的pyodbc函数等同于/etc/odbc.ini文件中的数据源.

    [mariadb-connector]
    Description     = connection to test database for mariadb
    Driver          = MySQL
    Database        = test
    Server          = 127.0.0.1
    UserName        = keutoi
    Trace           = No
    Port            = 3306
Run Code Online (Sandbox Code Playgroud)

连接和查询的部分代码.我刚从你的链接开始并清理它.

        /**
         * Connect to data source named in /etc/odbc.ini file
         */
        retcode = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)"DSN=mariadb-connector;", SQL_NTS, outstr, sizeof(outstr), &outstrlen, SQL_DRIVER_COMPLETE);
        check_error(retcode, "connect to the data source");

        //Allocate statement handle
        retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
        check_error(retcode, "allocate a statement handle");

        /**
         * statement to be executed.
         */
        retcode = SQLExecDirect (hstmt, (SQLCHAR *) "select * from mytable", SQL_NTS);
        check_error(retcode, "execute the statement");

        /**
         * Bind a column to a variable
         */
        retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, szName, NAME_LEN, &cbName);
        check_error(retcode, "bind 1 column to the statement");
        retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, szID, ID_LEN, &cbID);
        check_error(retcode, "bind 2 column to the statement");

        /**
         * fetch sql hstmt untill there is no data and print
         */
        for (int i=0 ; ; i++)
        {
            retcode = SQLFetch(hstmt);
            if(retcode == SQL_NO_DATA)break;
            else printf( "%d: %s %s %s\n", i + 1, szID, szName);
        }
Run Code Online (Sandbox Code Playgroud)

完整的例子在这里.编译g++ file.cc -lodbc