Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用MySql C+调用MySql存储过程+;连接器_C++_Mysql_Sql - Fatal编程技术网

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++连接器。但由于交易管理的原因,出现了这种问题。在我看来,这不是正确的承诺。