www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]C語言與嵌入式SQL混合編程及圖像處理技術(shù)

SQL Server是現(xiàn)階段應(yīng)用程序最普遍采用的數(shù)據(jù)庫技術(shù),在數(shù)據(jù)庫中對(duì)圖像、視頻和聲音等數(shù)據(jù)的存取需要越來越頻繁。普通數(shù)據(jù)可直接在用戶定義的字段上存取,而這類被稱為二進(jìn)制大對(duì)象(Binary Large Object)的大數(shù)據(jù)塊由于其數(shù)據(jù)量太大,不是作為數(shù)據(jù)記錄的一部分被存儲(chǔ)在數(shù)據(jù)記錄頁中,而是存儲(chǔ)在其所屬的一組專用頁中,數(shù)據(jù)表的對(duì)應(yīng)字段中僅是一個(gè)十六進(jìn)制的指針,該指針指向存放該記錄的頁面。由于SQL語言是一種面向集合運(yùn)算的描述語言,其本身不具有過程性結(jié)構(gòu),使用SQL Server中的Image類型字段存放圖像文件時(shí),Image類型字段是只存儲(chǔ)位串,SQL Server不對(duì)它進(jìn)行編譯,而是由應(yīng)用程序完成解釋。又因Image類型的字段內(nèi)容在SQL Server 2000中不能使用INSERT和UPDATA等語句進(jìn)行插入和更新,所以需編寫專門的過程來處理圖像字段。盡管在SQL Server 2005可以使用有關(guān)的函數(shù)解決這一問題,但由于實(shí)際的應(yīng)用系統(tǒng)是非常復(fù)雜的,數(shù)據(jù)庫訪問只是其中一個(gè)部分,有些用戶交互、圖形化輸入輸出數(shù)據(jù)只能用高級(jí)語言實(shí)現(xiàn)。利用高級(jí)語言的過程性結(jié)構(gòu)來彌補(bǔ)SQL語言實(shí)現(xiàn)復(fù)雜應(yīng)用方面的不足, 將SQL語言嵌入到C語言嵌入式編程將有廣泛的應(yīng)用前景。

1 嵌入式SQL及語法要素

1.1 C語言嵌入式語句[1]

SQL語言可以嵌入到C語言中使用,數(shù)據(jù)庫管理系統(tǒng)一般采用的處理方法是預(yù)處理方法。預(yù)處理方法就是從含有主程序C語言和SQL語句的程序開始的。首先,把程序提交給一個(gè)專門用于C語言和SQL實(shí)現(xiàn)方式的預(yù)編譯器,預(yù)編譯器從C語言代碼中剝離SQL語句,把SQL語句轉(zhuǎn)換成C語言調(diào)用語句,以使用C語言編譯程序,并將整個(gè)編譯成目標(biāo)代碼,鏈接到各數(shù)據(jù)庫并形成可執(zhí)行文件。在C語言中嵌入SQL語句產(chǎn)生應(yīng)用程序的過程為[2]:編輯C源代碼+嵌入式SQL→SQL預(yù)編譯器→C編譯器→鏈接程序(DLL導(dǎo)入庫)→應(yīng)用程序(數(shù)據(jù)庫)。

1.2 嵌入式SQL的語法要素

(1)創(chuàng)建嵌入式語句。將SQL嵌入到C語言中混合編程,程序中會(huì)含有兩種不同計(jì)算模型的語句。為了區(qū)別SQL語句與C語句,須在所有的SQL語句前加前綴EXEC SQL,且以分號(hào)結(jié)束,一般形式為“EXEC SQL ”。嵌入式語句分為可執(zhí)行語句和說明性語句,可執(zhí)行語句用來完成在交互式環(huán)境下的SQL語句中的數(shù)據(jù)定義、數(shù)據(jù)操縱和數(shù)據(jù)控制任務(wù),說明性語句用于聲明通信區(qū)和SQL變量等。

(2)SQL通信區(qū)。SQL Server數(shù)據(jù)庫管理系統(tǒng)提供了一個(gè)通信區(qū)SQLCA,用于存儲(chǔ)SQL語句運(yùn)行時(shí)DBMS反饋給應(yīng)用程序的狀態(tài),這些信息主要描述系統(tǒng)當(dāng)前工作狀態(tài)以及運(yùn)行環(huán)境等。應(yīng)用程序從SQLCA中取出這些狀態(tài)信息,以決定接下來執(zhí)行的語句。在C語言中定義為SQL通信區(qū)的語句為:EXEC SQL INCLUDE SQLCA。

