当前位置:首页 » 操作系统 » 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);
}
}
}
}

热点内容
我的世界国际服创建服务器pc 发布:2024-11-28 07:20:53 浏览:772
编译原理LR分析法pdf 发布:2024-11-28 07:17:41 浏览:263
安卓光遇版本怎么看 发布:2024-11-28 06:29:52 浏览:870
oraclesql加密 发布:2024-11-28 06:29:15 浏览:900
图片缓存工具 发布:2024-11-28 06:29:15 浏览:962
有文件夹删不掉怎么办 发布:2024-11-28 06:22:50 浏览:526
python3怎么用 发布:2024-11-28 06:10:58 浏览:255
安卓盒子内存小怎么办 发布:2024-11-28 06:10:57 浏览:809
车企减配哪些配置好 发布:2024-11-28 05:55:18 浏览:674
传说对决上传照片 发布:2024-11-28 05:49:18 浏览:465