现在写程序要完全不沾数据库的边恐怕很难,那么用C#写程序也是一样,会经常遇到数据库方面的问题。在C#中操作数据库是使用ADO.Net来完成,而显示数据这一方面常常要用到的是DataGrid这个组件,因此这两个问题也是论坛中问得最多的。
对于ADO.Net来说,涉及的问题大致分为如下几类:
第一类,数据库的连接问题;
第二类,数据库操作方面的问题,查询、更新等等;
第三类,对数据集的操作问题;
最后一类,就是前三者的部分综合或者扩展问题。
对于DataGrid来说,大多数属于操作问题,而操作问题会随着应用不同而不同。
这次我写这篇文章不是给每个问题提出一个解决的方法,因为数据库方面的问题千奇百怪,会随着不同应用而变化万千。与其用一两个方法来解决部分问题,不如提供一个检查、分析和处理的整套步骤,从而让大家来提高自身分析问题和解决问题的能力。
先说说ADO.Net相关问题,首先用它写程序的时候,要明白各个类是干什么。如果你初次接触ADO.Net,或者对它还不是很了解的话,建议你先看看这篇文章,从而对它有个初步的了解。
http://blog.csdn.net/knight94/archive/2006/04/15/664530.aspx
现在就开始对问题一来进行分析。对于数据库连接所出现的错误,基本上有如下两个原因所造成的。
第一个,连接字符串书写不对;
第二个,所采用的方式不对。
PS: 其实第二点严格意义上也应该属于第一点的范畴。
那么如何检查一个连接字符串不对呢,其实对于编程者来说,当接触到一个新技术的时候,首先要学会模仿,即参照别人写的。
那么对于数据库连接字符串的规范写法,如下这个网站可以参考。
http://www.connectionstrings.com
这个网站包罗了各种数据库,对于每种数据库都提供了不同的连接方法。那么看了别人所写的连接字符串之后,比对自己所写的,看看有什么不同。如果想了解各个部分的名词意思,那我建议你在MSDN中查阅“SqlConnection.ConnectionString”,就可以获得比较详细的解释。等大概领悟后,就要亲自动手试着修改自己的连接字符串来满足当前的环境。
对于第二类问题,比较常见的例如,连接SQL Server的时候,本应该使用SQL Server认证来连接,却使用了Windows认证。这种情况下,表面上连接字符串是对的。那么如何排除这类错误呢,其实比较简单,你可以用SQL Server提供的工具去按照这种方式进行连接,看是否成功,等你发现这种连接无法成功的时候,你就知道在设置连接字符串的时候出现问题。解决这类问题的办法,你可以修改连接字符串来匹配当前环境(其实通过设置数据库来使当前Windows认证合法,这个方法你可以参考相关数据库的手册来完成)。
除此外,当使用文件作为数据源的时候,要注意文件路径是否正确,为了确保能访问到文件,我建议你在程序中把相对路径转化成绝对路径;其次在Web访问的时候,要设置Aspnet用户对此目录具有访问权限等等。
经过如上的分析,对于一个连接字符串所产生的问题基本可以解决。
第二类问题,对数据库操作的问题。
这个问题绝大一部分是由于形成SQL语句的时候,是采用拼接字符串的做法,这样会导致单引号问题,类型转换问题,空格问题,逗号问题等等,用一句话概括就是SQL语法错误问题。那么如何最大避免此类错误呢,我建议你使用参数,这样可以是你的SQL语句简洁,而且容易检查出语法错误。
其次要学会使用工具,对于数据库软件来说,一般都提供类似的消息检查工具,例如:SQL Server所提供的事件探查器(英文为Profiler),它可以捕获到传递到SQL Server的SQL命令,从中你可以检查到你的语句是否被发送了,如果有问题的话,可以把相关的语句转到SQL Server提供的查询分析器中执行,看看具体的错误是什么,然后再返回来修改你的SQL语句,已达到SQL语句正确地执行。
有人说了,对于简单点儿的SQL语句还能书写,稍微复杂点儿的就不会了,这方面的知识没有系统学过。那么我建议你抽空补补这方面的知识,同时在机器上装上SQL Server的帮助文档,遇到不会写的SQL语句,查看帮助你会得到很详细的说明。而对于SQL语句的练习,可能用编程实现反映会比较慢,那么我建议你使用SQL Server提供的查询分析器之类的工具。
也就是说,要写一个数据库相关的程序,手头上除了VS外,还要具有以下工具(以SQL Server为例):
1. 查询分析器;
2. 事件探查器(英文为Profiler);
3. SQL Server的帮助文档。
有了这三件工具,基本上与SQL语句相关的问题都能解决。
操作数据库所产生的问题除了SQL语句的问题之外,大多数是因为对于ADO.Net的几个类使用不合理,这方面的问题建议你看我前面所介绍的文章(关于ADO.Net基础的那篇文章)。
对于数据集操作的问题,无非就是过滤,查找或者在原有基础上产生一个新的数据列等等。
对于过滤,这方面参看DataView这个类就行了,或者说只要吃透MSDN中对于这个类的构造函数的相关解释就行了。
对于查找,有两种方法,对于排序关键字的查找,可以使用DataView.Find或者DataView.FindRows,这个仅限于过滤后的查找;而后一种,则比较通用,即DataTable.Select方法。至于这两种方法的使用细节,参看MSDN相应章节就可以明白。
那么有人就问了,对数据集的过滤和查找,所能支持的哪些SQL语句呢,这方面在MSDN中查看“DataColumn.Expression”就可以了解,其中有很详细的列表。
上面所说的刚好解决了在原有的基础上产生新的数据列的问题,那么有时候可能还会遇到统计问题,这方面可以使用“DataTable.Compute”方法来实现。
不过对于数据集中所能提供的SQL语句和统计方法都很有限,不能产生类似于“group”之类的复杂语句,那么遇到这种情况,我建议你直接用SQL语句操作数据库来实现。如果用SQL语句都无法实现的话,那你只有通过foreach这种最朴实的方法来做。
对于数据集操作的问题,我不想花太多的语句,因为MSDN对于它们的解释已经很全面了,所以我这里只是提了一下关键点,相关的内容需要大家动手去查阅。
最后要说说前三类问题的部分综合或者扩展问题,这类问题牵扯的范围就更广,更面向具体应用。
那么造成这类问题的原因,有一部分是操作混乱造成的。这时候在解决它的时候,你首先要花一段时间来理清思路,想想完成某项功能的时候,应该先做什么,后做什么,步骤之间有什么关联,等完全明白了,再去动手编码。
还有一部分是由于数据库的设计而造成。这方面从程序方面基本上无法弥补,或许说从程序进行解决只是暂时性的,而不是长远性的。比较好的办法就是完善数据库的设计。而如何去设计一个合理的数据库,那我只能建议你看看数据库一些相关的书,看看相关的成熟架构。
对于ADO.Net相关的四个问题,我已经基本说完,如何把我所说的真正应用到实际编程过程中才是至关重要。
而CSDN中另一个问得比较多的问题就是关于DataGrid的问题,涉及到它的问题无非是操作问题或者扩展问题。
我这里推荐两个地址,对于VS2003中的DataGrid问题,参看
http://www.syncfusion.com/FAQ/WindowsForms/Default.aspx#44
对于VS2005中的DataGridView问题,参看
http://www.codeproject.com/books/PresentDataDataGridView.asp
对于95%以上的问题,都可以从上面的地址中找到答案。与此同时需要提醒的一点是,参看别人例子的时候,除了理解外要学会灵活应用,不要问题一变就傻瞪眼*_*。
好了,对于ADO.Net和DataGrid就说到这儿,希望对你有所帮助。