当前位置: 首页 > 编程日记 > 正文

用C#对ADO.NET数据库完成简单操作

作者:李阳 http://oraasp.vicp.net/article/article.aspx?ID=21

数据库访问是程序中应用最普遍的部分。随着C#和ADO.NET的引入,这种操作变得更简单。这篇文章将示范四种最基础的数据库操作。

● 读取数据。其中包括多种数据类型:整型,字符串,日期型。

● 写数据。如读数据一样,我们也需要写入多种类型的数据。这可以通过SQL语句来完成。

● 更新或修改数据。我们将再次用到SQL语句。

● 删除数据。用SQL实现。

上述的操作都要基于Microsoft Access 2000数据库,但是,我们要对连接字符串进行简单的修改才能使用SQL或其他ADO数据。

开始操作

在使用ADO类之前,我们将把ADO.NET的命名空间和一些常用数据类包括进来。把下面的代码加入到你想进行数据库操作的地方。它的具体位置应该是命名空间行之后,类声明之前。

using System.Data; // State variables 
using System.Data.ADO; // Database 
using System.Globalization; // Date 

你或许还要向System.Data命名空间添加参数,这取决于工程的类型需要。你所添加的代码的编译信息会提醒你这一点。添加System.Data命名空间的操作:

● 右键点击Solution explorer--参数选项;
● 选择添加参数;
● 选择.NET框架栏;
● 双击System.data.dll条目;
● 选择OK;
● System.data应该出现在Solution explorer的参数列表中了。

由于在多数操作中都会使用连接字符串,所以我建议你将它包含在使用的类中。

注意:程序中数据库文件的路径可能和下面不一样:

//Attributes
public const string DB_CONN_STRING = 
"Driver={Microsoft Access Driver (*.mdb)}; " + "DBQ=D://CS//TestDbReadWrite//SimpleTest.mdb";

读取数据

现在的操作就比较有趣了。读是通过ADODataReader类完成的(参看Chris Maunder的文章"The ADO.NET ADODataReader CLASS" 以了解更多)。读的操作步骤如下:

● 用ADO连接打开数据库

ADOConnection conn = new ADOConnection(DB_CONN_STRING); 
conn.Open(); 

● 创建一个SQL语句来确认要获取的数据。这条命令执行后返回一个ADODataReader对象。注意Execute方法中的OUT关键字。这是C#中传递参数的方式。

ADODataReader dr; 
ADOCommand cmd = new ADOCommand( "SELECT * FROM Person", conn ); 
cmd.Execute( out dr); 

● 循环遍历ADODataReader中的每条记录,直到完成。注意:数据被作为字符串直接返回。字段名显示了要读取的字段。

while( dr.Read() ) 
{ 
System.Console.WriteLine( dr["FirstName"] ); 
} 

● 清除

但是,作为优秀的程序员我们应该将代码放在try/catch/finally 中,确保我们能够控制所有意外。

try
{
.... the database operations ... 
}
catch( Exception ex )
{
System.Console.WriteLine( "READING:" ); 
System.Console.WriteLine( " ERROR:" + ex.Message ); 
System.Console.WriteLine( " SQL :" + sSqlCmd ); 
System.Console.WriteLine( " Conn.:" + DB_CONN_STRING ); 
}
finally 
{
// Close the connection
if( conn.State == DBObjectState.Open )
conn.Close(); 
}

读取不同的数据类型

["stuff"]通常可以返回某个类型的字符串。但是要获取一个整型或DateTime对象,就需要列出这些数据。以一个简单的例子或是ADODataReade内建的很多例子中的一个就可以说明。例如:

int nOrdinalAge = dr.GetOrdinal( "Age" ); 
int nAge = dr.GetInt32( nOrdinalAge ); 
DateTime tUpdated = (DateTime)dr["Updated"]; 

注意通过名字定位GetOrdinal字段的用法。如果字段是空的(没有填入值),上面的代码会引发一个异常。这种情况下我们用IsNull方法检验数据是否存在。

int nOrdinalAge = dr.GetOrdinal( "Age" ); 
if( dr.IsNull( nOrdinalAge ) ) 
{
System.Console.WriteLine( " Age : Not given!" ); 
}
else
{ 
int nAge = dr.GetInt32( nOrdinalAge ); 
System.Console.WriteLine( " Age : " + nAge );
}

插入,修改,删除和其他SQL命令

插入,修改,和删除用SQL语句很容易实现。下面的代码通过一个SQL命令插入一条记录:

