C語言與嵌入式SQL混合編程及圖像處理技術(shù)
//往表中寫入圖像信息
EXEC SQL DECLARE @@tmp_data varbinary(16)
EXEC SQL SELECT @@tmp_data = TEXTPTR(photo)
FROM teacher WHERE sno= '1001 '
EXEC SQL WRITETEXT teacher.photo @@tmp_data:*fileout
//:*fileout圖像文件轉(zhuǎn)為十六進制文件指針
……
EXEC SQL COMMIT ;
EXEC SQL DISCONNECT ALL;}
2.2 SQL Server 2005圖像存儲實現(xiàn)方法[4]
SQL Server 2005 的 OPENROWSET 函數(shù)能夠一次完成遠程數(shù)據(jù)的連接與存取??梢栽?SELECT 語句的 FROM 子句中使用 OPENROWSET 函數(shù),也可以在 INSERT、UPDATE 或 DELETE 語句中把 OPENROWSET 函數(shù)當成目標數(shù)據(jù)表來使用。值得一提的是,SQL Server 2005在OPENROWSET函數(shù)中加入了BULK數(shù)據(jù)列集, 這樣可以直接從文字文件、xml 文件以及圖像等文件中讀取數(shù)據(jù)。這就意味著可以在一條非常簡單的 INSERT INTO…SELECT 語句中使用OPENROWSET函數(shù)將內(nèi)含大量數(shù)據(jù)的文件內(nèi)容存入數(shù)據(jù)表的對應(yīng)字段(如簡歷、圖像等)中。OPENROWSET BULK選項自變量可以精確控制數(shù)據(jù)讀取的開始與結(jié)束位置、如何處理錯誤以及數(shù)據(jù)的解釋,例如將數(shù)據(jù)文件讀取成 varbinary、varchar 或 nvarchar 類型的字段的數(shù)據(jù)列集。以下是一個C語言與SQL Server 2005的嵌入式編程及圖像處理的實例,程序給出的是解決這一問題的核心部分。
Demo2.sqc
#include
#include
EXEC SQL BEGIN DECLARE SECTION;
char sno[10],sname[10];int ssex;
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;
viod imagetech ()
{ EXEC SQL CONNECT TO Server:mydb USER sa.sa;
EXEC SQL CREATE TABLE Teacher
(sno char(9), sname char(20), ssex int,
resume nvarchar(max),
//創(chuàng)建可輸入大數(shù)據(jù)塊文本的簡歷字段
photo image);
printf( input sno: ); scanf( %s,sno);
printf( input sname: ); scanf( %s,sname);
printf( input?ssex: ); scanf( %d,ssex);
EXEC SQL INSERT INTO Teacher(sno,sname,ssex,resume,
photo)
SELECT :sno, :sname, :ssex,
WSET(BULK ’C:resume1.txt’, SINGLE_NCLOB),
OPENROWSET(BULK ’C:photo1.jpg’, SINGLE_BLOB);
//一種大數(shù)據(jù)塊及圖像存儲的解決方案
EXEC SQL COMMIT TRANSACTION;
EXEC SQL DISCONNECT ALL;
}
2.3 預(yù)編譯
C語言編譯程序不能識別應(yīng)用程序中的SQL語句,需要經(jīng)過預(yù)處理程序?qū)⑵滢D(zhuǎn)換成C語句。經(jīng)過嵌入式SQL的預(yù)編譯之后,原有的嵌入式SQL會被轉(zhuǎn)換成一系列函數(shù)調(diào)用。因此,系統(tǒng)還提供一些列函數(shù)庫,以確保能夠把代碼中的函數(shù)調(diào)用與對應(yīng)的實現(xiàn)鏈接起來。SQL Server的預(yù)處理程序是nsqlprep.exe。通過在操作系統(tǒng)命令窗口運行命令cd c:program filesMicrosoft SQL ServerMSSQLBinn,進入到Binn文件夾,調(diào)用預(yù)編譯程序nsqlprep.exe程序,執(zhí)行nsqlprep Demo2,如果成功就會將Demo2.sqc文件預(yù)編譯成Demo2.c。接著運行主語言編譯程序VC++,打開Demo2.c進行編譯,VC++會提示要建立工程,點擊“是”建立工程文件。還需在工程/設(shè)置/link中的對象/庫模塊中添加SQLakw32.lib和Caw32.lib才能夠正確鏈接,最后生成目標程序和可執(zhí)行文件。
當一個程序既要訪問數(shù)據(jù)庫,又要處理數(shù)據(jù)時,把SQL語言嵌入到宿主語言中,將SQL語言訪問數(shù)據(jù)庫的功能和宿主語言的數(shù)據(jù)處理功能相結(jié)合是解決該問題的有效途徑。圖像處理作為一種信息表達手段已被人們所熟悉,在數(shù)據(jù)庫信息管理系統(tǒng)的開發(fā)中[5]需要用到圖像等數(shù)據(jù)時,將有關(guān)信息與指定的圖像對應(yīng),無疑對圖像數(shù)據(jù)處理的科研、生產(chǎn)和管理等部門有著重要的實用參考價值。因此,在嵌入式SQL中用數(shù)據(jù)庫管理系統(tǒng)的預(yù)編譯器技術(shù),無限利用高級語言通過數(shù)據(jù)庫管理系統(tǒng)的接口存取和檢索數(shù)據(jù),來提高對數(shù)據(jù)庫操作的效率提高。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)c語言相關(guān)文章:c語言教程
評論