亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于C#的WinForm開發(fā)中存儲過程應用研究

        2018-05-15 08:31:14于磊
        軟件導刊 2018年4期

        于磊

        摘 要:在基于C#的WinForm+SQL數(shù)據(jù)庫應用開發(fā)中,存在著大量數(shù)據(jù)庫操作,直接使用命令字符串進行操作的常規(guī)方式存在執(zhí)行速度低、增加網(wǎng)絡通信量、修改困難等問題。改善上述問題的有效方法是利用SQL Server提供的存儲過程進行數(shù)據(jù)庫操作。在實際開發(fā)中應用存儲過程,采用不同方法進行對比測試,結果表明,在開發(fā)中合理應用存儲過程能有效地將應用與數(shù)據(jù)操作分離,提高運行效率,提高數(shù)據(jù)庫訪問的安全性并增加靈活性。

        關鍵詞:C#;WinForm;SQL;存儲過程

        DOI:10.11907/rjdk.172524

        中圖分類號:TP319

        文獻標識碼:A 文章編號:1672-7800(2018)004-0178-02

        Abstract:In C# based WinForm+SQL application development, there is a large number of database operations. In general, we use command strings to perform database operations, but this method will reduce execution speed, increase network traffic and cause difficulty of modification. In order to improve the above problems, one efficient method is proposed to use the stored procedure of SQL Server to complete database operations. Through the use of stored procedure and the different methods in the development, the results show that applying stored procedure rationally in developmentrational employment of the stored procedure in develoment can effectively separate application implementation from data operation, improve operation efficiency and database access security and enhance flexibility.

        Key Words:C#; WinForm; SQL; Stored Procedure

        0 引言

        在基于C#的WinForm+SQL應用開發(fā)中,應用程序與數(shù)據(jù)庫之間存在大量數(shù)據(jù)操作,這些操作通常通過ADO.NET實現(xiàn)。ADO.NET是.NET框架中的一個組件庫,在技術上高于現(xiàn)有的API。ADO.NET分為數(shù)據(jù)提供程序和數(shù)據(jù)集兩個部分,實現(xiàn)了數(shù)據(jù)訪問和數(shù)據(jù)操作的分離。其數(shù)據(jù)操作一般過程為:創(chuàng)建連接對象,打開與數(shù)據(jù)庫的連接,通過Command類對象選擇數(shù)據(jù)后把它們放到記錄集中,接著處理并在服務器上更新這些數(shù)據(jù),最后關閉它們。在該過程中,ADO.NET所提供的基礎方式是將實現(xiàn)數(shù)據(jù)庫操作的T-SQL語句以字符串的形式直接編寫在C#代碼中,這種方式難以滿足性能優(yōu)化、安全性和易維護的開發(fā)要求。除了進行SQL語句的性能調(diào)優(yōu),借助SQL Server的存儲過程完成數(shù)據(jù)庫操作是解決上述問題的重要方法。

        1 SqlCommand對象

        在ADO.NET中,對應于SQL Server提供程序的SqlCommand類對象負責執(zhí)行對數(shù)據(jù)庫進行操作的各種命令,包括SELECT、INSERT、UPDATE、DELETE等,一般過程為:①創(chuàng)建SqlCommand類對象;②將數(shù)據(jù)庫操作對應的SQL語句指定給該對象的CommandText屬性;③將該對象綁定到一個打開的數(shù)據(jù)庫連接對象;④調(diào)用該對象的相應執(zhí)行方法或將該對象綁定到DataAdapter完成數(shù)據(jù)操作。

        例如:在基于C#開發(fā)的成人高等教育畢業(yè)生審核系統(tǒng)中,為了將成教畢業(yè)生申報數(shù)據(jù)與學信網(wǎng)的學生學籍數(shù)據(jù)進行一致性比對,對畢業(yè)生申報數(shù)據(jù)表與學信網(wǎng)的在校生學籍數(shù)據(jù)表進行了一個左外連接操作,代碼如下:

        DataTable checkTable=new DataTable();

        SqlCommand checkConsistencyCmd=new SqlCommand(@"SELECT * FROM (SELECT ksh,xh,cm,xb,csrq,sfzh,zydm,zymc,cc,xxxs,xz,rxrq,yjbyrq,bysxjcf,xjjyt,jc FROM bmdr WHERE xjzt='在校') AS t1 LEFT OUTER JOIN(SELECT ksh,xh,xm,xb,csrq,sfzh,zydm,zymc,cc,xxxs,xz FROM zxs)as t2 ON t1.ksh=t2.ksh",adultEduConn);

        SqlDataAdapter checkAda=new SqlDataAdapter(checkConsistencyCmd);

        try

        {

        checkAda.Fill(checkTable);

        }

        catch(Exception ex){……}

        該方式是ADO.NET提供的操作數(shù)據(jù)庫基本方式,在存在大量T-SQL語句需要逐條執(zhí)行的情況下至少存在以下問題:語句的逐條編譯執(zhí)行會降低執(zhí)行速度,大量T-SQL語句的傳輸會占用一定的網(wǎng)絡通信量,由于T-SQL語句是以文本的方式嵌入C#代碼中的,其修改完全依賴于對應用程序的修改。

        2 存儲過程及應用

        (1)調(diào)用存儲過程進行數(shù)據(jù)庫操作。 ADO.NET的命令對象可以調(diào)用存儲過程完成SQL數(shù)據(jù)庫的操作。存儲過程建立在SQL服務器上,是一組預先編譯好的T-SQL語句,由用戶通過指定存儲過程的名字執(zhí)行。

        存儲過程調(diào)用與上述通過命令字符串的方式進行數(shù)據(jù)庫操作在使用過程上的差異在于,前者需要事先在SQL服務器上創(chuàng)建存儲過程,然后在SqlCommand類的對象上綁定存儲過程并將對象的CommandType屬性指派為“StoreProcedure”。

        例如:由于成人教育的特殊性,成人在校生可能存在多個學籍,為了統(tǒng)計出每個畢業(yè)生是否存在重復學籍,在SQL服務器上編寫如下存儲過程:

        create procedure chkXJCF with encryption as

        begin

        UPDATE bmdr SET bysxjcf=t2.d FROM (SELECT ksh AS c,t1.b AS d FROM bmdr,(SELECT sfzh AS a,count(sfzh) AS b FROM bmdr GROUP BY sfzh) AS t1 WHERE bmdr.sfzh=t1.a) AS t2 WHERE bmdr.ksh=t2.c

        UPDATE bmdr SET zxsxjcf=t2.d FROM (SELECT ksh AS c,t1.b AS d FROM bmdr,(SELECT sfzh AS a,count(sfzh) AS b FROM zxs GROUP BY sfzh) AS t1 WHERE bmdr.sfzh=t1.a) AS t2 WHERE bmdr.ksh=t2.c

        end

        為了調(diào)用該存儲過程,在C#程序中使用如下代碼:

        SqlCommand chkCMD=new SqlCommand(@"chkXJCF",adultEduConn);

        chkCMD.CommandType=CommandType.StoreProcedure;

        try{

        aduleEduConn.Open();

        chkCMD.ExecuteNonQuery();

        }

        catch(Exception ex){……}

        與通過命令字符串方式進行數(shù)據(jù)庫操作相比,存儲過程調(diào)用好處有:存儲過程在第一次調(diào)用后就駐留在內(nèi)存中,不需要二次編譯和優(yōu)化,提升了執(zhí)行性能,且由于存儲過程通過指定的名字執(zhí)行,降低了網(wǎng)絡通信量;存儲過程存在于SQL服務器上,完全獨立于應用程序,即使出現(xiàn)修改需求也不影響應用程序;存儲過程可以通過授權提供更高的安全性。

        (2)利用存儲過程實現(xiàn)參數(shù)化查詢。 存儲過程可以攜帶參數(shù),并通過指定參數(shù)的方向完成應用程序中的參數(shù)化查詢。由于參數(shù)是類型化的替代占位符,而非未經(jīng)檢查的純文本,因此可以有效防范類似于SQL注入之類的攻擊,提高安全性。除了在SQL服務器上正確編寫帶參數(shù)的存儲過程外,還需要為SqlCommand對象增加參數(shù),以完成參數(shù)的傳遞。

        例如:為了將往屆未通過審核的成教畢業(yè)生數(shù)據(jù)追加到本屆待審核數(shù)據(jù)中,需要通過姓名查找未通過審核畢業(yè)生數(shù)據(jù)表并排除該姓名在本屆待審核數(shù)據(jù)中的存在,存儲過程就需要用學生的姓名作為一個輸入?yún)?shù)完成查詢。建立存儲過程代碼如下:

        create procedure joinwith_xm (@para char(40)) with encryption as

        begin

        select RTRIM(ksh) AS ksh,RTRIM(xh) AS xh,RTRIM(xm) AS xm,RTRIM(xb) AS xb, sfzh, RTRIM(zydm) AS zydm, RTRIM(zymc) AS zymc, RTRIM(cc) AS cc, RTRIM(xxxs) AS xxxs,RTRIM(xz) AS xz from WBY where xm=@para and ksh not in (select ksh from bmdr where xm=@para)

        ……

        end

        為了完成該存儲過程的調(diào)用,在使用SqlCommand對象時,除了對象的CommandType屬性指派為“StoreProcedure”外,還應創(chuàng)建相關參數(shù),并將它們附加到SqlCommand對象上:

        SqlCommand joinCmd=new SqlCommand("joinwith_xm",adultEduConn);

        joinCmd.CommandType=CommandType.StoreProcedure;

        joinCmd.Parameters.AddWithValue("@para",searchPanel.GetXM);

        SqlDataAdapter joinAda=new SqlDataAdapter(joinCmd);

        try{

        joinAda.Fill(joinTable);

        }

        catch(Exception ex){……}

        3 結語

        在基于C#的WinForm+SQL數(shù)據(jù)庫應用開發(fā)中合理使用存儲過程,能有效將應用實現(xiàn)與數(shù)據(jù)操作分離,提高運行效率,提高數(shù)據(jù)庫訪問的安全性并增強系統(tǒng)的靈活性。

        參考文獻:

        [1] WILDERMUTH S. ADO.NET應用程序開發(fā)(MCTS教程)[M].北京:清華大學出版社,2010.

        [2] NAGEL C. C#高級編程 [M].第9版.北京:清華大學出版社,2014.

        [3] BEN-GAN I. SQL Server 2012 T-SQL基礎教程[M].北京:人民郵電出版社,2013.

        [4] HAMILTON B. ADO.NET3.5經(jīng)典實例[M].第2版.北京:機械出版社,2009.

        [5] DEITEL P J, DEITEL H M. C# 2008程序員教程[M].第3版.北京:電子工業(yè)出版社,2009.

        [6] CLARKE J. SQL注入攻擊與防御[M].北京:清華大學出版社,2013.

        [7] FRITCHEY G, DAM S. SQL Server 2008查詢性能優(yōu)化[M].北京:人民郵電出版社,2010.

        [8] JORGENSEN A. SQL Server 2012管理高級教程[M].第2版.北京:清華大學出版社,2011.

        [9] MICHAELIS M. C#本質論[M].第2版.北京:人民郵電出版社,2009.

        [10] BROWN E. Windows Forms編程實戰(zhàn)[M].北京:機械工業(yè)出版社,2008.

        (責任編輯:杜能鋼)

        亚洲中文字幕无码av永久| 亚洲国产一区二区三区视频在线| 麻豆国产精品伦理视频| 风韵丰满熟妇啪啪区老老熟妇| 国产国拍亚洲精品mv在线观看| 国产欧美日韩午夜在线观看| 亚洲视频中文字幕更新| 午夜福利影院成人影院| 色综合久久88色综合天天| 国产91成人精品亚洲精品| 一区二区久久精品66国产精品| 亚洲av少妇高潮喷水在线| 免费a级毛片无码免费视频120软件 | 小辣椒福利视频导航| 亚洲av国产av综合av| 国内精品九九久久精品小草| 国产一级黄色录像大片| 男女高潮免费观看无遮挡| 亚洲一区二区三区在线网站| 91久久精品一区二区喷水喷白浆| 一区二区三区高清在线观看视频| 成人毛片一区二区| 国产精品区一区二区三在线播放 | 亚洲国产女同在线观看| 亚洲成av人片乱码色午夜| 欧美人与动人物姣配xxxx| 日韩免费高清视频网站| 人妖啪啪综合av一区| 国产精品久久久久9999吃药| 久久久久这里只有精品网| 中文字幕二区三区在线| 少妇性俱乐部纵欲狂欢少妇| 色播久久人人爽人人爽人人片av| 久久99久久99精品免观看不卡| 亚洲免费在线视频播放| 国产一区二区三区乱码| 黑人性受xxxx黑人xyx性爽| 国产精品亚洲在钱视频| 免费人成小说在线观看网站 | 国产激情久久99久久| 91精品福利一区二区三区|