// SQL command 
String sSQLCommand = "INSERT INTO Person (Age, FirstName, Description, Updated) " + 
"VALUES( 55, 'Bob', 'Is a Penguin', '2001/12/25 20:30:15' );"; 
// Create the command object 
ADOCommand cmdAdder = new ADOCommand(sSQLCommand,DB_CONN_STRING); 
cmdAdder.ActiveConnection.Open(); 
// Execute the SQL command
int nNoAdded = cmdAdder.ExecuteNonQuery(); 
System.Console.WriteLine( "/nRow(s) Added = " + nNoAdded + "/n" ); 

注意:try/catch并未出现在上述例子中,实际上是需要写的。

插入

上述代码通过一条SQL语句插入一条记录。这条命令稍后执行。命令格式中需要注意的是:

● 数值直接赋值,不同单引号(');
● 字符串必须用单引号括起来 ('blah');
● 字符串中不能包含任何单引号或是双引号;
● 日期和时间都要以国际格式包括在单引号中。('YYYYY/MM/DD HH:MM:SS')

修改

UPDATE命令指示了要被修和已做修改的记录。ExecuteNonQuery()返回的值显示变化的纪录的数目,这样如果在表格中有5个Peter那它就会返回5。

String sSQLCommand = "UPDATE Person SET Age = 27 WHERE FirstName = 'Peter'"; 

删除

DELETE命令显示要被删除的纪录。这可能会是几条。ExecuteNonQuery()返回的值显示变化的纪录的数目,这样如果表中有2个Bobo就返回2。这两个Bobo都会被删除。

String sSQLCommand = "DELETE FROM Person WHERE FirstName = 'Bobo'"; 

关于样例程序

样例是个简单的控制程序,它执行Microsoft Access数据库中提供的所有操作。在Visual Studio.NET IDE将TestDbReadWrite.csproj 作为工程文件打开就可以编译它。在MainConsole.cs中改变DB_CONN_STRIN的值,让其指向SimpleTest.mdb,编译它。

结论

现在你可以在C#中执行基础数据库操作了。找时间学学SQL,也要多读些有关它工作原理的文章。如果你感到厌倦了,到www.mctainsh.com上去看一下更新的代码。

相关文章:

用createrepo配置Yum本地源

yum配置本地源, 在网速差的情况下,yum用在线源是一件头痛的事,所以以下为yum的本地源配置可以有好解决这个事。 1,安装createrepo包, 可以用yum安装(yum install createrepo -y); 也可以安装rpm或tar包 (网址:createre…

首次在手机端不牺牲准确率实现BERT实时推理,比TensorFlow-Lite快近8倍,每帧只需45ms...

作者 | 王言治 出品 | AI科技大本营(ID:rgznai100) 基于Transformer的预训练模型在许多自然语言处理(NLP)任务中取得了很高的准确度。但是这些预训练模型往往需要很大的计算量和内存。由于移动平台的存储空间以及计算能力的限制&a…

[svc]caffe安装笔记-显卡购买

caffe,这是是数据组需要做一些大数据模型的训练(深度学习), 要求 服务器显卡(运算卡), 刚开始老板让买的牌子是泰坦的(这是2年前的事情了). 后来买不到这个牌子的,(jd,tb)看过丽台的,看过gtx系列的哪个型号来着, 也不合适,后来买的特斯拉显卡 [查了下一些知名的显卡牌子](https…

AABO:自适应最优化Anchor设置,性能榨取的最后一步 | ECCV 2020

编译 | VincentLee来源 | 晓飞的算法工程笔记Introduction目前,主流的目标检测算法使用多种形状的anchor box作为初始预测,然后对anchor box进行回归调整,anchor box的配置是检测算法中十分重要的超参数。一般而言,anchor box的配…

Android列表控件选项中添加进度框ProgressBar实现

今天有时间就学习了下在ListView、GridView列表项中清加ProgressBar,小马用最简单的代码实现可以通用的功能,人人都能看懂,哈哈,直接说下,如果你的适配器getView方法返回的View是一个自定义控件的话,有点不好实现哦&am…

写一个通用数据访问组件

出处:http://www.csharp-corner.com willsound(翻译) 我收到过好多Email来问我如何用一个通用的数据提供者(data provider)在不失自然数据提供者(native data provider)稳定而强大功能的前提下来访问不同的数据源(data sources).一个小伙子…

InstallShield 2015 LimitedEdition VS2012 运行bat文件

转载:http://www.cnblogs.com/fengwenit/p/4271150.html 运行bat文件 网上很多介绍如何运行bat的方法,但我这个是limted 版本,不适用。 1. 打开 Define Setup Requirements and Actions –> Custom Actions 2. 右健 After Register Product –> Ne…

理解C#中的string类型

作者:未知目的 本文的目的在于揭示和DOTNET及C#相关的一些常见的和不常见的问题。在这些问题中我的第一篇文章和string数据类型有关,string数据类型是一种引用类型,但是当和其他引用类型比较的时候,很多开发人员可能并不能完全理解它的行为。 问题 对于常见的引用类…

最全总结!聊聊 Python 操作PDF的几种方法

作者 | 陈熹来源 | 早起Python前言本文主要涉及:os 模块综合应用glob 模块综合应用PyPDF2 模块操作基本操作PyPDF2 导入模块的代码常常是:from PyPDF2 import PdfFileReader, PdfFileWriter这里导入了两个方法:PdfFileReader 可以理解为读取器…

three.js(六) 地形法向量生成

2019独角兽企业重金招聘Python工程师标准>>> 上一节采用 分形算法生成地形的高度值, 接着我们需要生成每个顶点的法向量。 three.js 的PlaneGeometry 自带有法向量, 法向量分为两种 即 平面法向量 和 平面每个定点法向量。 因此一个n*n 块组成…

ASP.NET中使用多个runat=server form

作者&#xff1a;未知ASP.NET 在同一个页面不支持多个 runatserver forms&#xff0c;要解决这个问题&#xff0c;可以把每个 form 放在一个单独的 panel 控件中&#xff0c;这样用户就可以简单地通过单选按钮在不同 panel 间切换。代码如下&#xff1a;2FormExample.aspx<%…

激发企业大“智慧” | 深度赋能AI全场景 揭秘你不知道的移动云

2020年是人工智能技术发展的关键年。疫情之下&#xff0c;世界见证了人工智能在抗击疫情中发挥的积极作用&#xff1b;今年4月&#xff0c;国家发改委正式将人工智能确定为新基建的重要领域之一。在历史机遇下&#xff0c;AI已实现"质变和量变"&#xff0c;正迈入与技…

ExtJS 4.x 得到资源树上任意的节点对象

上半年做ExtJS 4.x 的时候&#xff0c;遇到过对资源树操作的情况&#xff1a; Ext.tree.Panel 如下图&#xff1a;目的&#xff1a; 直接根据每个节点的{任意key : 对应value}&#xff0c;就能找到匹配的节点对象 代码如下&#xff1a; refs : [ { selector : rtree, …

【转载】mysql常用函数汇总

转载地址&#xff1a;http://www.jb51.net/article/40179.htm 一、数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制&#xff08;OCT返回八进制&#xff0c;HEX返回十六进制&#xff09;CEILING(x) 返回大于x的最小整数值EXP(x) 返回值e&#xff08;自然对数的底&…

有关java的一些话

2019独角兽企业重金招聘Python工程师标准>>> 跟着做完TankWar&#xff0c;java才算是入门了&#xff0c;真正学习java从看尚学堂马士兵老师的视频开始&#xff0c;至今三个月已过&#xff0c;感谢马老师的精彩讲解&#xff0c;您才是我真正的java入门老师&#xff0…

ADO.NET 2.0中的SqlCommand.ExecutePageReader

http://blog.joycode.com/liuhuimiao/在.NET 2.0 PDC或Beta1中&#xff0c;可以看到SqlCommand对象新增了个ExecutePageReader方法&#xff0c;该方法实现了分页读取数据的功能。对于分页读取数据&#xff0c;在ADO.NET1.1中&#xff08;当然2.0也适合&#xff09;一般常用动态…

组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战

来源 | MyEncyclopedia上一篇我们从原理层面解析了AlphaGo Zero如何改进MCTS算法&#xff0c;通过不断自我对弈&#xff0c;最终实现从零棋力开始训练直至能够打败任何高手。在本篇中&#xff0c;我们在已有的N子棋OpenAI Gym 环境中用Pytorch实现一个简化版的AlphaGo Zero算法…

2020职场人裸辞三大原因:不开心、工资低、没有盼头

近期&#xff0c;脉脉发布了《2020职场人裸辞现状调研报道》&#xff0c;报道显示2020最让职场人想裸辞的三大原因为&#xff1a;不开心、工资低、没有盼头。报告数据中还显示&#xff0c;工资不满预期是最让人想要裸辞的主要原因&#xff0c;但有超过6成职场人表示&#xff0c…

Oracle PL/SQL编程学习笔记:Merge方法的使用

Oracle11g的Merge很强大&#xff01; 1 create or replace procedure BRANCE_REPORT_MERGE is2 3 begin4 Merge into BRANCHREPORT desttable5 using TEMP_BRANCHREPORT tmptable6 on (desttable.SENDER_IDtmptable.SENDER_ID and desttable.BRANCH_IDtmptable.BRANCH_ID…

2.0中获取数据库连接统计数据

作者&#xff1a; http://blog.joycode.com/liuhuimiao/.NET 2.0中的SqlConnection多了一个StatisticsEnabled属性和ResetStatistics()、RetrieveStatistics()两个方法&#xff0c;用于获取SQLServer的连接统计数据。当然&#xff0c;这样做是以性能损耗为代价的&#xff0c;但…

Python学习day5作业-ATM和购物商城

Python学习day5作业Python学习day5作业ATM和购物商城作业需求ATM&#xff1a;指定最大透支额度可取款定期还款&#xff08;每月指定日期还款&#xff0c;如15号&#xff09;可存款定期出账单支持多用户登陆&#xff0c;用户间转帐支持多用户管理员可添加账户、指定用户额度、冻…

60分钟看懂HMM的基本原理

作者 | 梁云1991来源 | Python与算法之美HMM模型&#xff0c;韩梅梅的中文拼音的缩写&#xff0c;所以又叫韩梅梅模型&#xff0c;由于这个模型的作者是韩梅梅的粉丝&#xff0c;所以给这个模型取名为HMM。开玩笑&#xff01;HMM模型&#xff0c;也叫做隐马尔科夫模型&#xff…

获取远程网卡MAC地址

出自&#xff1a; http://blog.joycode.com/liuhuimiao/朋友mingal急问我有关获取远程网卡MAC地址的ASP.net实现。我一开始以为是获取本机MAC地址&#xff0c;说了几种方法给他。由于他还需要获取服务器&#xff08;本机&#xff09;相关信息&#xff0c;如硬盘序列号、CPU信息…

[hadoop源码阅读][9]-mapreduce-概论

hadoop的mapreduce的运行流程大概就是如下图所示了 如果要是文字描述,估计要大篇幅了,大家可以参考下面的参考文档. 参考文档 1.http://caibinbupt.iteye.com/blog/336467 2.http://hadoop.apache.org/docs/r0.19.2/cn/mapred_tutorial.html 3.http://developer.yahoo.com/hado…

【小白的CFD之旅】小结及预告

这是小白系列的索引&#xff0c;后续会继续更新。 已更新的部分 01 引子02 江小白03 老蓝04 任务05 补充基础06 流体力学基础07 CFD常识08 CFD速成之道09 初识FLUENT10 敲门实例11 敲门实例【续】12 敲门实例【续2】13 敲门实例【续3】14 实例反思15 四种境界16 流程17 需要编程…

Kaggle金牌得主的Python数据挖掘框架,机器学习基本流程都讲清楚了

作者 | 刘早起来源 | 早起Python导语&#xff1a;很多同学在学习机器学习时往往掉进了不停看书、刷视频的&#xff0c;但缺少实际项目训练的坑&#xff0c;有时想去练习却又找不到一个足够完整的教程&#xff0c;本项目翻译自kaggle入门项目Titanic金牌获得者的Kernel&#xff…

input type右对齐与只读的

右对齐的 <input type"text" style"background:#efefef; text-align:right" readonly value"this" /> 只读的input <input type"text" name"nodeCode" readonly value"<%functionNodeForm.getNodeCode()%…

如何从sdcard读取文件

2019独角兽企业重金招聘Python工程师标准>>> 首先&#xff0c;我们必须明白文件储存格式是有许多种的&#xff0c;如utf-8,unicode等。 那么&#xff0c;我们如何将文件原封不动的读取出来呢&#xff0c;我们可以设定&#xff0c;文件储存的绝对路径为filepath。则代…

HDU 2034 人见人爱A-B

人见人爱A-B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 77157 Accepted Submission(s): 21509 Problem Description参加过上个月月赛的同学一定还记得其中的一个最简单的题目&#xff0c;就是{A}{B}&#…

Java中的包,类的导入,静态导入

包的作用 1. 为了更好的组织代码&#xff0c;能够将自己的代码与代码库的代码分离。 2. 在需要合作完成的工作中&#xff0c;可以使用分包的方式来尽量的减少类命名的冲突。 Sun公司推荐程序员使用公司域名的反向字符作为公司项目的起始包名&#xff1a;如 baidu.com --> c…