C#基础视频教程6.1 如何简单读写数据库
要理解MySQL,SQLServer,ACCESS都是数据库的品牌,不同品牌的数据库在不同的领域,适用场合有所不同。ACCESS应该是最简单,至少是Windows上最容易上手的数据库,MySQL可能跟PHP搭配在做网站的时候用的比较多,SQLServer跟ASP.NET搭配做服务器。由于ACCESS有很多版本,我们为了兼容之前的版本,尽量使用ACCESS2003的数据库(MDB格式,往后的版本可能是ACCDB的格式),比如我安装的是ACCESS2010,首先在选项中修改默认的空白数据库格式为2003的
ACCESS2010下载(Office2010自带了) :链接:http://pan.baidu.com/s/1o7Tjp3O 密码:6wxi
然后文件-新建-空数据库,默认是表1,并且里面是空的
右击表1,切换到设计视图,然后修改字段名称,数据类型和备注(第一个ID前面有一把钥匙,这个是数据库的主键,就是说数据库的每一条记录为了唯一区分开来,都需要一个唯一的ID,如同每个人都可以有相同的名字,性别,但是要有唯一的身份证号码区分开来,否则双胞胎就没法区分了。也可以取消ID的主键,自己设置其他属性为主键,甚至某些特殊的数据库不需要主键,但是这里先不做探讨)
每一个字段对应的数据类型也可以很复杂,但是初学者也暂时不考虑节省存储空间,编码格式,溢出等问题,都按照默认即可
双击表1,然后随便输入几条测试信息(注意在前面我们已经定义了ProductCount是数字,如果输入非法数值会提示)
创建最简单的读取数据库程序(只需要注意数据库的实际位置,要选择的表名称)
最简单的显示数据库的方法是放到一个DataGridView里面,点击button1确实把数据库的东西都弄出来了
为了更加简化操作,也可以点开服务器资源管理器,然后数据连接,添加连接,选择数据源,继续,只要选中数据库的文件路径即可(测试连接确认通过)
然后右击这个数据库,属性,复制连接字符串就可以了(作为代码部分的连接使用)
如果要用C#连接带密码的数据库,则需要在额外添加一行(这个微软没有做好,你跟上面一样复制字符串没什么用)
注意在执行任何SQL命令之前首先要关闭数据库(ACCESS软件也关了),初学者还是需要把命令放在try catch语句里面,方便知道自己哪里有问题
首先把数据库的连接对象做成全局的,只在Form加载的时候执行一次(下面一节我们会把这些封装成类库,做的更加标准,为了测试方便暂时先不管)
仅仅连接是不够的,数据库一共有四项操作:增/查/删/改,先来看查询语句,因为我们在前面定义数据库的时候,就自己定义了字段,所以查询的时候可以按ID,产品名称,产品数量等等查询,注意查询的内容如果是数字不需要加单引号,如果不是就要加(可以仔细分析下面两句话),这个Select XXX from XXX where XXX=XXX是SQL的标准语法(不管你用什么品牌的数据库,用什么语言编程,这个语句都是标准的,在真实的SQL语句中不可能这么简单一句话,比如你淘宝搜东西,会按价格排序,再价格排序的基础上找到信用最好的,再在信用最好的里面优先显示曾经买过的或者黄钻买家经常买的,所以多层的SQL语句的嵌套,模糊查询,让SQL语句更加精简高效等等也是一门很深的学问,在这里我不做探讨)
Select * from 表1 where ID=2
Select * from 表1 where ProductName='苹果'
我们暂时只需要掌握如何把查询结果正确的显示出来(还是跟数据库定义字段的时候一致),以及如果查不到结果,还有SQL语句组织错误的时候给与显示,为了更加有条理的跟数据库对应字段匹配,可能我们更应该把变量做到一个结构体里。
再来看新增指令,ACCESS数据库不需要我们新增主键的ID,他会自动增加并且保证不重复,每次插入一条记录的时候,只需要其他字段对应就可以(可以打开ACCESS数据库刷新看效果,不要切换到设计视图就可以)
INSERT INTO 表1(ProductName,ProductCount,ProductSource,ProductPlace) VALUES ('XXX','123','XXX','XXX');
读者可以测试一下插入一条新的数据的时候,故意给非法值的情况,比如产品数量是数字类型,给一个ABC(try catch会给出提示,但是实际上如果做得比较严谨,还是不应该到执行SQL失败了以后才报错,因为try catch会浪费大量资源,我们应该在插入之前就把每一个字段是否有问题检查好,不行就根本不应该打开数据库,执行这条命令)
再来看删除,如果根据ID删除一定是一条记录,如果根据其他属性,可能删除的有多条记录(同样数据库会有显示,刷新之后就没了)
delete * from 表1 where ID=29
delete * from 表1 where ProductName='XXX'
最后看更新记录,其实跟前面的语句也非常相似了(这里为了方便起见还是以ID为依据进行修改,其实很多时候比如物料仓库系统,我们总是先根据物料编号或者物料名称查询得到一个结果,这个结果可能包含了不止一条记录都列出来,然后在众多记录中找到我们要的记录,点击更新之后再定位到显示出来的那条记录的ID去,ID是不需要显示的,但是ID却始终是增查删改的依据)
UPDATE 表1 SET ProductName='YYY',ProductCount='111',ProductSource='ZZZ',ProductPlace='WWW' where id=34
最后我们再回过头来看一下如何从DataGridView直接跟ACCESS数据库对接,需要注意的是实际上真的直接这样做的并不多见,因为大部分涉及到数据的应用都会有几百万条以上的数据,你不可能直接把所有东西都显示到一个WinForm的控件上,也不可能WinForm更新了一笔数据,就要把整个数据库折腾一次。更何况从控件到内容,数据库的输入不允许非法字符(引号之类的),这些问题的专业处理都是要考虑的,我们用ACCESS小型数据库搭建一个测试环境,纯粹学习的角度没有问题。
在读取ACCESS数据库中,我列举了两种方法,简单的几行搞定,复杂的没有使用微软提供的OleDbDataAdapter类,但是两者都是要把ACCESS数据库的内容誊写到DT表上,然后设置数据源就完了
还有删除记录和更新记录,也都可以用比较傻瓜的方法实现(删除的时候先删除控件的,再从DataTable更新SDA),删除的本质在这里还是更新
直接绑定数据的问题:输入非法值的报错
直接绑定数据的问题:主键也可以被修改,但是没有更新到真实的数据库(理论上不应该允许编辑ID这一列,而且即便不允许编辑,仍然无法保证自动生成的序号数据库一定不存在,这里我改成一样之后点更新不会报错,但是实际也不会执行,就不受控制了,可以点遍历数据库再恢复默认)
还有一些别的问题可以研究,比如在控件上直接添加数据库的绑定(点开控件的小三角,然后添加项目数据源,点击下一步)
选择一个数据库,然后新建连接,点击下一步,绑定到已有的数据库(这样这个数据库会复制到项目文件夹下,而且初始化的时候会自动更新到控件dataGridView,但是傻瓜也有傻瓜的缺点,他会自动生成一些代码和控件,你的整个程序更加不受控了,而且这种绑定之后也不能完全实现ACCESS到DataGridView的完美链接,要想做的好必须自己封装类库,让功能符合自己的需求,下一节我们会尝试做数据库读写类的封装)
更多教学视频和资料下载,欢迎关注以下信息:
我的优酷空间:
http://i.youku.com/acetaohai123
我的在线论坛:
http://csrobot.gz01.bdysite.com/
问题交流:
QQ:910358960
C#基础视频教程6.1 如何简单读写数据库的更多相关文章
- C#基础视频教程6.3 如何简单读写数据库
在继续往下做之前,我们需要把之前的代码尽可能的精简(会对后面很有好处,而且读者也应该仔细比对这一部分的代码和上一部分哪里真正得到了优化,从而提高编程水平). 首先数据库的操作类有哪些是可以做的更加普遍 ...
- C#基础视频教程6.2 如何简单读写数据库
上一节我们简单介绍了数据库的读写,所使用的数据库都是随便写的(用水果代替,但不是真正的食品零售数据表,至少没有价格,销量等等).这一节我们思考如何实现一个测试题的数据库,所谓的测试题数据库就是假定系统 ...
- C#基础视频教程5.3 如何编写简单的超级热键
跟前面一章讲解计算器一样,到最后一小节,我们总是要把代码规整好,让整个程序显得非常简洁,先做个文件夹把我们自定义的类库都放进去 然后我们开始整理Form1里面的代码,为了实现超级热键的功能,我们应 ...
- JavaScript基础视频教程总结(131-140章)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- JavaScript基础视频教程总结(081-090章)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- JavaScript基础视频教程总结(001-010章)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- JavaScript基础视频教程总结(011-020章)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述 PV操作是对信号量进行的操作. 进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...
- python3基础视频教程
随着目前Python行业的薪资水平越来越高,很多人想加入该行业拿高薪.有没有想通过视频教程入门的同学们?这份Python教程全集等你来学习啦! python3基础视频教程:http://pan.bai ...
随机推荐
- 洛谷——P2071 座位安排 seat.cpp/c/pas
P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...
- Redis学习篇(九)之生存时间
EXPIRE 设置生存时间,以秒为单位 #### EXPIREAT 设置生存时间,秒时间戳格式 #### PEXPIRE 设置生存时间,毫秒为单位 #### PEXPOREAT 设置生存时间,毫秒时间 ...
- 全景图从拍摄到 online
全景图从拍摄到 online Panorama, CSS3, Canvas, 3D 2015-11-04 拍摄设备 照片拼接 制作 3D Cube Demo 拍摄设备 电动自动全景云台 Gigapan ...
- 【Floyd算法】Gym - 101572I - Import Spaghetti
题意:有向图最小环,输出方案. #include<cstdio> #include<iostream> #include<string> #include<a ...
- poj 2342 && hdu 1520 树形dp
题意:有n个人,接下来n行是n个人的价值,再接下来n行给出l,k说的是l的上司是k,这里注意l与k是不能同时出现的 链接:点我 dp[i][1] += dp[j][0], dp[i][0] += ma ...
- bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- Android 动画——属性动画Property Animation
Android在3.0之前只提供了两种动画:View Animation .Drawable Animation .也就是我们在<Android 动画——Frame Animation与Twee ...
- 【转】2012年7月9 – 知名网页游戏公司 PHP高级工程师 最新面试题
开头先唠叨两句,今天下午,上海的天热的让人窒息啊.Google下地图,好远!要做公交,想想就是人挤人.咬了下牙,打的,尼玛百来块啊,有木有!麻麻的,更让我萌生买车的决心了. 到了公司,环境不错.前台拿 ...
- VS2010下面Empty Project使用
VS2010下面Empty Project使用:1,添加代码HelloApp #include <afxwin.h> class CHelloApp:public CWinApp{publ ...
- java什么时候声明static方法
1.经常用到的方法,可以声明为static,这样省去了每次new对象的内存空间,因为非static方法,需要new对象才能调用此方法.但因此也产生多线程访问线程安全问题 比如: 2.当一个方法或者变量 ...