C++ SQLExecDirect INSERT 不起作用

标签 c++ sql sql-server odbc sql-insert

我写了一个简单的 SQL C++ Wrapper-Class,我遇到了一个真正奇怪的问题。当我使用 SQLExecDirect 调用 INSERT-Command 时,数据不会出现在 SQL 数据库 (SQL Server 2012) 中,尽管 SQLRowCount 返回一行。我要写入的表名为“Person”,有四列(ID(AUTOINCREMENT)、Firstname(nvarchar(100))、Lastname(nvarchar(100))、Birthday(date))

这是我的代码:

类构造函数(EnvHandle、DBCHandle 和 StmtHandle 是类成员)

    SQLDatabase::SQLDatabase()
{
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvHandle);

    SQLSetEnvAttr(EnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);

    SQLAllocHandle(SQL_HANDLE_DBC, EnvHandle, &DBCHandle);

    SQLSetConnectAttr(DBCHandle, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER);
}

查询成员函数

    int SQLDatabase::ExecuteNonQuery(std::wstring Command)
{
    SQLRETURN RetCode = -1;
    SQLINTEGER RowCount = 0;

    SQLAllocHandle(SQL_HANDLE_STMT, DBCHandle, &StmtHandle);

    RetCode = SQLExecDirect(StmtHandle, (SQLWCHAR*)Command.c_str(), Command.length());
    if (RetCode == SQL_SUCCESS || RetCode == SQL_SUCCESS_WITH_INFO)
    {
        SQLRowCount(StmtHandle, &RowCount);
        SQLFreeHandle(SQL_HANDLE_STMT, StmtHandle);
        return RowCount;
    }
    else
    {
        SQLFreeHandle(SQL_HANDLE_STMT, StmtHandle);
        return -1;
    }

}

main.cpp 中的函数调用

        wcout << "Firstname:\n>";
    wcin >> Firstname;
    wcout << "Lastname:\n>";
    wcin >> Lastname;
    wcout << "Birthday:\n>";
    wcin >> Birthday;

    InsRows = database.ExecuteNonQuery(L"INSERT INTO Person (Firstname,Lastname,Birthday) VALUES ('" + Firstname + L"','" + Lastname + L"','" + Birthday + L"')");
    if (InsRows == -1)
        database.Error();
    else
        std::wcout << InsRows << " rows affected!" << std::endl;

如前所述,“database.ExecuteNonQuery”返回一行。

在 SQL Management Studio 中查看表时,数据行尚未添加。我已经在表中跟踪了查询。查询正确显示在跟踪日志中,没有任何附加信息。我的 IDE 是 Visual Studio 2013。

关于如何将数据放入表中的任何想法?

谢谢!

塞巴斯蒂安

最佳答案

一般来说,每当执行更改表的查询(无错误)且结果未显示时,这意味着更改未提交。

看看你的代码,你有这个:

SQLSetConnectAttr(DBCHandle, SQL_ATTR_AUTOCOMMIT, 
                  (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER);}

您将连接属性设置为关闭自动提交。指定您想要自动提交,或发出对 SQLEndTran 的调用以提交更改。

关于C++ SQLExecDirect INSERT 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25612724/

相关文章:

c++ - 将 return 替换为标准输入的选项卡

sql - 获取每月第二个星期二的日期

sql-server - SQL Server 链接服务器到 Microsoft Access

c# - 由于引用 .net 程序集,无法创建程序集

c# - C# 中的 SQL 表/ View 设计器

c++ - 使用 opencv 显示视频

c++ - 恒定大小字符串的高效 HashMap

c++ - 使用 asio boost 线程池 : Threads randomly don't execute

sql - 如何连接两个 select count 语句

mysql - 如何在 SQL 中舍入一个值?