ADO.NET + DataGrid的问题

现在写程序要完全不沾数据库的边恐怕很难,那么用C#写程序也是一样,会经常遇到数据库方面的问题。在C#中操作数据库是使用ADO.Net来完成,而显示数据这一方面常常要用到的是DataGrid这个组件,因此这两个问题也是论坛中问得最多的。
 
对于ADO.Net 来说,涉及的问题大致分为如下几类:
第一类,数据库的连接问题;
第二类,数据库操作方面的问题,查询、更新等等;
第三类,对数据集的操作问题;
最后一类,就是前三者的部分综合或者扩展问题。
对于DataGrid 来说,大多数属于操作问题,而操作问题会随着应用不同而不同。
 
这次我写这篇文章不是给每个问题提出一个解决的方法,因为数据库方面的问题千奇百怪,会随着不同应用而变化万千。 与其用一两个方法来解决部分问题,不如提供一个检查、分析和处理的整套步骤,从而让大家来提高自身分析问题和解决问题的能力。
 
先说说ADO.Net相关问题,首先用它写程序的时候,要明白各个类是干什么。如果你初次接触ADO.Net,或者对它还不是很了解的话,建议你先看看这篇文章,从而对它有个初步的了解。
 
现在就开始对问题一来进行分析。对于数据库连接所出现的错误,基本上有如下两个原因所造成的。
第一个,连接字符串书写不对;
第二个,所采用的方式不对。
PS: 其实第二点严格意义上也应该属于第一点的范畴。
 
那么如何检查一个连接字符串不对呢,其实对于编程者来说,当接触到一个新技术的时候,首先要学会模仿,即参照别人写的。
那么对于数据库连接字符串的规范写法,如下这个网站可以参考。
这个网站包罗了各种数据库,对于每种数据库都提供了不同的连接方法。那么看了别人所写的连接字符串之后,比对自己所写的,看看有什么不同。如果想了解各个部分的名词意思,那我建议你在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问题,参看
 
对于VS2005中的DataGridView问题,参看
 
对于95%以上的问题,都可以从上面的地址中找到答案。 与此同时需要提醒的一点是,参看别人例子的时候,除了理解外要学会灵活应用,不要问题一变就傻瞪眼*_*
 
好了,对于ADO.Net和DataGrid就说到这儿,希望对你有所帮助。
 
