C++ 用MySql C+调用MySql存储过程+;连接器
我的数据库中有下表:C++ 用MySql C+调用MySql存储过程+;连接器,c++,mysql,sql,C++,Mysql,Sql,我的数据库中有下表: CREATE TABLE Alita.Cache ( ID INT NOT NULL AUTO_INCREMENT, Created DATETIME NOT NULL, Modified DATETIME NOT NULL, ProcessState TINYINT NOT NULL, Link VARCHAR(4000)
CREATE TABLE Alita.Cache (
ID INT NOT NULL AUTO_INCREMENT,
Created DATETIME NOT NULL,
Modified DATETIME NOT NULL,
ProcessState TINYINT NOT NULL,
Link VARCHAR(4000) CHARSET utf8,
Content VARCHAR(4000) CHARSET utf8,
CONSTRAINT PK_CACHE_ID PRIMARY KEY (ID));
要在此表中添加行,我创建了以下存储过程:
DELIMITER //
DROP PROCEDURE IF EXISTS Alita.usp_AddCache //
CREATE PROCEDURE Alita.usp_AddCache (
IN _link VARCHAR(4000) CHARSET utf8,
IN _content VARCHAR(4000) CHARSET utf8,
OUT _linkId INT
)
PROC_START : BEGIN
START TRANSACTION;
SET @id := NULL;
SELECT @id := Id FROM Alita.Cache WHERE Link = _link;
SET _linkId := @id;
IF @id IS NULL THEN
INSERT INTO Alita.Cache VALUES(0, NOW(), NOW(), 0, _link, _content);
SELECT @id := Id FROM Alita.Cache WHERE Link = _link;
SET _linkId := @id;
LEAVE PROC_START;
END IF;
UPDATE Alita.Cache
SET Content = _content,
Modified = NOW(),
ProcessState = 0
WHERE Id = @id AND ProcessState = 2;
COMMIT;
END //
DELIMITER ;
现在我尝试调用MySQL C++连接器中的这个存储过程。我将所有数据库交互代码包装在一个名为alita\u db的类中。我使用了MySQL文档中的。
以下代码段是连接的初始化:
alita::alita_db::alita_db(const alita::db_connection_info& db_connection_info)
{
if(db_connection_info._host.empty())
throw std::invalid_argument("Invalid Host.");
if(db_connection_info._username.empty())
throw std::invalid_argument("Invalid Username.");
if(db_connection_info._password.empty())
throw std::invalid_argument("Invalid Password.");
if(db_connection_info._scheme.empty())
throw std::invalid_argument("Invalid Scheme.");
this->_log = db_connection_info._log;
this->driver = get_driver_instance();
this->connection = this->driver->connect(
db_connection_info._host,
db_connection_info._username,
db_connection_info._password);
this->connection->setSchema(db_connection_info._scheme);
this->connection->setAutoCommit(false);
}
初始化后,我尝试执行调用usp\u AddCache。下面是使用MySQL C++连接器API的调用片段。
std::unique_ptr<sql::Statement> stmt;
std::unique_ptr<sql::PreparedStatement> pstmt;
std::unique_ptr<sql::ResultSet> res;
stmt.reset(this->connection->createStatement());
pstmt.reset(this->connection->prepareStatement("CALL usp_AddCache(?, ?, @_linkId)"));
pstmt->setString(1, std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t>().to_bytes(link));
pstmt->setString(2, std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t>().to_bytes(content));
pstmt->execute();
std::unique_ptr stmt;
std::唯一的ptr pstmt;
std::唯一的ptr res;
重置(此->连接->createStatement());
重置(此->连接->准备状态(“调用usp_AddCache(?,@_linkId)”);
pstmt->setString(1,std::wstring_convert().to_字节(link));
pstmt->setString(2,std::wstring_convert().to_字节(内容));
pstmt->execute();
代码在没有任何异常的情况下成功执行,并且自动增量ID计数器已更改。然而,当我使用mysql CLI查询数据时,我得到一个空集。
我试图理解为什么插入实际上失败了。
我的问题是如何解决此问题。看起来您没有提交呼叫。尝试更改此->连接->设置自动提交(true);然后重新运行。@özkanpakdil我明白你说的,但是如果过程的代码已经在事务中,为什么我需要自动提交呢?但是,我按照您的建议更改了代码,但也不起作用。当我从代码中删除事务语句,并设置自动提交选项时,程序实际上开始插入一个记录。我不太了解MySQL C++连接器。但由于交易管理的原因,出现了这种问题。在我看来,它没有正确地提交。看起来你没有提交呼叫。尝试更改此->连接->设置自动提交(true);然后重新运行。@özkanpakdil我明白你说的,但是如果过程的代码已经在事务中,为什么我需要自动提交呢?但是,我按照您的建议更改了代码,但也不起作用。当我从代码中删除事务语句,并设置自动提交选项时,程序实际上开始插入一个记录。我不太了解MySQL C++连接器。但由于交易管理的原因,出现了这种问题。在我看来,这不是正确的承诺。