【问题标题】:Poco C++ with MS SQL using ODBCPoco C++ 与 MS SQL 使用 ODBC
【发布时间】:2016-04-13 04:01:28
【问题描述】:

我正在尝试通过 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

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

【问题讨论】:

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


    【解决方案1】:

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

    #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并点击Finish 5.在下一个窗口 - 给一个名字。这是 DSN - 给出描述 - 单击与服务器关联的下拉菜单 - 等待几秒钟 - 您的计算机或网络上的数据库将显示 - 选择要连接的数据库服务器。 - 点击下一步 6.在下一个窗口 - 使用 SQL Server 身份验证选择 - 输入该数据库的登录 ID(用户名)和密码 - 点击下一步 7.在下一个窗口中 - 选择“将默认数据库更改为:”要连接的数据库。 - 点击下一步 8. 在下一个窗口中,您无需更改任何内容,只需单击完成。 9. 出现一个新窗口,其中包含您的所有 DSN 信息。 10. 要测试 DSN 连接,请单击“测试数据源...” - 如果一切正常,会出现一个新窗口“测试成功完成!” - 单击确定退出结果窗口。 11. 再次单击确定完成设置。 12. 在用户数据源下的主窗口中,您将看到新创建的 DSN。 13. 点击确定退出。

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

    【讨论】:

      猜你喜欢
      • 2014-02-04
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多