對Mysql的C API呼叫的問題及解決方法分析

2021-04-19 10:13:10 字數 1260 閱讀 2555

最近總是出現一些讓人難以理解的問題,在尋找解決方法未果的情況下,只能考慮一些其它的解決方法。

mysql提供了兩種api介面,query和prepare statement。這兩種在儲存過程中也存在。下面列舉幾種不同的呼叫方法, sp表示呼叫儲存過程, 並在儲存過程中使用相關呼叫方法。

c api - sql

1. query - query

2. query - query(sp)

3. query - stmt(sp)

4. stmt - query

5. stmt - query(sp)

6. stmt - stmt(sp)

上面共有六種不同的方式, 大家可以猜一下哪些可以正常呼叫, 而不會發生問題。

實際上,只有1和4最容易使用而不會發生問題。這是最簡單常用的呼叫方式,不論在ado,還是在其它任何型別的資料庫查詢中。即使這樣,query和stmt還是有區別的。query可以執行多條語句並返回多個集合,stmt只能執行單條,返回單個集合,但是支援(?)繫結引數。同時,使用query執行多條語句和使用stmt時, 在建立連線的時候要開始client_multi_statements選項,以支援多條語句。所以現在query又可以把呼叫方法分成兩部分,執行單條和多條。

我在使用query的時候,並沒有想到它也會出問題。感覺把語句傳進去執行,返回值就可以了。在使用2,3方式的時候,出現了個比較鬱悶的事。當我第一次呼叫時,所有值正常返回,可是在第二次呼叫時,所有的函式返回失敗,連stmt也不能用了。這時只能重新建立連線。試了很多方法都不行,全部轉成stmt也不行,因為它也有更難解決的問題。就是因為stmt的幾個問題解決不了,我才使用了query來彌補,在5,6中將討論這些問題。

在查了很多資料後,有人提出在呼叫儲存過程時有除返回的集合外的其它的資料返回。在這裡要說明一點,mysql的介面,有些必須要按它的順序來呼叫,否則就會發生上面這種情況,必須重連才能恢復。即然有多餘的資料,我就試著用mysql_next_result去取它的下乙個集合,然後再儲存,再釋放。結論是,返回的不只有乙個集合,而且多了的集合並沒有取到資料。然後再執行兩次sp,結果成功。

另外,stmt的無返回集合的呼叫可以正常使用。我們可以通上面的分析,綜合使用這幾種方式。

對於引數,我們可以用stmt設定變數(etc:set p1=?;),然後在query中引用這個變數執行sql語句。如果傳入的都是整型的資料,那就不用那麼麻煩了,直接動態構造sql用query執行就好了。對於無返回值的呼叫,推薦用stmt,因為它支援引數繫結,再就是它的執行速度可能會快一些。不過,具體快多少,還要大家測試過後,再決定是否使用。

對Mysql的C API呼叫的問題及解決方法分析

最近總是出現一些讓人難以理解的問題,在尋找解決方法未果的情況下,只能考慮一些其它的解決方法。mysql提供了兩種api介面,query和prepare statement。這兩種在儲存過程中也存在。下面列舉幾種不同的呼叫方法,sp表示呼叫儲存過程,並在儲存過程中使用相關呼叫方法。c api sql ...

利用mysql的C API來操作mysql資料庫

要使用mysql的c api來運算元據庫,則在安裝資料庫的時候必須選擇安裝其開發元件,主要是一些標頭檔案和庫檔案的安裝,在程式設計的時候需要使用這些庫。在程式開發的時候,需要包含標頭檔案資料夾include,以及庫資料夾lib debug,在外部庫依賴中填寫libmysql.lib,另外,由於需要使...

C API 傳位址的例子

return type bool int param0 hwnd hwnd param1 lparam long ptr int system.runtime.interopservices.unmanagedfunctionpointerattribute system.runtime.inter...