當前位置:首頁 » 操作系統 » c資料庫幫助類

c資料庫幫助類

發布時間: 2024-03-21 09:52:40

1. C語言資料庫是什麼

C語言資料庫其實就是一個資料庫,只是用c來連接資料庫來進行各種的操作,比如添加,刪除,修改數據等等。

2. 資料庫有哪些類型,EXCEL資料庫屬於哪種類型

資料庫發展30年
一、網狀資料庫

最早出現的是網狀DBMS。網狀模型中以記錄為數據的存儲單位。記錄包含若干數據項。網狀資料庫的數據項可以是多值的和復合的數據。每個記錄有一個惟一地標識它的內部標識符,稱為碼(DatabaseKey,DBK),它在一個記錄存入資料庫時由DBMS自動賦予。DBK可以看作記錄的邏輯地址,可作記錄的替身,或用於尋找記錄。網狀資料庫是導航式(Navigation)資料庫,用戶在操作資料庫時不但說明要做什麼,還要說明怎麼做。例如在查找語句中不但要說明查找的對象,而且要規定存取路徑。

世界上第一個網狀資料庫管理系統也是第一個DBMS是美國通用電氣公司Bachman等人在1964年開發成功的IDS(IntegratedDataStore)。IDS奠定了網狀資料庫的基礎,並在當時得到了廣泛的發行和應用。1971年,美國CODASYL(,數據系統委員會)中的DBTG(DataBaseTaskGroup,資料庫任務組)提出了一個著名的DBTG報告,對網狀數據模型和語言進行了定義,並在1978年和1981年又做了修改和補充。因此網狀數據模型又稱為CODASYL模型或DBTG模型。1984年美國國家標准協會(ANSI)提出了一個網狀定義語言(NetworkDefinitionLanguage,NDL)的推薦標准。在70年代,曾經出現過大量的網狀資料庫的DBMS產品。比較著名的有Cullinet軟體公司的IDMS,Honeywell公司的IDSII,Univac公司(後來並入Unisys公司)的DMS1100,HP公司的IMAGE等。網狀資料庫模型對於層次和非層次結構的事物都能比較自然的模擬,在關系資料庫出現之前網狀DBMS要比層次DBMS用得普遍。在資料庫發展史上,網狀資料庫佔有重要地位。

二、層次資料庫

層次型資料庫管理系統是緊隨網路型資料庫而出現的。現實世界中很多事物是按層次組織起來的。層次數據模型的提出,首先是為了模擬這種按層次組織起來的事物。層次資料庫也是按記錄來存取數據的。層次數據模型中最基本的數據關系是基本層次關系,它代表兩個記錄型之間一對多的關系,也叫做雙親子女關系(PCR)。資料庫中有且僅有一個記錄型無雙親,稱為根節點。其他記錄型有且僅有一個雙親。在層次模型中從一個節點到其雙親的映射是惟一的,所以對每一個記錄型(除根節點外)只需要指出它的雙親,就可以表示出層次模型的整體結構。層次模型是樹狀的。

最著名最典型的層次資料庫系統是IBM公司的IMS(Information Management System),這是IBM公司研製的最早的大型資料庫系統程序產品。從60年代末產生起,如今已經發展到IMSV6,提供群集、N路數據共享、消息隊列共享等先進特性的支持。這個具有30年歷史的資料庫產品在如今的WWW應用連接、商務智能應用中扮演著新的角色。

三、關系資料庫

關系模型的建立

