新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > C語言與嵌入式SQL混合編程及圖像處理技術(shù)

        C語言與嵌入式SQL混合編程及圖像處理技術(shù)

        作者: 時(shí)間:2012-12-13 來源:網(wǎng)絡(luò) 收藏

        Server是現(xiàn)階段應(yīng)用程序最普遍采用的數(shù)據(jù)庫,在數(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)制的指針,該指針指向存放該記錄的頁面。由于是一種面向集合運(yùn)算的描述,其本身不具有過程性結(jié)構(gòu),使用 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)用前景。

        本文引用地址:http://www.104case.com/article/148193.htm

        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ù)處理

        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)

        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

        c語言相關(guān)文章:c語言教程



        上一頁 1 2 下一頁

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 凤城市| 普兰店市| 宣武区| 电白县| 德化县| 遵化市| 永昌县| 阳泉市| 无棣县| 天柱县| 雅江县| 哈密市| 志丹县| 富民县| 理塘县| 宜城市| 利津县| 东港市| 都安| 自治县| 昌宁县| 海宁市| 迁西县| 陆丰市| 朝阳市| 翁源县| 乌审旗| 涟源市| 东城区| 虞城县| 洛南县| 镶黄旗| 赤壁市| 罗甸县| 嘉义县| 卢湾区| 南康市| 东山县| 新干县| 绥芬河市| 建阳市|