2015-07-22 49 views
1

首先,感谢您阅读这个问题,并为我可怜的英语道歉。MariaDB,在C++程序中执行存储过程时出现语法错误

我现在正在将我的数据库从SQL-Server转换为MariaDB。我安装了MySQL ODBC驱动程序并添加了“系统DSN”。 (C:\ Windows \ SysWOW64 \ odbcad32.exe)

执行存储过程时发生此问题。

当我在SQLyog创建一个过程时,没有错误,执行也很好。但是当我在我的C++应用程序中执行存储过程时会出现语法错误。

数据库[MySQL的] [ODBC 5.3(w)的驱动程序]的[mysqld-5.5.5-10.0.20-MariaDB的]您 有一个错误的SQL语法;检查与您的MariaDB服务器版本 相对应的手册,以获得在 'get_bookProperty?'附近使用的正确语法。在1号线

我的C++代码是...

bool LoadbookProperty::OnExecute(db::IDbProcesser* dbProcesser) 
{ 
    const char* bookName = m_bookName.c_str(); 

    dbProcesser->BindParams(bookName); 
    if (!dbProcesser->Execute("get_bookProperty")) 
     return false; 
    char type[PROPERTY_NAME_LEN]; 
    char value[PROPERTY_VALUE_LEN]; 
    dbProcesser->BindCols(type, value); 
    dbProcesser->FetchWith([this, &type, &value]() 
    { 
     m_properties.push_back(std::make_pair(type, value)); 
    }); 
    return true; 
} 

我的程序是...

USE bookInfoDB; 

-- GetbookProperty 

DELIMITER ;; 

CREATE PROCEDURE get_bookProperty (
    IN pi_bookName VARCHAR(32) 
) 
this_proc:BEGIN 

    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN 
     ROLLBACK; 
    END; 

    SELECT bookName, bookPrice FROM bookProperty WHERE bookName = pi_bookName; 

END ;; 

DELIMITER ; 

我真的不知道发生什么事了。请帮帮我。

+0

你尝试过'调用get_bookProperty'吗? –

+0

我试过在SQLyog和mysql控制台中调用get_bookProperty。两者都运行良好。你的意思是......改变我的cpp代码?执行调用? – passion053

回答

0

解决了!原因是执行功能。当我的团队使用SQL Server时,EXECUTION函数的字符串组合是EXEC,没有括号。 (大家都知道,SQL Server执行程序'EXEC sp_name arg1 arg2 ...')

但是MySQL(以及MariaDB)的程序执行语法是'CALL sp_name(arg1,arg2 ...) 。我们的程序员已经改变了EXECTION函数的字符串组合。和?它完美的工作!