網狀資料庫和層次資料庫已經很好地解決了數據的集中和共享問題,但是在數據獨立性和抽象級別上仍有很大欠缺。用戶在對這兩種資料庫進行存取時,仍然需要明確數據的存儲結構,指出存取路徑。而後來出現的關系資料庫較好地解決了這些問題。關系資料庫理論出現於60年代末到70年代初。1970年,IBM的研究員E.F.Codd博士發表《大型共享數據銀行的關系模型》一文提出了關系模型的概念。後來Codd又陸續發表多篇文章,奠定了關系資料庫的基礎。關系模型有嚴格的數學基礎,抽象級別比較高,而且簡單清晰,便於理解和使用。但是當時也有人認為關系模型是理想化的數據模型,用來實現DBMS是不現實的,尤其擔心關系資料庫的性能難以接受,更有人視其為當時正在進行中的網狀資料庫規范化工作的嚴重威脅。為了促進對問題的理解,1974年ACM牽頭組織了一次研討會,會上開展了一場分別以Codd和Bachman為首的支持和反對關系資料庫兩派之間的辯論。這次著名的辯論推動了關系資料庫的發展,使其最終成為現代資料庫產品的主流。

關系數據模型提供了關系操作的特點和功能要求,但不對DBMS的語言給出具體的語法要求。對關系資料庫的操作是高度非過程化的,用戶不需要指出特殊的存取路徑,路徑的選擇由DBMS的優化機制來完成。Codd在70年代初期的論文論述了範式理論和衡量關系系統的12條標准,用數學理論奠定了關系資料庫的基礎。Codd博士也以其對關系資料庫的卓越貢獻獲得了1983年ACM圖靈獎。

關系數據模型是以集合論中的關系概念為基礎發展起來的。關系模型中無論是實體還是實體間的聯系均由單一的結構類型--關系來表示。在實際的關系資料庫中的關系也稱表。一個關系資料庫就是由若干個表組成。

sql語言的產生和發展

1974年,IBM的Ray Boyce和Don Chamberlin將Codd關系資料庫的12條准則的數學定義以簡單的關鍵字語法表現出來,里程碑式地提出了SQL(Structured Query Language)語言。SQL語言的功能包括查詢、操縱、定義和控制,是一個綜合的、通用的關系資料庫語言,同時又是一種高度非過程化的語言,只要求用戶指出做什麼而不需要指出怎麼做。SQL集成實現了資料庫生命周期中的全部操作。自產生之日起,SQL語言便成了檢驗關系資料庫的試金石,而SQL語言標準的每一次變更都指導著關系資料庫產品的發展方向。

在SQL語言取得進展的同時,IBM研究中心於1973年開始著手SystemR項目。其目標是論證一個全功能關系DBMS的可行性。該項目結束於1979年,完成了第一個實現SQL的DBMS。1986年,ANSI把SQL作為關系資料庫語言的美國標准,同年公布了標准SQL文本。目前SQL標准有3個版本。基本SQL定義是ANSIX3135-89,"Database Language - SQL with Integrity Enhancement"[ANS89],一般叫做SQL-89。SQL-89定義了模式定義、數據操作和事務處理。SQL-89和隨後的ANSIX3168-1989,"DatabaseLanguage-EmbeddedSQL"構成了第一代SQL標准。ANSIX3135-1992[ANS92]描述了一種增強功能的SQL,現在叫做SQL-92標准。SQL-92包括模式操作,動態創建和SQL語句動態執行、網路環境支持等增強特性。在完成SQL-92標准後,ANSI和ISO即開始合作開發SQL3標准。SQL3的主要特點在於抽象數據類型的支持,為新一代對象關系資料庫提供了標准。

第二部分 主流關系資料庫軟體介紹
Codd的關系資料庫理論把關系系統分為表式系統、(最小)關系系統、關繫上完備的系統、全關系系統4個級別。目前尚沒有一個資料庫系統是完全關系系統。真正稱做關系系統的應該至少是關繫上完備的系統。現代的主流關系資料庫產品都是關繫上完備的。

一、IBM的DB2 / DB2 universal database