(3)主變量。嵌入式SQL語句中可以使用C語言的程序變量及主變量來輸入或輸出數(shù)據(jù)。一個(gè)主變量可以附帶一個(gè)任選的指示變量用來指示返回給主變量的值是否為NULL值以及返回給主變量的字符串是否發(fā)生了截?cái)唷]斎胫髯兞砍霈F(xiàn)于SQL語句中時(shí),可在前面加冒號(hào)(:)以區(qū)別表字段名。而定義輸出變量用指示變量的方法,是在SQL語句EXEC SQL BEGIN DECLARE SECTION與EXEC SQL END DECLARE SECTION之間進(jìn)行說明。

(4)鏈接數(shù)據(jù)庫。C程序的主函數(shù)中應(yīng)包含一條登錄語句,向預(yù)編譯和程序提供用戶名和口令,以實(shí)現(xiàn)與SQL Server數(shù)據(jù)庫管理系統(tǒng)建立鏈接。其命令語法為:EXEC SQL CONNECT TO 服務(wù)器名.數(shù)據(jù)庫名AS鏈接名 USER 用戶名.口令。

2 SQL Server中圖像數(shù)據(jù)處理技術(shù)

2.1 SQL Server 2000圖像存儲(chǔ)方法

SQL Server 2000中,對(duì)于小于8 000 B的圖像數(shù)據(jù)可以使用二進(jìn)制數(shù)據(jù)類型(binary、varbinary)表示,但通常要保存的圖像都大于8 000 B,對(duì)于這類大對(duì)像數(shù)據(jù),系統(tǒng)提供了Image數(shù)據(jù)類型。Image數(shù)據(jù)類型不同于其他數(shù)據(jù)類型,該字段內(nèi)容不能使用標(biāo)準(zhǔn)INSERT和UPDATE等語句進(jìn)行插入和更新,因此用C語言程序[3]來編寫處理圖像文件,需要先將圖像文件等數(shù)據(jù)轉(zhuǎn)換成十六進(jìn)制后存儲(chǔ),再將Image列中的數(shù)據(jù)存儲(chǔ)為位串。SQL Server不能對(duì)它進(jìn)行解釋,Image列數(shù)據(jù)的解釋必須由應(yīng)用程序完成,這與普通的數(shù)據(jù)存儲(chǔ)方式是不同的。Image列所做的全部工作就是提供一個(gè)位置用來存儲(chǔ)組成圖像數(shù)據(jù)值的位流,這需用到SQL Server中的TEXTPTR、WRITETEXT和UPDATETEXT等函數(shù)進(jìn)行圖形的添加和修改。以下是一個(gè)C語言與SQL Server 2000的嵌入式編程及圖像處理的實(shí)例,程序給出的是解決該問題的核心部分。

Demo1.sqc

#include

#include

#define Buffer_Size 1024

EXEC SQL INCLUDE USERCA;

//filein為.jpg文件,fileout為.txt文件

void imagetofield(char *filein,char * fileout)

