C++;SQLExecDirect插入不';行不通 我编写了一个简单的SQL C++包装器类,在那里遇到了一个真正奇怪的问题。使用SQLExecDirect调用INSERT命令时,数据不会显示在SQL数据库(SQL Server 2012)中,尽管SQLRowCount返回一行。我试图写入的表名为“Person”,有四列(ID(AUTOINCREMENT)、Firstname(nvarchar(100))、Lastname(nvarchar(100))、生日(date))
这是我的密码: 类构造函数(EnvHandle、DBCHandle和StmtHandle是类成员) 查询成员函数C++;SQLExecDirect插入不';行不通 我编写了一个简单的SQL C++包装器类,在那里遇到了一个真正奇怪的问题。使用SQLExecDirect调用INSERT命令时,数据不会显示在SQL数据库(SQL Server 2012)中,尽管SQLRowCount返回一行。我试图写入的表名为“Person”,有四列(ID(AUTOINCREMENT)、Firstname(nvarchar(100))、Lastname(nvarchar(100))、生日(date)),c++,sql,sql-server,odbc,sql-insert,C++,Sql,Sql Server,Odbc,Sql Insert,这是我的密码: 类构造函数(EnvHandle、DBCHandle和StmtHandle是类成员) 查询成员函数 int SQLDatabase::ExecuteNonQuery(std::wstring Command) { SQLRETURN RetCode = -1; SQLINTEGER RowCount = 0; SQLAllocHandle(SQL_HANDLE_STMT, DBCHandle, &StmtHandle); RetC
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;
wcout>Firstname;
wcout>Lastname;
wcout>生日;
InsRows=database.ExecuteNonQuery(L“插入到个人(名字、姓氏、生日)值中(“+Firstname+L”、“+Lastname+L”、“+birth+L”);
如果(InsRows==-1)
数据库错误();
其他的
std::wcout您使用的是SQL\u AUTOCOMMIT\u OFF
,这意味着您的语句不会自动提交,因此您的新记录仅在事务中可见,永远不会在数据库中提交。尝试使用MS SQL Server的自动提交功能(将SQL\u ATTR\u AUTOCOMMIT
设置为SQL\u AUTOCOMMIT\u ON
,或者由于这是默认行为,所以不通知它),或者显式开始并提交事务
通常,每当执行更改表(无错误)的查询时,结果不显示,这意味着更改未提交
查看您的代码,您有:
SQLSetConnectAttr(DBCHandle, SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER);}
将“连接”属性设置为禁用“自动提交”。指定要启用自动提交,或者调用SQLEndTran
提交更改。您是否提交了更改?非常感谢!多么简单的解决方案啊。现在很好用!
SQLSetConnectAttr(DBCHandle, SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_INTEGER);}