作為關系資料庫領域的開拓者和領航人,IBM於1980年開始提供集成的資料庫伺服器--System/38,隨後是SQL/DSforVSE和VM,其初始版本與SystemR研究原型密切相關。DB2forMVSV1在1983年推出。該版本的目標是提供這一新方案所承諾的簡單性,數據不相關性和用戶生產率。DB2以後的版本的重點是改進其性能、可靠性和容量,以滿足廣泛的關鍵業務的行業需求。1988年DB2forMVS提供了強大的在線事務處理(OLTP)支持,1989年和1993年分別以遠程工作單元和分布式工作單元實現了分布式資料庫支持。最近推出的DB2UniversalDatabase6.1則是通用資料庫的典範,是第一個具備網上功能的多媒體關系資料庫管理系統,支持包括Linux在內的一系列平台。其主要新功能包括:

1)提供了JavaStoredProcereBuilder支持伺服器端的存儲過程快速開發。
2)支持與目錄伺服器通訊的標准LDAP。
3)增強的轉換及遷移工具。
4)擴展的DB2通用資料庫控制中心,可在更多的平台下採用相同的圖形工具完成管理工作。
5)提高了電子商務性能,提供多種電子商務整合方案。
6)具有強大的XML支持能力。

二、Informix的歷史 / InformixIDS2000

Informix在1980年成立,目的是為Unix等開放操作系統提供專業的關系型資料庫產品。公司的名稱Informix便是取自Information和Unix的結合。

Informix第一個真正支持SQL語言的關系資料庫產品是InformixSE(StandardEngine)。InformixSE的特點是簡單、輕便、適應性強。它的裝機量非常之大,尤其是在當時的微機Unix環境下,成為主要的資料庫產品。它也是第一個被移植到Linux上的商業資料庫產品。

在90年代初,聯機事務處理成為關系資料庫越來越主要的應用,同時,Client/Server結構日漸興起。為了滿足基於Client/Server環境下聯機事務處理的需要,Informix在其資料庫產品中引入了Client/Server的概念,將應用對資料庫的請求與資料庫對請求的處理分割開來,推出了Informix-OnLine,OnLine的一個特點是數據的管理的重大改變,即數據表不再是單個的文件,而是資料庫空間和邏輯設備。邏輯設備不僅可以建立在文件系統之上,還可以是硬碟的分區和裸設備。由此提高了數據的安全性。

1993年,為了克服多進程系統性能的局限性,Informix使用多線程機制重新改寫資料庫核心,次年初,Informix推出了採用被稱為"動態可伸縮結構"(DSA)的InformixDynamicServer。除了應用線程機制以外,Informix在資料庫核心中引入了虛處理器的概念,每個虛處理器就是一個Informix資料庫伺服器進程。在DynamicServer中,多條線程可以在虛處理器緩沖池中並行執行,而每個虛處理機又被實際的多處理機調度執行。更重要的是:為了執行高效性和多功能的調諧,Informix將虛處理器根據不同的處理任務進行了分類。每一類被優化以完成一種特定的功能。

到90年代後期,隨著Internet的興起,電子文檔、圖片、視頻、空間信息、Internet/Web等應用潮水般湧入IT行業,而關系資料庫所管理的數據類型仍停留在數字、字元串、日期等六七十年代的水平上,其處理能力便顯得力不從心了。1992年,著名的資料庫學者、Ingres的創始人加州大學伯克利分校的MichaelStonebraker教授提出對象關系資料庫模型,從而找到了一條解決問題的有效途徑。

1995年,Stonebraker及其研發組織的加入了Informix,使之在資料庫發展方向上有了一個新的突破:1996年Informix推出了通用數據選件(Universal Data Option)。這是一個對象關系模型的資料庫伺服器;它與其他廠商中間件的解決方案不同,從關系資料庫伺服器內部的各個環節對資料庫進行面向對象的擴充;將關系資料庫的各種機制抽象化、通用化。UniversalDataOption採用了DynamicServer的所有底層技術,如DSA結構和並行處理,同時允許用戶在資料庫中建立復雜的數據類型及用戶自定義的數據類型,同時可對這些數據類型定義各種操作和運算以實現對象的封裝。在定義操作和運算時可以採用資料庫過程語言、C語言,它們經注冊後成為伺服器的一部分。

