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 ...
随机推荐
- prim 算法和 kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- Hibernate *.hbm.xml对象关系映射文件详解
在hibernate中表与pojo对象是一一对应的,通过hbm文件将数据库表与实体关联起来,本文将对hbm文件进行介绍. pojo对象:提供了公共的无参构造方法 ,通过反射产生对象. ...
- [BZOJ 4719] 天天爱跑步
Link: BZOJ 4719 传送门 Solution: 感觉求LCA又有了新姿势啊:$Tarjan$离线$O(n+m)$ 每次递归返回时将子树和父节点合并,如果询问节点已访问过则LCA就是已合并的 ...
- AOP 面向切面 记录请求接口的日志
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点, ...
- 【9.7校内测试】【二分+spfa】【最长上升子序列】【状压DP+贪心(?)】
刘汝佳蓝书上的题,标程做法是从终点倒着$spfa$,我是二分答案正着$spfa$判断可不可行.效果是一样的. [注意]多组数据建边一定要清零啊QAQ!!! #include<iostream&g ...
- bzoj 1006 弦图染色
给定一个弦图,问最少染色数. 对于弦图的一个完美消去序列,从后往前染色,每次染可以染的最小编号的颜色,由完美消去序列的定义,序列任一后缀的点的导出子图中,由该后缀第一个元素及其邻接点导出的子图一定是完 ...
- OpenAPI安全防护
1,开放API可能存在的数据安全问题 (1)数据窃取 通常体现为:钓鱼网站,拦截,伪装,截包 (2)数据篡改 中间被拦截,以代理的方式拦截数据,修改数据 (3)数据泄露 爬虫抓取核心数据 2,解决数据 ...
- Educational Codeforces Round 12 D. Simple Subset 最大团
D. Simple Subset 题目连接: http://www.codeforces.com/contest/665/problem/D Description A tuple of positi ...
- 51nod 1035 最长的循环节 数学
1035 最长的循环节 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1035 Description 正整 ...
- HDU 4687 Boke and Tsukkomi (一般图匹配带花树)
Boke and Tsukkomi Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Othe ...