我写了一个简单的 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/