1999年,Informix進一步將Universal Data Option進行了優化,為用戶自定義數據類型和操作過程提供了完整的工具環境。同時在傳統事務處理的性能超過了以往的Dynamic Server。新的資料庫核心便被命名為IDS.2000。它的目標定位於下世紀基於Internet的復雜資料庫應用。

事實上,Internet的普及從Web開始。Web應用以簡便和圖文並茂見長。但充斥整個系統的HTML文件又將我們不知不覺地帶回了文件系統的時代。採用資料庫管理Internet信息遇到的第一個挑戰就是復雜信息的管理問題,Internet的出現將"數據"的概念在實際應用中擴大了。為此,自1995年起,Informix便著手進行新一代資料庫系統的設計。作為專業的資料庫廠商,Informix首先針對Internet應用中數據類型的多樣化,採用對象技術對關系資料庫體系進行了擴展。與眾不同之處在於,Informix並非將新的數據類型寫死在資料庫核心中,而是將資料庫系統中各個環節充分地抽象化,使用戶有能力定義和描述自己需要管理的數據類型,將可管理的數據類型擴展到無限,同時適應了未來應用發展的需要。這就是Informix今年新推出的資料庫伺服器--InformixDynamicServer.2000(簡稱IDS.2000)。

在IDS.2000中,Informix的另一重大貢獻在於抽象化資料庫的訪問方法(索引機制和查詢優化)並將其中介面開放。這樣,用戶便可以自己定義對復雜對象的全新的索引機制,並融入整個資料庫伺服器。在IDS.2000中,所有用戶自定義的數據類型、操作、索引機制都將被系統與其內置的類型、操作和索引機制同等對待。IDS.2000將所有資料庫操作納入標准資料庫SQL的范疇,在形式上與傳統關系資料庫完全兼容,但適應了"數據"概念拓展的需求,成為真正的通用資料庫。Informix在IDS.2000之上增加了一系列核心擴展模塊,構成了面向Internet的多功能資料庫伺服器Informix Internet Foundation.2000。

INFORMIX主要產品分為三大部分:
資料庫伺服器(資料庫核心)
應用開發工具
網路資料庫互聯產品

資料庫伺服器有兩種,作用都是提供數據操作和管理:
SE:完全基於UNIX操作系統,主要針對非多媒體的較少用戶數的應用
ONLINE:針對大量用戶的聯機事務處理和多媒體應用環境

應用開發工具是用以開發應用程序必要的環境和工具,主要也有兩個系列:
4GL:INFORMIX傳統的基於字元界面的開發工具,該系列的主要產品有五個,他們是I-SQL、4GL RDS、4GL C COMPILER、4GL ID和ESQL/C;
NewEra:INFORMIX最新提供的具有事件驅動能力、面向對象的基於各種圖形界面的開發工具。
INFORMIX的網路資料庫互聯產品:提供給用戶基於多種工業標準的應用程序介面,通過它可以和其它遵守這些工業標準的資料庫聯接。

三、Sybase的歷史 / Sybase ASE

Sybase公司成立於1984年,公司名稱"Sybase"取自"system"和"database"相結合的含義。Sybase公司的創始人之一Bob Epstein是Ingres大學版(與System/R同時期的關系資料庫模型產品)的主要設計人員。公司的第一個關系資料庫產品是1987年5月推出的SybaseSQLServer1.0。

Sybase首先提出了Client/Server資料庫體系結構的思想,並率先在自己的SybaseSQLServer中實現。在此之前,計算機信息一般都存儲在單一的主機計算機中,最終用戶一般都通過字元終端管理和訪問主機,絕大多數的處理都由主機完成,終端主要完成輸入和簡單的顯示功能。這種主機/終端模式的軟硬體費用相當高,中小型企業一般都無法實施。在70年代末和80年代初,IT業發生了兩件產生深遠影響的事件:PC機和區域網絡的迅速普及。PC機比終端的功能要強得多,區域網的速度也比主機終端之間的連接速度快得多,而且與主機系統相比,它們的費用也低得多,與此同時,工作站和小型機也飛速發展,在許多方面可以取代主機的功能,這些為實施Client/Server體系結構提供了硬體的基礎。

