c语言 mysql_bind,linux C mysql的blob门类字段的插入和读取
linux C mysql的blob類型字段的插入和讀取。
RT,沒對mysql中的這種類型操作過,還請各位大神幫幫忙,需要一點代碼,確實有點急,網上看了一些,但是沒怎么看懂。還望指導,多謝!!
mysql
linux
c
------解決方案--------------------
要存取二進制數據。我在VB中用libmysql.dll來操作MySQL,應該說比VC來得來更復雜些。本論壇有討論,可惜現在論壇搜索功能不穩(wěn)定,搜索不到。現將收藏的內容貼出。另外,我認為可以將二進制數據進行BASE64編碼,轉成字符串來操作,問題就簡單得多了。
MySQL中的二進制數據的存取
今天看了MySQL的文檔,也看了一些網上的文章,了解到了二進制數據在MYSQL中是如何處理的,許多例子是用在圖像數據
的存取中,偏偏我要存取的不是圖像數據,不過也沒有關系,反正都是二進制數據,沒有區(qū)別.
我現在總結一下在LINUX下如何用C存取二進制數據.
如果是插入二進制數據,你能有如下的步驟:
1,定義一個緩沖區(qū)char?buf[EB]??(What?EB??Enought?Big,hehe~~~)
2,把標準的SQL語句用sprintf或strcpy之類的函數填入,直到插入二進制的地方.在下面一步插入二進制.
3,用某種方法讀取二進制數據到tmpbuf[SIZE];
??例如:要插入的是圖像文件數據,用fread(tmpbuf,?1,?sizeof(tmpbuf),?filestream),然后用
mysql_real_escape_string()函數將buf繼續(xù)填滿(注意應在第2步中填入的字串的結束字符'\0'開始填起,即不要
有'\0'),這個函數的原型為:
unsigned?long?mysql_real_escape_string(MYSQL?*mysql,?char?*to,?const?char?*from,?unsigned?long?length)
其中mysql指針是有效的,已經連接成功的句柄,換句話說mysql必須是成功執(zhí)行mysql_real_connect()函數返回的句柄.
如果你看到了mysql_escape_string這種函數,那請不要使用它,它已經快被廢除了.
4,若還有要插入的數據,繼續(xù)2,3步.
5,然后加上余下的SQL語言構成完整的SQL語言.
6,最后你可以用mysql_real_query()來執(zhí)行SQL語言了,其原型如下:
int?mysql_real_query(MYSQL?*mysql,?const?char?*query,?unsigned?long?length)
注意:有一個要點要注意,因為二進制數據包括了許多的0或\r等等之類的字符,在字符串中有可能被解釋成其他的意思,所以我們用了上面mysql_real_escape_string()函數來拷貝數據,所以我們必須有變量能記錄查詢字串buf[EB]的首尾位置,這樣我們才能知道到底查詢字串有多長,在最后把該長度傳遞給mysql_real_query函數的最后一個參數.
如果是查詢到二進制的數據,那也很容易,我就隨便說幾個要點:
1,構造查詢字串.
2,執(zhí)行mysql_real_query查詢.
3,用mysql_store_result存儲結果.
4,用mysql_fetch_row取出一條記錄處理.
如果取出來的是二進制的數據,要確定它的長度,必須要用mysql_fetch_lengths函數取得其長度.
mysql數據庫如何存儲二進制數據?linux下?C?API
用?mysql_stmt_send_long_data()來做
這里是mysql文檔的例子,它存儲的是text類型。blob類型類似
二進制文件讀取,可見
http://www.chinaunix.net/jh/23/312541.html
#define?INSERT_QUERY?"INSERT?INTO?test_long_data(text_column)?VALUES(?)"
MYSQL_BIND?bind[1];
long????length;
smtt?=?mysql_stmt_init(mysql);
if?(!stmt)
{
fprintf(stderr,?"?mysql_stmt_init(),?out?of?memory\n");
exit(0);
}
if?(mysql_stmt_prepare(stmt,?INSERT_QUERY,?strlen(INSERT_QUERY)))
{
fprintf(stderr,?"\n?mysql_stmt_prepare(),?INSERT?failed");
fprintf(stderr,?"\n?%s",?mysql_stmt_error(stmt));
exit(0);
}
memset(bind,?0,?sizeof(bind));
bind[0].buffer_type=?MYSQL_TYPE_STRING;
bind[0].length=?&
bind[0].is_null=?0;
/*?Bind?the?buffers?*/
if?(mysql_stmt_bind_param(stmt,?bind))
{
fprintf(stderr,?"\n?param?bind?failed");
fprintf(stderr,?"\n?%s",?mysql_stmt_error(stmt));
exit(0);
}
/*?Supply?data?in?chunks?to?server?*/
if?(!mysql_stmt_send_long_data(stmt,0,"MySQL",5))
{
fprintf(stderr,?"\n?send_long_data?failed");
fprintf(stderr,?"\n?%s",?mysql_stmt_error(stmt));
exit(0);
}
/*?Supply?the?next?piece?of?data?*/
if?(mysql_stmt_send_long_data(stmt,0,"?-?The?most?popular?open?source?database",40))
總結
以上是生活随笔為你收集整理的c语言 mysql_bind,linux C mysql的blob门类字段的插入和读取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ajax php 区别,PHP中AJAX
- 下一篇: php3d按钮,CSS实现3D按钮效果