参与评论 您还未登录,请先 登录 后发表或查看评论
本书是使用Microsoft Visual Studio .NETADO.NET编写高可伸缩性、可用Web数据库应用程序开发人员必备指南。介绍了如何使用ADO.NET在企业级Web应用程序中访问、排序和处理数据。通过书中丰富实例和工具,读者能够了解编写、测试与调试数据库应用程序代码方法。本书还介绍了ADO.NET对象模型,用于Web扩展性XML特性,与SQL Server 2000集成。 全书共分5大部分。第I部分提供了ADO.NET对象模型概要叙述,并且提供了【数据窗体向导】指导内容。第Ⅱ部分介绍了如何使用.NET数据提供程序中不同对象——Connection、Command、DataReader和DataAdapter对象。第Ⅲ部分包含了对ADO.NET对象模型中脱机对象讨论——DataSet、DataTable、DataColumn、DataRow、DataRelation和DataView对象。这一部分还介绍了使用DataAdapter向数据库提交更改基本和高级场景,还讨论了ADO.NETXML特性。第Ⅳ部分介绍了使用ADO.NET建立有效率Windows应用程序和Web应用程序技术。第V部分是附录。 第I部分 开始使用ADO.NET 第1章 ADO.NET概述 1.1 为什么引入新对象模型? 1.2 ADO.NET对象模型 1.2.1 .NET数据提供程序 1.2.2 为什么使用分离类和库 1.2.3 本书对.NET数据提供程序介绍 1.2.4 连接对象 1.2.5 断开连接对象 1.2.6 元数据 1.2.7 强类型DataSet对象 1.3 常见问题 第2章 使用数据窗体向导生成ADO.NET应用程序 2.1 演示 2.2 用数据窗体向导生成数据绑定窗体 2.2.1 选择连接 2.2.2 从数据库中选择表 2.2.3 在DataSet中创建关系 2.2.4 选择要显示列 2.2.5 选择显示样式 2.3 使用新数据绑定窗体 2.3.1 在新数据绑定窗体中显示数据 2.3.2 利用DataRelation对象进行级联更改 2.3.3 向数据库提交更改 2.3.4 组件托盘 2.4 以数据窗体向导作为起始点 2.5 常见问题 第II部分 连接:使用.NET数据提供程序 第3章 与数据库连接 3.1 使用Connection对象 3.1.1 创建Connection对象 3.1.2 连接字符串 3.1.3 开放及关闭连接 3.1.4 连接池 3.1.5 销毁连接 3.1.6 使用连接创建其他对象 3.1.7 获取数据库架构信息 3.2 Visual Studio.NET设计时特性 3.2.1 在【服务器资源管理器】中处理Connection对象 3.2.2 向【服务器资源管理器】中添加数据连接 3.2.3 向应用程序添加连接 3.2.4 在运行时使用新连接 3.2.5 代码到哪里去了? 3.3 OleDbConnection对象参考 3.3.1 OleDbConnection对象属性 3.3.2 OleDbConnection对象方法 3.3.3 OleDbConnection对象事件 3.4 常见问题 第4章 数据库查询 4.1 在代码中使用Command对象 4.1.1 创建Command对象 4.1.2 执行无返回行查询 4.1.3 用DataReader对象检查查询结果 4.1.4 执行返回单值查询 4.1.5 执行参数化查询 4.1.6 调用存储过程 4.1.7 从输出参数中获取数据 4.1.8 在Transaction中执行查询 4.2 在Visual Studio.NET中创建Command对象 4.2.1 从工具箱中拖放 4.2.2 指定一个连接 4.2.3 使用查询生成器 4.2.4 在代码中使用新Command对象 4.2.5 从【服务器资源管理器】中拖放 4.3 Command、DataReader以及Parameter对象参考 4.3.1 OleDbCommand对象属性 4.3.2 OleDbCommand对象方法 4.3.3 OleDbDataReader对象属性 4.3.4 OleDbDataReader对象方法 4.3.5 创建Parameter对象 4.3.6 OleDbParameter对象属性 4.4 常见问题 第5章 用DataAdapter对象获取数据 5.1 什么是DataAdapter对象 5.1.1 DataAdapter与其他查询对象不同之处 5.1.2 DataAdapter剖析 5.2 创建和使用DataAdapter对象 5.2.1 创建DataAdapter 5.2.2 DataAdapter构造函数 5.2.3 从查询中获取结果 5.2.4 将查询结果映射到DataSet中 5.2.5 处理批查询 5.2.6 从存储过程中获取行 5.2.7 获取架构信息 5.3 在Visual Studio.NET中创建DataAdapter对象 5.3.1 从工具箱中拖放DataAdapter 5.3.2 使用【数据适配器配置向导】 5.3.3 从【服务器资源管理器】中拖放 5.3.4 预览DataAdapter结果 5.3.5 检查向导所生成代码 5.4 DataAdapter参考 5.4.1 DataAdapter对象属性 5.4.2 DataAdapter对象方法 5.4.3 DataAdapter对象事件 5.5 常见问题 第III部分 处理脱机数据—ADO.NET Data Set 第6章 处理DataSet对象 6.1 DataSet特性 6.1.1 处理脱机数据 6.1.2 浏览、排序、搜索和过滤 6.1.3 处理分级数据 6.1.4 缓存更改 6.1.5 XML完整性 6.1.6 统一功能 6.2 使用DataSet对象 6.2.1 创建数据集对象 6.2.2 查看调用DataAdapter.Fill创建结构 6.2.3 查看DataAdapter返回数据 6.2.4 校验DataSet中数据 6.2.5 编写代码创建DataTable对象 6.2.6 修改DataTable内容 6.3 在Visual Studio.NET中使用DataSet对象 6.3.1 由DataAdapter对象生成DataSet 6.3.2 从零创建新DataSet 6.3.3 创建非类型化DataSet 6.4 DataSet、DataTable、DataColumn、DataRow、UniqueConstraints和ForeigkeyConstraints对象参考 6.4.1 DataSet对象属性 6.4.2 DataSet对象方法 6.4.3 DataSet对象事件 6.4.4 DataTable对象属性 6.4.5 DataTable对象方法 6.4.6 DataTable对象事件 6.4.7 DataColumn对象属性 6.4.8 DataRow对象属性 6.4.9 DataRow对象方法 6.4.10 UniqueConstraint对象属性 6.4.11 ForeignkeyConstraint对象属性 6.5 常见问题 第7章 处理关系数据 7.1 关系数据访问概述 7.1.1 联合查询 7.1.2 单独查询 7.1.3 层次化ADO Recordset对象 7.1.4 ADO.NETDataRelation对象 7.2 在代码中使用DataRelation对象 7.2.1 创建DataRelation对象 7.2.2 查找关系数据 7.2.3 使用DataRelation对象验证数据 7.2.4 自引用DataRelationship对象 7.2.5 多对多关系 7.2.6 在基于表达式DataColumn对象中使用DataRelation对象 7.2.7 层迭更改 7.2.8 Join查询 7.3 在Visual Studio.NET中创建DataRelation对象 7.3.1 向强类型DataSet添加DataRelation 7.3.2 向一个非类型化DataSet添加DataRelation 7.4 DataRelation对象引用 7.4.1 DataRelation对象属性 7.5 常见问题 第8章 排序、搜索和筛选 8.1 使用DataTable对象搜索和筛选功能 8.1.1 根据主键值查找行 8.1.2 执行更具动态搜索 8.1.3 执行通配符搜索 8.1.4 使用分隔符 8.1.5 使用附加Select方法 8.2 DataView对象 8.2.1 DataView对象从DataTable中返回数据 8.2.2 DataView对象不是SQL查询 8.3 在代码中使用DataView对象 8.3.1 创建DataView对象 8.3.2 使用RowStateFilter属性 8.3.3 使用DataRowView对象 8.3.4 通过DataView检查所有可用数据各行 8.3.5 在DataView中搜索数据 8.3.6 修改DataRowView对象 8.4 在Visual Studio.NET中创建DataView对象 8.4.1 在设计器中添加新DataView对象 8.4.2 设置DataView对象属性 8.5 DataView对象参考 8.5.1 DataView对象属性 8.5.2 DataView对象方法 8.5.3 DataView对象ListChanged事件 8.5.4 DataRowView对象属性 8.5.5 DataRowView对象方法 8.6 常见问题 第9章 使用强类型DataSet对象 9.1 创建强类型DataSet对象 9.1.1 困难方法 9.1.2 简单方法 9.2 使用强类型DataSet对象 9.2.1 添加行 9.2.2 查找行 9.2.3 编辑行 9.2.4 处理空数据 9.2.5 处理层次数据 9.2.6 其他DataSet、DataTable和DataRow特性 9.3 何时使用强类型DataSet对象 9.3.1 软件组件与瑞士军刀 9.3.2 设计时优势 9.3.3 运行时优势 9.3.4 其他注意事项 9.3.5 方法选择 9.4 常见问题 第10章 向数据库提交更新 10.1 有关历史 10.1.1 用ADO Recordset提交更新好处 10.1.2 用ADO Recordset对象提交更新缺点 10.2 用ADO.NET Command对象提交更新 10.3 使用ADO.NET DataAdapter对象提交更新 10.4 手工配置DataAdapter对象 10.4.1 绑定参数简介 10.4.2 用存储过程提交更新 10.4.3 提供自己更新逻辑 10.5 使用CommandBuilder对象生成更新逻辑 10.5.1 CommandBuilder如何生成更新逻辑 10.5.2 使用CommandBuilder优点和缺点 10.6 使用【数据适配器配置向导】生成更新逻辑 10.6.1 检查DataAdapter结构 10.6.2 构建更新逻辑选择 10.6.3 使用存储过程提交更新 10.6.4 使用向导优点和缺点 10.7 关于更新其他注意事项 10.7.1 开放式并发选项 10.7.2 使用空值 10.7.3 在事务中提交更新 10.7.4 使用TableMappings集合 10.7.5 最佳更新方式 10.8 OleDbCommandBuilder对象参考 10.8.1 OleDbCommandBuilder对象属性 10.8.2 OleDbCommandBuilder对象方法 10.9 常见问题 第11章 高级更新场景 11.1 在提交更新后刷新一行 11.1.1 在提交更新后获取为时间戳列新生成值 11.1.2 在提交更新后使用成批查询获取数据 11.1.3 用输出参数获取新数据 11.1.4 在提交更新之后用DataAdapter对象RowUpdated事件获取数据 11.1.5 时间戳示例应用程序 11.2 获取新生成自动递增值 11.2.1 使用SQL Server 11.2.2 使用Access 2000 11.2.3 使用Oracle序列 11.2.4 获取自动递增值示例应用程序 11.3 使用SQL ServerNOCOUNT设置 11.4 提交层次化更改 11.4.1 提交挂起插入和删除 11.4.2 使用自动递增值和关系数据 11.5 分离和重新集中改变 11.5.1 用GetChanges方法节省带宽 11.6 得体地处理失败更新尝试 11.6.1 事先为冲突做出计划 11.6.2 通知用户失败 11.6.3 提取冲突行当前内容 11.6.4 如果第一次没有成功 11.6.5 冲突示例应用程序 11.7 使用分布式事务 11.7.1 事务协调器和资源管理器 11.7.2 .NET框架中分布式事务 11.7.3 对分布式事务数据库支持 11.7.4 构建自己组件 11.7.5 分布式事务示例应用程序 11.7.6 使用组件服务其他好处 11.7.7 在处理复杂更新方案时使用ADO.NET 11.8 常见问题 第12章 使用XML数据 12.1 建立XML和数据访问之间桥梁 12.2 读取和写入XML数据 12.2.1 DataSet对象XML方法 12.2.2 GetXml方法 12.2.3 推断架构 12.2.4 影响XML文档架构ADO.NET属性 12.2.5 缓存更改和XML文档 12.3 DataSet+XmlDocument=XmlDataDocument 12.3.1 使用XmlDataDocument对象 12.3.2 将DataSet作为XML文档访问 12.3.3 将更新缓存到XML文档 12.4 从SQL Server 2000中获取XML数据 12.4.1 使用SELECT…FORXML查询 12.5 SQL XML.NET数据提供程序 12.5.1 使用SqlXmlCommand将数据装载到XmlDocument 12.5.2 使用SqlXmlAdapter将数据装载到DataSet 12.5.3 使用模板查询 12.5.4 使用XPath查询 12.5.5 应用XSLT转换 12.5.6 提交更新 12.6 一个简单ADO.NET和XML例子 12.7 条条大路通罗马 12.8 ADO.NET和XML:快乐一对 12.9 常见问题 第IV部分 用ADO.NET构造高效应用程序 第13章 生成高效基于Windows应用程序 13.1 用数据绑定快速生成用户界面 13.1.1 用数据绑定生成用户界面步骤 13.1.2 数据绑定小结 13.2 应用程序设计考虑事项 13.2.1 只提取需要数据 13.2.2 更新策略 13.2.3 连接策略 13.2.4 使用BLOB数据 13.3 常见问题 第14章 生成高效Web应用程序 14.1 Web应用程序简介 14.1.1 ASP.NET是生成Web应用程序出色工具 14.1.2 无状态优缺点 14.2 连接到数据库 14.2.1 使用受信任连接 14.2.2 使用Access数据库 14.3 在Web页中显示数据 14.3.1 使用DataBinder.Eval 14.3.2 将DataGrid控件绑定到查询结果 14.4 在往返行程之间缓存数据 14.4.1 无状态方式——不维护状态 14.4.2 在客户端缓存数据 14.4.3 在Web服务器上维护状态 14.4.4 在数据库中维护状态 14.4.5 维护状态准则 14.5 分页 14.5.1 WebDataGrid分页功能 14.5.2 DataAdapter Fill方法分页功能 14.5.3 生成返回一页数据查询 14.5.4 PagingOptions示例 14.6 在Web页面中编辑数据 14.6.1 用DataGrid简化数据编辑 14.6.2 处理DataGridEditing事件 14.6.3 向数据库提交更改 14.6.4 购物车示例 14.7 常见问题 第V部分 附录 附录A 使用其他.NET数据提供程序 A.1 SQL Client.NET数据提供程序 A.1.1 命名参数与参数标记 A.1.2 使用SqlConnection连接到SQL Server数据库 A.1.3 使用SqlDataAdapter获取查询结果 A.1.4 使用SqlCommand和SqlDataReader对象 A.1.5 GetSql<DataType>方法和SqlTypes命名空间 A.1.6 调用存储过程 A.1.7 获取数据库架构信息 A.2 ODBC.NET数据提供程序 A.2.1 使用OdbcConnection连接到数据库 A.2.2 使用参数查询 A.2.3 用OdbcDataAdapter获取查询结果 A.2.4 用OdbcDataReader检查查询结果 A.2.5 调用存储过程 A.2.6 获取数据库架构信息 A.3 Oracle Client.NET数据提供程序 A.3.1 用OracleConnection连接Oracle数据库 A.3.2 使用参数查询 A.3.3 用OracleDataAdapter获取查询结果 A.3.4 用OracleDataReader检查查询结果 A.3.5 Oracle特定数据类型 A.3.6 调用存储过程 A.3.7 从Oracle REF游标中提取数据 A.3.8 获取数据库架构信息 A.4 常见跨提供程序操作问题 A.4.1 编写可在提供程序之间移植代码 A.4.2 确定正确.NET提供程序数据类型 附录B 工具 B.1 ADO.NET Ad Hoe Query Tool B.1.1 连接到数据库 B.1.2 添加.NET数据提供程序 B.1.3 执行查询 B.1.4 查看查询架构信息 B.1.5 提交更新 B.1.6 应用程序设置 B.2 ADO.NET DataAdapter Builder 指定更新逻辑 B.3 ADO.NET Navigation Control B.3.1 在Visual Studio.NET工具箱中添加ADO.NET Navigation控件 B.3.2 设置ADO.NET Navigation控件属性 B.3.3 设置ADO.NET Navigation控件其他属性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值