在Client/Server體系結構中,伺服器提供數據的存儲和管理等功能,客戶端運行相應的應用,通過網路可獲得伺服器的服務,使用伺服器上的資料庫資源。客戶機和伺服器通過網路連結成為一個互相協作的系統。Client/Server體系結構將原來運行在主機系統上的大型資料庫系統進行適當的劃分,在客戶機和伺服器之間進行合理的分配,在Sybase SQL Server中,將資料庫和應用劃分為以下幾個邏輯功能:用戶介面(User Interface)、表示邏輯(Presentation Logic)、事務邏輯(Transaction Logic)、數據存取(Data Access)。Sybase的設計思想是將事務邏輯和數據存取放在伺服器一側處理,而把用戶介面、表示邏輯放在客戶機上處理。

Client/Server體系結構把硬體和軟體合理的配置和設計,極大地推動了當時聯機企業信息系統的實現。與主機/終端模式相比,Client/Server體系結構可以更好地實現數據服務和應用程序的共享,並且系統容易擴充,更加靈活,簡化了企業信息系統的開發。當信息系統的規模擴大或需求改變時,不必重新設計而可以在原有的基礎上進行擴充和調整,從而保護了企業在硬體和軟體上的已有的投資。

「Client/Server體系結構"很快成為企業信息建設的主要模式,對資料庫乃至IT業的發展產生了深遠的影響。

1989年,Sybase發布了OpenClient/OpenServer,這一產品為不同的數據源和幾百種工具和應用提供了一致的開放的介面,為實現異構環境下系統的可互操作提供了非常有效的手段。

1992年11月,Sybase發布了SQLServer10.0和一系列的新產品(在此之前,SQLServer相繼推出了2.0、4.2、4.8、4.9等版本),將SQLServer從一個Client/Server系統推進到支持企業級的計算環境。Sybase將此產品系列叫做System10。它是根據能支持企業級資料庫(運行Sybase和其他廠商的資料庫系統)來設計的。

SybaseSQLServer10.0是System10的核心。與4.9版相比,增加了許多新的特點和功能:修改過的Transact-SQL完全符合ANSI-89SQL標准以及ANSI-92入口級SQL標准,此外還增強了對游標的控制,允許應用程序按行取數據,也允許整個數據雙向滾動。此外,還引入了閥值管理器。1995年,Sybase推出了SybaseSQLServer11.0。除了繼續對聯機事務提供強有力的支持之外,Sybase在11.0中增加了不少新功能以支持聯機分析處理和決策支持系統。

為了適應現在和未來不斷變化的應用需求,Sybase在1997年4月發布了適應性體系結構(Adaptive Component Architecture , ACA)。ACA是一種3層結構:包括客戶端、中間層和伺服器。每一層都提供了組件的運行環境,ACA結構可以按照應用需求方便地對系統的每一層進行配置,適應未來的發展要求。與ACA體系結構相適應,Sybase將SQLServer重新命名為Adaptive Server Enterprise,版本號為11.5。在ACA結構中,提出了兩種組件的概念:邏輯組件和數據組件。邏輯組件是實現應用邏輯的組件,可以用Java、C/C++、Power Builder等語言來開發,可遵循目前流行的組件標准,如Corba、ActiveX和JavaBean等。而數據組件可實現對不同類型數據的存儲和訪問。數據組件由Adaptive Server Enterprise11.5(簡稱ASE11.5)提供。這些數據組件不僅可以完成傳統的關系型數據的存儲,而且可以支持各種復雜數據類型,用戶可以根據用戶需要存儲的數據類型安裝相應的數據存儲組件,例如地理空間、時間序列、多媒體/圖像、文本數據等。它代表了Sybase在解決復雜數據類型、多維數據類型和對象數據類型等方面的技術策略。

