Poco C ++与MS SQL使用ODBC

时间:2016-04-13 04:01:29

标签: c++ sql-server odbc poco-libraries

我正在尝试通过ODBC使用Poco C ++连接到Microsoft SQL Server数据库。我试图找到例子,但没有遇到任何例子。

我只是尝试使用以下代码连接到我的数据库

#include <iostream>
#include <string>
#include "Poco/Data/Session.h"

using namespace std;
using namespace Poco::Data;


int main()
{
    cout << "Testing Poco C++ with MS SQL Server" << endl;
    const string CONNECTION_STRING("DRIVER={SQL Server};Server=DESKTOP-32BKOVJ\\SQLEXPRESS;Database=Test2;User ID=sa;Password=IaSS1982;Trusted_Connection=yes;");
    Session session("ODBC", CONNECTION_STRING);
    return 0;
}

每次运行此代码时,都会出现以下断言失败: 断言违规:_connectors.end()!= it [在文件“src \ SessionFactory.cpp”,第70行]

如何使用Poco C ++和ODBC创建与MS SQL数据库的简单连接,然后在控制台上打印一些记录?

在尝试编写此代码时,我指的是文章Poco ODBC and while SQL loop

任何帮助将不胜感激。 谢谢

1 个答案:

答案 0 :(得分:0)

我可以使用Poco C ++库连接到我的Microsoft SQL Server 2014数据库。一旦安装了ODBC驱动程序,它们是Windows SDK的一部分,以下代码应该执行所有基本操作,例如 - 创建 - 阅读 - 更新 - 删除

#include <iostream>
#include <string>
#include <sstream>
#include "Poco/Data/RecordSet.h"
#include "Poco/Data/Session.h"
#include "Poco/Data/ODBC/Connector.h"

using namespace std;
using namespace Poco::Data;

bool AddUser(Session& session, const size_t& USER_ID, const string& FIRST_NAME, const string& LAST_NAME);   // [C]reate
void PrintUsers(Session& session);                                                                          // [R]etrieve
bool UpdateLastName(Session& session, const string& FIRST_NAME, const string& NEW_LAST_NAME);               // [U]pdate
bool DeleteUser(Session& session, const size_t& USER_ID);                                                   // [D]elete

int main()
{
    try
    {
        cout << "Testing Poco C++ with MS SQL Server" << endl;
        Poco::Data::ODBC::Connector::registerConnector();
        const string CONNECTION_STRING("DRIVER={SQL Server};Server=DESKTOP-32BKOVJ\\SQLEXPRESS;Database=Test2;User ID=sa;Password=abc");
        //const string CONNECTION_STRING("DSN=PocoMsSQLTest;Uid=sa;Pwd=abc");
       Session session("ODBC", CONNECTION_STRING);
       if (session.isConnected())
       {
            PrintUsers(session);
            cout << "\n" << endl;

            AddUser(session, 5, "Loki", "Moki");
            PrintUsers(session);
            cout << "\n" << endl;

            UpdateLastName(session, "Loki", "Poki");
            PrintUsers(session);
            cout << "\n" << endl;

            DeleteUser(session, 5);
            PrintUsers(session);
            cout << "\n" << endl;


        }
        else
        {
            cerr << "Session not able to connect" << endl;
        }
    }
    catch (const exception& e)
    {
        cerr << "Exception: " << e.what() << endl;
    }
    ////////////////////////////////////////////////////////
    Poco::Data::ODBC::Connector::unregisterConnector();
    return 0;
 }

// Create 
bool AddUser(Session& session, const size_t& USER_ID, const string& FIRST_NAME, const string& LAST_NAME)
{
    Statement select(session);
    stringstream ss;
    ss << "INSERT INTO Users (UserID, FirstName, LastName) VALUES (";
    ss << USER_ID << ", " << "\'" << FIRST_NAME << "\'" << ", " << "\'" << LAST_NAME << "\')";
    const string& SQL = ss.str();
    select << SQL;
    return select.execute();
}


// Retrieve
void PrintUsers(Session& session)
{
    Statement select(session);
    select << "SELECT * FROM Users";
    select.execute();
    RecordSet rs(select);
    bool more = rs.moveFirst();

    if (more)
    {
        cout << rs.columnName(0) << "\t" << rs.columnName(1) << "\t" << rs.columnName(2) << endl;
    }

    while (more)
    {
        cout << rs[0].convert<string>() << "\t" << rs[1].convert<string>() << "\t\t" << rs[2].convert<string>() << endl;
        more = rs.moveNext();
    }

}

// Update
bool UpdateLastName(Session& session, const string& FIRST_NAME, const string& NEW_LAST_NAME)
{
    Statement select(session);
    stringstream ss;
    ss << "UPDATE Users SET LastName=" << "\'" << NEW_LAST_NAME << "\'" << " WHERE FirstName=" << "\'" << FIRST_NAME << "\'";
    const string& SQL = ss.str();
    select << SQL;
    return select.execute();
}


// Delete 
bool DeleteUser(Session& session, const size_t& USER_ID)
{
    Statement select(session);
    stringstream ss;
    ss << "DELETE FROM Users WHERE UserID = " << USER_ID;
const string& SQL = ss.str();
    select << SQL;
    return select.execute();
}

我正在使用的CONNECTION_STRING直接使用ODBC驱动程序连接到数据库。如果要使用DSN连接到数据库,请注释此CONNECTION_STRING并取消注释下面的那个。

我对DSN以及如何在Windows 10中创建它做了一些研究。我的发现如下。

什么是DSN? 见https://en.wikipedia.org/wiki/Data_source_name

创建ODBC数据源名称(DSN) 1. Windows 10搜索ODBC 2.单击“设置ODBC数据源(32位)” 3.在“用户DSN”选项卡下,单击“添加” 将启动“创建新数据源”向导。 4.选择SQL Server,然后单击“完成” 5.在下一个窗口中     - 给一个名字。这是DSN     - 给出描述     - 单击与服务器关联的下拉列表          - 等几秒钟          - 将显示您的计算机或网络上的数据库          - 选择要连接的数据库服务器。         - 点击下一步 6.在下一个窗口中      - 选择SQL Server身份验证      - 输入该数据库的登录ID(用户名)和密码     - 点击下一步 7.在下一个窗口中      - 选择“将默认数据库更改为:”要连接的数据库。     - 点击下一步 8.在下一个窗口中,您无需更改任何内容,只需单击“完成”即可。 9.将出现一个新窗口,其中包含您的所有DSN信息。 10.要测试DSN连接,请单击“测试数据源...”      - 如果一切正常,将出现一个新窗口“TESTSREPLEDED SULCUSSFULLY!”      - 单击“确定”退出结果窗口。 11.再次单击“确定”完成设置。 12.在用户数据源下的主窗口中,您将看到新创建的DSN。 13.单击“确定”退出。

来源:https://www.youtube.com/watch?v=ehVFtmhPwxs