{

EXEC SQL BEGIN DECLARE SECTION;

FILE *fin,*fout; int j, Len;

unsigned char buffer1[Buffer_Size+1];

unsigned char buffer2[Buffer_Size*3+1];

unsigned char *Temp;

EXEC SQL END DECLARE SECTION;

if(!(fin=fopen(filein, "rb ")))

return;

if(!(fout=fopen(fileout", "w")))

{fclose(fin);return;}

Len=fread(buffer1, sizeof(char), Buffer_Size, fin);

Temp=buffer2;

while(Len==Buffer_Size)

{ for(j=0;j

{ fprintf(fout,"%X",buffer1[j]);

Temp+= 3; };

//這樣就把二進(jìn)制的數(shù)據(jù)轉(zhuǎn)換成為16進(jìn)制的字符串,

并且存儲(chǔ)到buffer1當(dāng)中了

fwrite(buffer1, sizeof(char), nLen*3, fout);

Len=fread(buffer1, sizeof(char), Buffer_Size, fin); }

fclose(fin);

fclose(fout);

……

EXEC SQL CONNECT Serverl:mydb USER sa.sa;

EXEC SQL CREATE TEALE(sno char(9), sname char

(20), resume nvarchar(max),photo image);

//表中插入一條記錄,并初始化photo字段

EXEC SQL INSERT INTO teacher VALUES (’1001’,

’Arlen’,’’,0xfffffff)[!--empirenews.page--]

//往表中寫入圖像信息

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)為十六進(jìn)制文件指針

……

EXEC SQL COMMIT ;

EXEC SQL DISCONNECT ALL;}

2.2 SQL Server 2005圖像存儲(chǔ)實(shí)現(xiàn)方法[4]

SQL Server 2005 的 OPENROWSET 函數(shù)能夠一次完成遠(yuǎn)程數(shù)據(jù)的連接與存取??梢栽?SELECT 語句的 FROM 子句中使用 OPENROWSET 函數(shù),也可以在 INSERT、UPDATE 或 DELETE 語句中把 OPENROWSET 函數(shù)當(dāng)成目標(biāo)數(shù)據(jù)表來使用。值得一提的是,SQL Server 2005在OPENROWSET函數(shù)中加入了BULK數(shù)據(jù)列集, 這樣可以直接從文字文件、xml 文件以及圖像等文件中讀取數(shù)據(jù)。這就意味著可以在一條非常簡(jiǎn)單的 INSERT INTO…SELECT 語句中使用OPENROWSET函數(shù)將內(nèi)含大量數(shù)據(jù)的文件內(nèi)容存入數(shù)據(jù)表的對(duì)應(yīng)字段(如簡(jiǎn)歷、圖像等)中。OPENROWSET BULK選項(xiàng)自變量可以精確控制數(shù)據(jù)讀取的開始與結(jié)束位置、如何處理錯(cuò)誤以及數(shù)據(jù)的解釋,例如將數(shù)據(jù)文件讀取成 varbinary、varchar 或 nvarchar 類型的字段的數(shù)據(jù)列集。以下是一個(gè)C語言與SQL Server 2005的嵌入式編程及圖像處理的實(shí)例,程序給出的是解決這一問題的核心部分。

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ù)塊文本的簡(jiǎn)歷字段

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ù)塊及圖像存儲(chǔ)的解決方案

EXEC SQL COMMIT TRANSACTION;

EXEC SQL DISCONNECT ALL;

}

2.3 預(yù)編譯

C語言編譯程序不能識(shí)別應(yīng)用程序中的SQL語句,需要經(jīng)過預(yù)處理程序?qū)⑵滢D(zhuǎn)換成C語句。經(jīng)過嵌入式SQL的預(yù)編譯之后,原有的嵌入式SQL會(huì)被轉(zhuǎn)換成一系列函數(shù)調(diào)用。因此,系統(tǒng)還提供一些列函數(shù)庫,以確保能夠把代碼中的函數(shù)調(diào)用與對(duì)應(yīng)的實(shí)現(xiàn)鏈接起來。SQL Server的預(yù)處理程序是nsqlprep.exe。通過在操作系統(tǒng)命令窗口運(yùn)行命令cd c:program filesMicrosoft SQL ServerMSSQLBinn,進(jìn)入到Binn文件夾,調(diào)用預(yù)編譯程序nsqlprep.exe程序,執(zhí)行nsqlprep Demo2,如果成功就會(huì)將Demo2.sqc文件預(yù)編譯成Demo2.c。接著運(yùn)行主語言編譯程序VC++,打開Demo2.c進(jìn)行編譯,VC++會(huì)提示要建立工程,點(diǎn)擊“是”建立工程文件。還需在工程/設(shè)置/link中的對(duì)象/庫模塊中添加SQLakw32.lib和Caw32.lib才能夠正確鏈接,最后生成目標(biāo)程序和可執(zhí)行文件。

當(dāng)一個(gè)程序既要訪問數(shù)據(jù)庫,又要處理數(shù)據(jù)時(shí),把SQL語言嵌入到宿主語言中,將SQL語言訪問數(shù)據(jù)庫的功能和宿主語言的數(shù)據(jù)處理功能相結(jié)合是解決該問題的有效途徑。圖像處理作為一種信息表達(dá)手段已被人們所熟悉,在數(shù)據(jù)庫信息管理系統(tǒng)的開發(fā)中[5]需要用到圖像等數(shù)據(jù)時(shí),將有關(guān)信息與指定的圖像對(duì)應(yīng),無疑對(duì)圖像數(shù)據(jù)處理的科研、生產(chǎn)和管理等部門有著重要的實(shí)用參考價(jià)值。因此,在嵌入式SQL中用數(shù)據(jù)庫管理系統(tǒng)的預(yù)編譯器技術(shù),無限利用高級(jí)語言通過數(shù)據(jù)庫管理系統(tǒng)的接口存取和檢索數(shù)據(jù),來提高對(duì)數(shù)據(jù)庫操作的效率提高。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