ASE11.5顯著增強了對數據倉庫和OLAP的支持,引入了邏輯進程管理器允許用戶選擇對象的運行優先順序。

Sybase在1998年推出了ASE11.9.2。這一版本最大的特點是引入了兩種新型的鎖機制來保證系統的並發性和性能:數據頁鎖和數據行鎖,提供了更精細的粒度控制。另外在查詢優化方面也得到了改進。

----進入1999年,隨著Internet的廣泛使用,為了幫助企業建立企業門戶應用,Sybase提出了"OpenDoor"計劃,其中一個重要的組成部分就是推出了最新的面向企業門戶的ASE12.0。為了滿足企業門戶的要求,ASE12.0在生產率、可用性和集成性方面做了顯著的增強。

ASE12提供了對Java和XML良好的支持,通過完全支持分布事務處理的業界標准X/Open的XA介面標准和微軟的DTC標準保證分布事務的完整性,內置高效的事務管理器(TransactionManager)可以支持分布事務的高吞吐量。

ASE12採用了群集(cluster)技術減少意外停機時間。不但支持兩個伺服器之間的失敗轉移(failover),還可支持自動的客戶端的失敗轉移。

----ASE12提供了對ACE和Kerberos安全模式的支持,用戶可以通過ACE和Kerberos提供更加安全和加密的網路通信;ASE12還提供了聯機索引重建功能,在索引重建時,表中的數據仍可被訪問。

在查詢優化方面,ASE12引入了一種新的稱為"Merge Join"的演算法,可以顯著提高多表連接查詢的速度;通過executeimmediate語句可以執行動態SQL語句;用戶可以定義永久和完整的查詢方案,從而可以進行更有效的性能優化。此外,ASE12與其他Sybase產品(例如Sybase Enterprise Application Server和Sybase Enterprise Event Broker)一起提供對一個完整的標准Internet介面的支持。

3. C#中如何定義資料庫操作類,並調用

以下是我編寫的一個操作access資料庫的類,其他資料庫可以參考修改,原理差不多的。希望對你有幫助。

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
using System.Configuration;
using System.Data;

