2015-07-22 47 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函數的字符串組合。和?它完美的工作!