德國(guó)康佳特亮相上海工博會(huì),展示多款應(yīng)用就緒的嵌入式解決方案平臺(tái)

關(guān)鍵字: 嵌入式 傳感器 處理器

雙方攜手為客戶打造以存儲(chǔ)為核心的模塊化基礎(chǔ)架構(gòu),支持先進(jìn)的多裸片架構(gòu)設(shè)計(jì)

關(guān)鍵字: 非易失性存儲(chǔ) 半導(dǎo)體 嵌入式

本屆年會(huì)將在上海(11月13-14日)、北京(11月19-20日)和深圳(11月27-28日)舉行,面向嵌入式設(shè)計(jì)工程師推出25門技術(shù)課程

關(guān)鍵字: 嵌入式 MCU 模擬

上海2025年9月5日 /美通社/ -- 由紐倫堡會(huì)展(上海)有限公司舉辦的上海國(guó)際嵌入式會(huì)議將于 2025 年 10 月 16-17 日在上海世博展覽館舉辦。 此次會(huì)議將由三個(gè)版塊組成:嵌入式技術(shù)會(huì)議、汽...

關(guān)鍵字: 嵌入式 CE CHINA EMBEDDED

從外部看,電子系統(tǒng)仿佛一個(gè)統(tǒng)一的學(xué)科或設(shè)備,各組成部分協(xié)同工作,渾然一體。然而揭開表象,其內(nèi)在卻是另一番景象:一個(gè)碎片化、多層次的世界——其中每一層都獨(dú)立且復(fù)雜,衍生出各自特有的工具、專家、工作流程,甚至哲學(xué)體系。

關(guān)鍵字: 嵌入式 電子系統(tǒng) 半導(dǎo)體

8位單片機(jī)在嵌入式設(shè)計(jì)領(lǐng)域已經(jīng)成為半個(gè)多世紀(jì)以來的主流選擇。盡管嵌入式系統(tǒng)市場(chǎng)日益復(fù)雜,8位單片機(jī)依然不斷發(fā)展,積極應(yīng)對(duì)新的挑戰(zhàn)和系統(tǒng)需求。如今,Microchip推出的8位PIC?和AVR?單片機(jī)系列,配備了先進(jìn)的獨(dú)立...

關(guān)鍵字: 單片機(jī) 嵌入式 CPU

深圳2025年8月28日 /美通社/ -- 8月26日,2025 ELEXCON深圳國(guó)際電子展盛大啟幕。本屆大會(huì)以"All for AI"為主題,深圳市德...

關(guān)鍵字: AI 工業(yè)級(jí) SSD 嵌入式

深圳2025年8月26日 /美通社/ -- 8月26日,由博聞創(chuàng)意會(huì)展主辦的 第22屆深圳國(guó)際電子展暨嵌入式展(elexcon2025)在深圳(福田)會(huì)展中心隆重開幕。 作為中國(guó)電子與嵌入式技術(shù)領(lǐng)域的專業(yè)大展,本屆展會(huì)...

關(guān)鍵字: 嵌入式 電子 高通 AI

模塊化設(shè)計(jì)作為一種將系統(tǒng)拆分為獨(dú)立、可復(fù)用組件的方法,能夠在低代碼平臺(tái)中實(shí)現(xiàn)功能的靈活組合,并最大限度地提升系統(tǒng)性能。本文將探討如何通過模塊化設(shè)計(jì),使得低代碼平臺(tái)既能快速適應(yīng)變化,又能保持高效穩(wěn)定的運(yùn)行。

關(guān)鍵字: 模塊化設(shè)計(jì) 嵌入式

CPU親和度通過限制進(jìn)程或線程可以運(yùn)行的CPU核心集合,使得它們只能在指定的CPU核心上執(zhí)行。這可以減少CPU緩存的失效次數(shù),提高緩存命中率,從而提升系統(tǒng)性能。

關(guān)鍵字: Linux 嵌入式
關(guān)閉