namespace AutoEmailSender
{
/// <summary>
/// 資料庫交互類
/// </summary>
public class DB
{
/// <summary>
/// 獲得資料庫連接
/// </summary>
/// <returns></returns>
public static OleDbConnection GetDBConnection()
{
return new OleDbConnection(ConfigurationManager.AppSettings["ConnectString"]);
}

/// <summary>
/// 查詢結果集
/// </summary>
/// <param name="sql">執行語句</param>
/// <returns>返回一個DataTable對象</returns>
public static DataTable ExecuteDataTable(string sql)
{
using (OleDbConnection con = GetDBConnection())
{
OleDbCommand cmd = new OleDbCommand(sql, con);
return ExecuteDataTable(cmd);
}
}

/// <summary>
/// 查詢結果集
/// </summary>
/// <param name="cmd">執行語句的OleDbCommand命令</param>
/// <returns>返回一個DataTable對象</returns>
public static DataTable ExecuteDataTable(OleDbCommand cmd)
{
DataSet ds = new DataSet();
using (OleDbDataAdapter da = new OleDbDataAdapter(cmd))
{
try
{
da.Fill(ds);
}
catch (Exception e)
{
throw e;
}
}
if (ds.Tables.Count > 0)
{
ds.Tables[0].DefaultView.RowStateFilter = DataViewRowState.Unchanged | DataViewRowState.Added | DataViewRowState.ModifiedCurrent | DataViewRowState.Deleted;
return ds.Tables[0];
}
else
return null;
}

/// <summary>
/// 執行查詢,並返回查詢所返回的結果集中第一行的第一列。忽略其他列或行。
/// </summary>
/// <param name="sql">查詢語句</param>
/// <returns>返回結果集中第一行的第一列的object值</returns>
public static object ExecuteScalar(string sql)
{
using (OleDbConnection con = GetDBConnection())
{
OleDbCommand cmd = new OleDbCommand(sql, con);
return ExecuteScalar(cmd);
}
}

/// <summary>
/// 執行查詢,並返回查詢所返回的結果集中第一行的第一列。忽略其他列或行。
/// </summary>
/// <param name="cmd">查詢命令</param>
/// <returns>返回結果集中第一行的第一列的object值</returns>
public static object ExecuteScalar(OleDbCommand cmd)
{
try
{
cmd.Connection.Open();
object obj = cmd.ExecuteScalar();
cmd.Connection.Close();
return obj;
}
catch (Exception error)
{
cmd.Connection.Close();
throw error;
}
}

/// <summary>
/// 更新數據集
/// </summary>
/// <param name="dt">要更新的數據集</param>
/// <param name="insertCmd">插入SQL語句</param>
/// <param name="updateCmd">更新SQL語句</param>
/// <param name="deleteCmd">刪除SQL語句</param>
/// <returns></returns>
public static int UpdateDataSet(DataTable dt, OleDbCommand insertCmd, OleDbCommand updateCmd, OleDbCommand deleteCmd)
{
using (OleDbDataAdapter da = new OleDbDataAdapter())
{
da.InsertCommand = insertCmd;
da.UpdateCommand = updateCmd;
da.DeleteCommand = deleteCmd;
//da.UpdateBatchSize = 0; //UpdateBatchSize:指定可在一次批處理中執行的命令的數量,在Access不被支持。0:批大小沒有限制。1:禁用批量更新。>1:更改是使用 UpdateBatchSize 操作的批處理一次性發送的。
da.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
da.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
da.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
try
{
int row = da.Update(dt);
return row;
}
catch (Exception e)
{
throw e;
}
}
}

/// <summary>
/// 返回一個查詢語句執行結果的表結構
/// </summary>
/// <param name="sql">查詢語句,不支持復雜SQL</param>
/// <returns></returns>
public static DataTable GetTableSchema(string sql)
{
sql = sql.ToUpper();
DataTable dt = null;
using (OleDbConnection con = GetDBConnection())
{
OleDbCommand cmd = new OleDbCommand(sql, con);
con.Open();
using (OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.KeyInfo | CommandBehavior.SchemaOnly | CommandBehavior.CloseConnection))
{
dt = dr.GetSchemaTable();
}
}
return dt;
}

/// <summary>
/// 根據輸入的查詢語句自動生成插入,更新,刪除命令
/// </summary>
/// <param name="sql">查詢語句</param>
/// <param name="insertCmd">插入命令</param>
/// <param name="updateCmd">更新命令</param>
/// <param name="deleteCmd">刪除命令</param>
public static void GenerateUpdateSQL(string sql, OleDbCommand insertCmd, OleDbCommand updateCmd, OleDbCommand deleteCmd)
{
sql = sql.ToUpper();
DataTable dt = GetTableSchema(sql);
string tableName = dt.Rows[0]["BaseTableName"].ToString();
List<OleDbParameter> updatePrimarykeys = new List<OleDbParameter>();//主鍵參數集合
List<OleDbParameter> deletePrimarykeys = new List<OleDbParameter>();//主鍵參數集合,因為不能同時被OleDbCommand個命令引用,所以多申明一個
List<OleDbParameter> insertFields = new List<OleDbParameter>();//欄位參數集合
List<OleDbParameter> updateFields = new List<OleDbParameter>();//欄位參數集合
string columns = string.Empty, values = "", set = "", where = "";
foreach (DataRow dr in dt.Rows)
{
if (dr["IsAutoIncrement"].ToString().Equals("False"))
{
insertFields.Add(new OleDbParameter("@" + dr["BaseColumnName"].ToString(),
(OleDbType)dr["ProviderType"],
Convert.ToInt32(dr["ColumnSize"]),
dr["BaseColumnName"].ToString()));
updateFields.Add(new OleDbParameter("@" + dr["BaseColumnName"].ToString(),
(OleDbType)dr["ProviderType"],
Convert.ToInt32(dr["ColumnSize"]),
dr["BaseColumnName"].ToString()));

if (!string.IsNullOrEmpty(columns))
columns += ",";
columns += dr["BaseColumnName"].ToString();
if (!string.IsNullOrEmpty(values))
values += ",";
values += "@" + dr["BaseColumnName"].ToString();
if (!string.IsNullOrEmpty(set))
set += ",";
set += dr["BaseColumnName"].ToString() + "=@" + dr["BaseColumnName"].ToString();
}
if (dr["IsKey"].ToString().Equals("True"))
{
updatePrimarykeys.Add(new OleDbParameter("@OLD_" + dr["BaseColumnName"].ToString(),
(OleDbType)dr["ProviderType"],
Convert.ToInt32(dr["ColumnSize"]),
ParameterDirection.Input,
Convert.ToBoolean(dr["AllowDBNull"]),
Convert.ToByte(dr["NumericScale"]),
Convert.ToByte(dr["NumericPrecision"]),
dr["BaseColumnName"].ToString(), DataRowVersion.Original, null));
deletePrimarykeys.Add(new OleDbParameter("@OLD_" + dr["BaseColumnName"].ToString(),
(OleDbType)dr["ProviderType"],
Convert.ToInt32(dr["ColumnSize"]),
ParameterDirection.Input,
Convert.ToBoolean(dr["AllowDBNull"]),
Convert.ToByte(dr["NumericScale"]),
Convert.ToByte(dr["NumericPrecision"]),
dr["BaseColumnName"].ToString(), DataRowVersion.Original, null));
if (!string.IsNullOrEmpty(where))
where += " and ";
where += dr["BaseColumnName"].ToString() + "=@OLD_" + dr["BaseColumnName"].ToString();
}
}

insertCmd.CommandText = string.Format("insert into {0} ({1}) values ({2})", tableName, columns, values);
updateCmd.CommandText = string.Format("update {0} set {1} where {2}", tableName, set, where);
deleteCmd.CommandText = string.Format("delete from {0} where {1}", tableName, where);
insertCmd.Connection = GetDBConnection();
updateCmd.Connection = GetDBConnection();
deleteCmd.Connection = GetDBConnection();
foreach (OleDbParameter pa in insertFields)
{
insertCmd.Parameters.Add(pa);
}
foreach (OleDbParameter pa in updateFields)
{
updateCmd.Parameters.Add(pa);
}
foreach (OleDbParameter pa in updatePrimarykeys)
{
updateCmd.Parameters.Add(pa);
}
foreach (OleDbParameter pa in deletePrimarykeys)
{
deleteCmd.Parameters.Add(pa);
}
}
}
}

熱點內容
普通電腦改伺服器風道風罩 發布:2024-11-28 04:52:28 瀏覽:453
什麼安卓手機像8p一樣 發布:2024-11-28 04:43:17 瀏覽:224
連接資料庫參數 發布:2024-11-28 04:43:15 瀏覽:807
聯想怎麼刷機解鎖密碼 發布:2024-11-28 04:31:21 瀏覽:244
方舟編譯器廠家 發布:2024-11-28 04:13:15 瀏覽:979
android源碼編輯 發布:2024-11-28 04:12:38 瀏覽:596
兩路伺服器是什麼意思 發布:2024-11-28 03:39:39 瀏覽:937
sql精簡版64 發布:2024-11-28 03:36:28 瀏覽:73
金立怎麼加密圖片 發布:2024-11-28 03:31:43 瀏覽:664
2017玩dnf電腦什麼配置 發布:2024-11-28 03:30:56 瀏覽:520