2011-12-27 49 views
1

使用Visual Studio,Windows 7和mysql.h庫。如何發送C++和mysql動態mysql查詢

我想要做的就是發送一條MySQL查詢像這樣:

mysql_query(conn, "SELECT pass FROM users WHERE name='Leo Tolstoy'"); 

我不能讓工作在發送一個查詢在那裏,因爲它的上面顯示的名字是不是一個恆定的唯一的事,而是從文本字段或其他任何內容中獲取的變量。那麼我應該如何使用變量而不是常量?

希望我明確提出了我的問題。

+0

在什麼語言? – 2011-12-27 21:27:02

+1

正如標題所說的C++ :) – 2011-12-27 21:47:19

回答

0

這裏有一個例子:

#include <sstream> 
#include <string> 
#include <iostream> 
using namespace std; 

/// ... 

string name_value = "Leo Tolstoy"; 

ostringstream strstr; 
strstr << "SELECT pass FROM users WHERE name='" << name_value << "'"; 

string str = strstr.str(); 
mysql_query(conn, str.c_str()); 
+0

它必須是война或мир:) – 2011-12-27 21:39:34

+0

我錯過了什麼嗎?我喜歡你在這裏顯示,但我得到以下2錯誤: 錯誤C2065:'str':未聲明的標識符 錯誤C2228:'.str'的左側必須有類/結構/聯合 我應該使用類或什麼? – 2011-12-27 21:49:36

+0

對不起,我更正了 – marcinj 2011-12-27 21:51:22

0

難道你不只是建立查詢字符串,使用sprint或連接字符串或其他,以便它到達MySQL時,MySQL只看到SQL,並不知道常量來自哪裏?或者我錯過了什麼?

+0

你的意思是這樣的? string querry =「SELECT id,password FROM users WHERE name ='text i want to add'」; mysql_query(conn,querry); 在此之後我獲得以下錯誤: 錯誤C2664: '的mysql_query':無法從 '的std :: string' 到 '爲const char *' – 2011-12-27 21:53:53

+0

'的mysql_query(康涅狄格州,querry.c_str())轉換參數2;' – 2016-08-24 08:07:29

9

使用事先準備好的聲明,它可以讓你參數值,類似的功能如何讓你參數變量語句塊。如果使用MySQL Connector/C++

// use std::unique_ptr, boost::shared_ptr, or whatever is most appropriate for RAII 
// Connector/C++ requires boost, so 
std::unique_ptr<sql::Connection> db; 
std::unique_ptr<sql::PreparedStatement> getPassword 
std::unique_ptr<sql::ResultSet> result; 
std::string name = "Nikolai Gogol"; 
std::string password; 

... 

getPassword = db->prepareStatement("SELECT pass FROM users WHERE name=? LIMIT 1"); 

getPassword->setString(1, name); 
result = getPassword->execute(); 
if (result->first()) { 
    password = result->getString("pass"); 
} else { 
    // no result 
    ... 
} 

// smart pointers will handle deleting the sql::* instances 

創建類來處理數據庫訪問和包裝,在一個方法,應用程序的其餘部分甚至不需要知道正在使用的數據庫。

如果你真的想使用舊的C API出於某種原因:

MYSQL *mysql; 
... 

const my_bool yes=1, no=0; 
const char* getPassStmt = "SELECT password FROM users WHERE username=? LIMIT 1"; 
MYSQL_STMT *getPassword; 
MYSQL_BIND getPassParams; 
MYSQL_BIND result; 

std::string name = "Nikolai Gogol"; 
std::string password; 

if (! (getPassword = mysql_stmt_init(mysql))) { 
    // error: couldn't allocate space for statement 
    ... 
} 
if (mysql_stmt_prepare(getPassword, getPassStmt, strlen(getPassStmt))) { 
    /* error preparing statement; handle error and 
     return early or throw an exception. RAII would make 
     this easier. 
    */ 
    ... 
} else { 
    unsigned long nameLength = name.size(); 
    memset(&getPassParams, 0, sizeof(getPassParams)); 
    getPassParams.buffer_type = MYSQL_TYPE_STRING; 
    getPassParams.buffer = (char*) name.c_str(); 
    getPassParams.length = &nameLength; 

    if (mysql_stmt_bind_param(getPassword, &getPassParams)) { 
     /* error binding param */ 
     ... 
    } else if (mysql_stmt_execute(getPassword)) { 
     /* error executing query */ 
     ... 
    } else { 
     // for mysql_stmt_num_rows() 
     mysql_stmt_store_result(getPassword); 
     if (mysql_stmt_num_rows(getPassword)) { 
      unsigned long passwordLength=0; 
      memset(&result, 0, sizeof(result)); 
      result.length = &passwordLength; 
      mysql_stmt_bind_result(getPassword, &result); 

      mysql_stmt_fetch(getPassword); 
      if (passwordLength > 0) { 
       result.buffer = new char[passwordLength+1]; 
       memset(result.buffer, 0, passwordLength+1); 
       result.buffer_length = passwordLength+1; 
       if (mysql_stmt_fetch_column(getPassword, &result, 0, 0)) { 
        ... 
       } else { 
        password = static_cast<const char*>(result.buffer); 
       } 
      } 
     } else { 
      // no result 
      cerr << "No user '" << name << "' found." << endl; 
     } 
    } 
    mysql_stmt_free_result(getPassword); 
} 
mysql_stmt_close(getPassword); 

mysql_close(mysql); 

正如你看到的,連接器/ C++更簡單。它也不太容易出錯;我可能使用C API比Connector/C++犯了更多的錯誤。

參見:

+0

sql :: PreparedStatement * prep_stmt = con> prepareStatement(「INSERT INTO test(id,label)VALUES(?,?)」); – user60627 2017-02-06 08:35:16