﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-bbming-随笔分类-C#文章收集</title><link>http://www.cnitblog.com/bbming/category/4428.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 03 Oct 2011 18:28:11 GMT</lastBuildDate><pubDate>Mon, 03 Oct 2011 18:28:11 GMT</pubDate><ttl>60</ttl><item><title>.NET环境下水晶报表使用总结 </title><link>http://www.cnitblog.com/bbming/archive/2006/12/19/20812.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Tue, 19 Dec 2006 10:01:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/19/20812.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/20812.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/19/20812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/20812.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/20812.html</trackback:ping><description><![CDATA[
		<span style="FONT-SIZE: 10pt">水晶报表是一个优秀的报表开发工具，本人在开发通用管理系统的时候，所有报表都使用水晶报表，其简单、易用和强大的功能令笔者倍加喜爱，现将水晶报表使用手记呈现给大家。 <br /><br />　　一、在使用自带的水晶报表时，请注册，否则只能使用30次<br /><br />　　水晶报表注册码<br />　　注册号:6707437608<br />　　密码:AAP5GKS0000GDE100DS <br /><br />　　二、使用CrystalReportViewer进行预览<br /><br />　　CrystalReportViewer控件允许在应用程序中查看 Crystal Report。ReportSource 属性用于设置要查看哪个报表。该属性设置之后，报表显示在查看器中。报表源可以是ReportDocument、报表文件的路径，也可以是强类型报表。<br /><br />　　1. 打开“工具箱”，并将一个 CrystalReportViewer 拖到窗体上，我们命名为rptVew。 <br /><br />　　2. 通过拖放操作将 Windows 窗体查看器调整到希望的大小并将其移动到所需位置。 <br /><br />　　3. 当运行应用程序时，报表将显示在查看器中。<br /><br />　　三、创建新报表<br /><br />　　1. 指向“添加”，单击“添加新项”。 <br /><br />　　2. 在“添加新项”对话框中，从“模板”区域选择 Crystal Report，将报表命名为rptClient，单击“打开”。 <br /><br />　　3. 在 Crystal Report 库中，选择下列选项之一： <br /><br />　　　· 使用报表专家 — 指导您完成报表的创建过程，并将您的选择添加到 Crystal Report Designer。 <br /><br />　　　· 作为空白报表 — 打开 Crystal Report Designer。 <br /><br />　　　· 来自于现有的报表 — 创建新报表，它与指定的另一报表设计相同。 <br /><br />　　注意 Crystal Report 库包含许多专家，可以指导您完成数个特定类型报表的创建工作。您可能希望使用专家来创建最初的报表，以确定哪种报表构造方法适合您的需要。<br /><br />　　4. 单击“确定”按钮。 <br /><br />　　如果选择使用“报表专家”，便会出现“报表专家”对话框，并带有数据资源管理器。为每个文件夹选择所需数据，完成“报表专家”选项卡界面上的操作，然后单击“完成”来访问 Crystal Report Designer 和您的报表<br /><br />　　四、是否需要动态设置数据源？<br /><br />　　Crystal Reports 通过数据库驱动程序与数据库连接。每个驱动程序都被编写为可处理特定数据库类型或数据库访问技术。 <br /><br />　　拉和推模型<br /><br />　　为了向开发人员提供最灵活的数据访问方法，Crystal Reports 数据库驱动程序被设计为可同时提供数据访问的拉模型和推模型。 <br /><br />　　拉模型<br /><br />　　在拉模型中，驱动程序将连接到数据库并根据需要将数据“拉”进来。使用这种模型时，与数据库的连接和为了获取数据而执行的 SQL 命令都同时由 Crystal Reports 本身处理，不需要开发人员编写代码。如果在运行时无须编写任何特殊代码，则使用拉模型。<br /><br />　　推模型<br /><br />　　相反，推模型需要开发人员编写代码以连接到数据库，执行 SQL 命令以创建与报表中的字段匹配的记录集或数据集，并且将该对象传递给报表。该方法使您可以将连接共享置入应用程序中，并在 Crystal Reports 收到数据之前先将数据筛选出来。 <br />四、从 ADO.NET 数据集制作报表<br /><br />　　从数据库创建数据集对象 <br /><br />　　1. 在项目中新建一个架构文件： <br /><br />　　　a. 在解决方案资源管理器中，右击项目名，指向“添加”，然后单击“添加新项”。 <br /><br />　　　b. 在“添加新项”对话框的“类别”区域，展开文件夹，然后选择“数据”。 <br /><br />　　　c. 在“模板”区域选择“数据集”。 <br /><br />　　　d. 接受默认名称 Dataset1.xsd。 <br /><br />　　这就创建了一个新的架构文件 (Dataset1.xsd)，以后将用它来生成强类型数据集。该架构文件将显示在 ADO.NET 数据集设计器中。 <br /><br />　　2. 指定数据库位置： <br /><br />　　　a. 在服务器资源管理器中，右击“数据连接”并选择“添加连接”。 <br /><br />　　　b. 在“数据链接属性”对话框中，单击“提供程序”选项卡，然后选择一个提供程序（例如 Microsoft OLE DB Provider for SQL Server）。 <br /><br />　　　c. 单击“连接”选项卡，然后指定您的数据库所在位置。在所需位置输入服务器和登录信息。 <br /><br />　　　d. 单击“确定”按钮。 <br /><br />　　　此时，您的数据库及其表和字段就出现在服务器资源管理器的“数据连接”节点下面。 <br /><br />　　3. 在解决方案资源管理器中，双击 Dataset1.xsd （如果它尚不是活动视图）。 <br /><br />　　　Dataset1.xsd 现在应显示在“数据集”选项卡中。 <br /><br />　　4. 若要为数据集建立架构，请将需要的表从服务器资源管理器中拖动到 Dataset1.xsd 的“数据集”选项卡上。 <br /><br />　　5. 单击“保存 Dataset1.xsd”来保存“Dataset1.xsd”文件。 <br /><br />　　6. 在“生成”菜单上，单击“生成”为项目生成数据集对象。 <br /><br />　　ADO.NET 数据集对象提供数据的描述，从它可以向 Crystal report 添加表。使用 Crystal Report Designer 中的“数据库专家”从 ADO.NET 数据集对象添加表。 <br /><br />　　请在使用“报表专家”创建新报表时调用“数据库专家”。或者，要从一个已经使用 ADO.NET 建立好的报表中访问“数据库专家”，请在 Report Designer 中右击，指向“数据库”，然后单击“添加/删除数据库”。<br /><br />　　将报表连接到 ADO.NET 数据集对象 <br /><br />　　1. 在“数据库专家”中，展开“项目数据”文件夹。 <br /><br />　　2. 展开“ADO.NET 数据集”文件夹。 <br /><br />　　3. 选择所需数据集对象。 <br /><br />　　例如，如果当时使用的是从项目“WindowsApplication1”的架构文件“Dataset1.xsd”中生成的数据集对象，则应该选择“WindowsApplication1.Dataset1”。 <br /><br />　　4. 选择要向报表中添加的表，和使用其他数据源一样。 <br /><br />　　五、动态改变数据源的代码 <br /><br />Dim dsdataSet As New DataSet()<br /><br />Dim oRpt As New rptClient() '已建立的报表rptClient<br /><br />　　请读者自行填充数据集dsdataSet <br /><br /><br />'使用“报表引擎”对象模型将填充的数据集,传递给报表<br /><br />oRpt.SetDataSource(dsdataSet.Tables(0))<br /><br />' 将带有数据的报表对象绑定到 Windows 窗体查看器，rptVew（CrystalReportViewer控件）<br /><br />rptVew.ReportSource = oRpt<br /><br />　　注意 FillDataSet 方法可连接到指定的数据库，提取数据，然后断开数据库连接。如果您希望将数据库中的多个表添加到报表中，请使用 SQL JOIN 语句将这些表联接在一起；然后在 FillDataSet 方法中指定一个结果表<br /><br />　　六、创建主从报表<br /><br />　　在报表中，有许多报表是主从表结构，比如订单与订单商品明细，订单是一个表中的一条记录，而分录是另一个表中的多条记录，两个表通过一个字段关联起来，这种报表可利用其分组功能实现，<br /><br />　　1. 新建一个工程<br /><br />　　2. 往FORM1中添加一个CrystalReportViewer控件<br /><br />　　3. 在服务噐资源管理器中连接到SQL SERVER 2000上的Northwind数据库<br /><br />　　4. 添加一个数据集Dataset1,将服务器资源管理器中的Orders和 Order Details加入到数据集中。<br /><br />　　5. 添加一个水晶报表，使用报表专家，在项目数据中选择“ADO.NET数据集”，插入表Orders和 Order Details，“链接”中是关联字段的链接，在“字段”中选择要显示的主表和明细表的字段，组中选择分组依据为Orders表OrdersID字段，总计，图表，选择（可进行筛选），样式（可设置报表标题），可自行设置。设置完后，点击完成。<br /><br />　　6. 在报表设计器中调整需要显示的字段的位置、宽度等。<br /><br />　　7. 在窗口中添加代码。<br /><br />Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load<br /><br />Dim oRpt As New CrystalReport1()<br /><br />Dim dsdataSet As New Dataset1() <br /><br />Dim CN As New Data.SqlClient.SqlConnection("data source=PMSERVER;initial catalog=Northwind;user id=sa;password=sa")<br /><br />CN.Open()<br /><br />Dim daOrders As New Data.SqlClient.SqlDataAdapter("select * from orders", CN)<br /><br />daOrders.Fill(dsdataSet, "orders") <br /><br />Dim daDetails As New Data.SqlClient.SqlDataAdapter("select * from [Order Details]", CN)<br /><br />daDetails.Fill(dsdataSet, "Order Details") <br /><br />'使用“报表引擎”对象模型将填充的数据集,传递给报表<br /><br />oRpt.SetDataSource(dsdataSet)<br /><br />CrystalReportViewer1.ReportSource = oRpt<br /><br />End Sub<br /><br />　　8、运行程序<br /><br />　　七、用程序改变报表中text的文本<br /><br />　　代码如下：<br /><br />Dim GetTextObject As TextObject<br /><br />' 按名称获取 ReportObject，将其转换为 TextObject，并返回此对象。<br /><br />GetTextObject = orpt.ReportDefinition.ReportObjects.Item("text13")<br /><br />GetTextObject.Text = "XXXX系统"<br /><br />　　总结：水晶报表具有非常强大的功能，还可进行导出WORD、EXCEL、RTF等文件，还可生成复杂、漂亮图表，是进行WEB和WINDOWS报表开发的利器。</span>
<img src ="http://www.cnitblog.com/bbming/aggbug/20812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-19 18:01 <a href="http://www.cnitblog.com/bbming/archive/2006/12/19/20812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转　C# 中通用winform组件的数据绑定 </title><link>http://www.cnitblog.com/bbming/archive/2006/12/11/20350.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Mon, 11 Dec 2006 03:01:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/11/20350.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/20350.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/11/20350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/20350.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/20350.html</trackback:ping><description><![CDATA[
		<p>我们知道在由于Visual C＃自身没有类库，和其他的.Net开发语言一样，Visual C＃调用的类库是.Net框架中的一个共有的类库--.Net FrameWork SDK。ADO.NET是.Net FrameWork SDK提供给.Net开发语言进行数据库开发的一个系列类库的集合。在ADO.NET中虽然提供了大量的用于数据库连接、数据处理的类库，但却没有提供类似DbText组件、DbList组件、DbLable组件、DbCombox组件等。要想把数据记录以ComBox、ListBox等形式显示处理，使用数据绑定技术是最为方便、最为直接的方法。所谓数据绑定技术就是把已经打开的数据集中某个或者某些字段绑定到组件的某些属性上面的一种技术。说的具体些，就是把已经打开数据的某个或者某些字段绑定到Text组件、ListBox组件、ComBox等组件上的能够显示数据的属性上面。当对组件完成数据绑定后，其显示字段的内容将随着数据记录指针的变化而变化。这样程序员就可以定制数据显示方式和内容，从而为以后的数据处理作好准备。所以说数据绑定是Visual C＃进行数据库方面编程的基础和最为重要的第一步。只有掌握了数据绑定方法，才可以十分方便对已经打开的数据集中的记录进行浏览、删除、插入等具体的数据操作、处理。 <br /><br />　　 数据绑定根据不同组件可以分为二种，一种是简单型的数据绑定，另外一种就是复杂型的数据绑定。所谓简单型的数据绑定就是绑定后组件显示出来的字段只是单个记录，这种绑定一般使用在显示单个值的组件上，譬如：TextBox组件和Label组件。而复杂型的数据绑定就是绑定后的组件显示出来的字段是多个记录，这种绑定一般使用在显示多个值的组件上，譬如：ComBox组件、ListBox组件等。本文就是来详细介绍如何用Visual C＃实现这二种绑定。在数据库的选择上，为了使内容更加全面，采用了当下比较流行的二种数据库，一种是本地数据库Acess 2000，另外一种是远程数据库Sql Server 2000。 <br /><br />　　 一． 本文程序设计和运行的软件环境： <br /><br />　　 （1）.微软公司视窗2000服务器版 <br /><br />　　 （2）..Net FrameWork SDK Beta 2 <br /><br />　　 （3）.MADC 2.6（Microsoft Acess Data Component）以上版本 <br /><br />　　 二． 程序中使用的数据库的数据字典： <br /><br />　　 （1）.本地数据库Access 2000的数据库的名称为"db.mdb"，在这个数据库中定义了一张表"person"。这张表的数据结构如下表： <br /><br /></p>
		<table cellspacing="0">
				<tbody>
						<tr>
								<td>字段名称 </td>
								<td>字段类型 </td>
								<td>字段意思 </td>
						</tr>
						<tr>
								<td>id </td>
								<td>数字 </td>
								<td>序号 </td>
						</tr>
						<tr>
								<td>xm </td>
								<td>文本 </td>
								<td>姓名 </td>
						</tr>
						<tr>
								<td>xb </td>
								<td>文本 </td>
								<td>性别 </td>
						</tr>
						<tr>
								<td>nl </td>
								<td>文本 </td>
								<td>年龄 </td>
						</tr>
						<tr>
								<td>zip </td>
								<td>文本 </td>
								<td>邮政编码 </td>
						</tr>
				</tbody>
		</table>
		<br />　　 （2）.远程数据库Sql Server 2000的数据库服务器名称为"Server1",数据库名称为"Data1"，登陆的ID为"sa"，口令为空，在数据库也定义了一张"person"表，数据结构如上表。 <br />　　 三． 数据绑定一般步骤： <br /><br />　　 （一）.无论是简单型的数据绑定，还是复杂型的数据绑定，要实现绑定的第一步就是就是要连接数据库，得到可以操作的DataSet。下面二段代码是分别连接Access 2000和Sql Server 2000数据库，并获得DataSet。 <br /><br />　　 （1）. 连接Access 2000，得到DataSet： <br /><br /><table><tbody><tr><td>//创建一个 OleDbConnection <br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br /><br />myConn.Open ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , "person" ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; </td></tr></tbody></table><p><br />　　 （2）. 连接Sql Server 2000，得到DataSet： </p><table><tbody><tr><td>// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1 <br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />myConn.Open ( ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , " person " ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; </td></tr></tbody></table><p>　　（二）.根据不同组件，采用不同的数据绑定： <br /><br />　　 对于简单型的数据绑定，数据绑定的方法其实比较简单，在得到数据集以后，一般是通过把数据集中的某个字段绑定到组件的显示属性上面，譬如TextBox组件和Label组件，是绑定到"Text"属性。对于复杂型的数据绑定一般是通过设定其某些属性值来实现绑定的。这些下面将会具体介绍。 <br />　　 四．简单型组件的数据绑定： <br /><br />　　 （1）.TextBox组件的数据绑定： <br /><br />　　 通过下列语句就可以把数据集（即为：myDataSet）的某个字段绑定到TextBox组件的"Text"属性上面了： <br /></p><table><tbody><tr><td>textBox1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; </td></tr></tbody></table><p>　　注释：此时绑定是Access 2000数据库中"person"表的"xm"字段。 <br /><br />　　 由此可以得到绑定TextBox组件的源程序代码（TextBox01.cs），下列代码操作的数据库是Access 2000，如下： <br /><br /></p><table><tbody><tr><td><p><br />public class Form1 : Form <br />{ <br />private TextBox textBox1 ; <br />private Button button1 ; <br />private System.Data.DataSet myDataSet ; <br />private System.ComponentModel.Container components = null ; </p><p>public Form1 ( ) <br />{ <br />file://打开数据链接，得到数据集 <br />GetConnect ( ) ; <br />InitializeComponent ( ) ; <br />} <br />file://清除程序中使用过的资源 <br />protected override void Dispose ( bool disposing ) <br />{ <br />if ( disposing ) <br />{ <br />if ( components != null ) <br />{ <br />components.Dispose ( ) ; <br />} <br />} <br />base.Dispose ( disposing ) ; <br />} </p><p>private void GetConnect ( ) <br />{ <br />file://创建一个 OleDbConnection <br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br /><br />myConn.Open ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , "person" ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; </p><p>} <br /><br />private void button1_Click ( object sender , System.EventArgs e ) <br />{ <br />textBox1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; <br />} <br />static void Main ( ) <br />{ <br />Application.Run ( new Form1 ( ) ) ; <br />} <br />} <br /></p></td></tr></tbody></table><br /><p>　　得到TextBox组件对本地数据库中的字段进行数据绑定的程序后，可以方便的得到对远程数据库中的某些字段进行数据绑定的源程序代码（TextBox02.cs），具体如下： </p><table><tbody><tr><td><p><br />public class Form1 : Form <br />{ <br />private TextBox textBox1 ; <br />private Button button1 ; <br />private System.Data.DataSet myDataSet ; <br />private System.ComponentModel.Container components = null ; </p><p>public Form1 ( ) <br />{ <br />file://打开数据链接，得到数据集 <br />GetConnect ( ) ; <br />InitializeComponent ( ) ; <br />} <br />file://清除程序中使用过的资源 <br />protected override void Dispose ( bool disposing ) <br />{ <br />if ( disposing ) <br />{ <br />if ( components != null ) <br />{ <br />components.Dispose ( ) ; <br />} <br />} <br />base.Dispose ( disposing ) ; <br />} </p><p>private void GetConnect ( ) <br />{ <br />// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1 <br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />myConn.Open ( ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , " person " ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; <br />} <br /><br />private void button1_Click ( object sender , System.EventArgs e ) <br />{ <br />textBox1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; <br />} <br />static void Main ( ) <br />{ <br />Application.Run ( new Form1 ( ) ) ; <br />} <br />} </p></td></tr></tbody></table><p>（2）.Label组件的数据绑定： <br /><br />　　 在掌握了TextBox组件数据绑定以后，可以十分方便的得到Label组件的数据绑定方法，因为这二者实现的方法实在是太相似了。下列语句是把得到数据集的"xm"字段绑定到Label组件的"Text"属性上： <br /></p><table><tbody><tr><td>label1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; </td></tr></tbody></table><p>　　注释：此时绑定是Access 2000数据库中"person"表的"xm"字段。由此可以得到Label组件数据绑定的源程序代码（Label01.cs），本代码操作数据库是Access 2000： </p><table><tbody><tr><td><p><br />public class Form1 : Form <br />{ <br />private Label label1 ; <br />private Button button1 ; <br />private System.Data.DataSet myDataSet ; <br />private System.ComponentModel.Container components = null ; </p><p>public Form1 ( ) <br />{ <br />file://打开数据链接，得到数据集 <br />GetConnect ( ) ; <br />InitializeComponent ( ) ; <br />} <br />file://清除程序中使用过的资源 <br />protected override void Dispose ( bool disposing ) <br />{ <br />if ( disposing ) <br />{ <br />if ( components != null ) <br />{ <br />components.Dispose ( ) ; <br />} <br />} <br />base.Dispose ( disposing ) ; <br />} </p><p>private void GetConnect ( ) <br />{ <br />file://创建一个 OleDbConnection <br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br /><br />myConn.Open ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , "person" ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; </p><p>} <br /><br />private void button1_Click ( object sender , System.EventArgs e ) <br />{ <br />label1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; <br />} <br />static void Main ( ) <br />{ <br />Application.Run ( new Form1 ( ) ) ; <br />} <br />} </p></td></tr></tbody></table><br /><p>　　得到了Label组件对Access 2000数据库数据绑定的程序代码，改换一下程序中数据链接，就可以得到Label组件对Sql Server 2000数据库数据绑定的源程序代码（Label02.cs），具体如下： <br /></p><table><tbody><tr><td><p><br />public class Form1 : Form <br />{ <br />private Label label1 ; <br />private Button button1 ; <br />private System.Data.DataSet myDataSet ; <br />private System.ComponentModel.Container components = null ; </p><p>public Form1 ( ) <br />{ <br />file://打开数据链接，得到数据集 <br />GetConnect ( ) ; <br />InitializeComponent ( ) ; <br />} <br />file://清除程序中使用过的资源 <br />protected override void Dispose ( bool disposing ) <br />{ <br />if ( disposing ) <br />{ <br />if ( components != null ) <br />{ <br />components.Dispose ( ) ; <br />} <br />} <br />base.Dispose ( disposing ) ; <br />} </p><p>private void GetConnect ( ) <br />{ <br />// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1 <br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />myConn.Open ( ) ; <br />string strCom = " SELECT * FROM person " ; <br />file://创建一个 DataSet <br />myDataSet = new DataSet ( ) ; <br />file://用 OleDbDataAdapter 得到一个数据集 <br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; <br />file://把Dataset绑定person数据表 <br />myCommand.Fill ( myDataSet , " person " ) ; <br />file://关闭此OleDbConnection <br />myConn.Close ( ) ; <br />} <br /><br />private void button1_Click ( object sender , System.EventArgs e ) <br />{ <br />label1.DataBindings.Add ( "Text" , myDataSet , "person.xm" ) ; <br />} <br />static void Main ( ) <br />{ <br />Application.Run ( new Form1 ( ) ) ; <br />} <br />} </p></td></tr></tbody></table><p>　　五． 复杂型组件的数据绑定：</p><p>　　在上面的介绍中，了解到对复杂型组件的数据绑定是通过设定组件的某些属性来完成数据绑定的。首先来介绍一下ComboBox组件的数据绑定.</p><p>　　（1）.ComboBox组件的数据绑定：</p><p>　　在得到数据集后，只有设定好ComboBox组件的的三个属性就可以完成数据绑定了，这三个属性是：、"DisplayMember"、"ValueMember"。其中"DataSource"是要显示的数据集，"DisplayMember"是ComboBox组件显示的字段，"ValueMember"是实际使用值。具体如下：<br /></p><p>ComboBox1.DataSource = myDataSet ;<br />ComboBox1.DisplayMember = "person.xm" ;<br />ComboBox1.ValueMember = "person.xm" ; </p><p>　　注释：此时绑定是Access 2000数据库中"person"表的"xm"字段。由此可以得到ComboBox组件数据绑定的源程序代码（Combo01.cs），本代码操作数据库是Access 2000：</p><p> </p><p>public class Form1 : Form<br />{<br />private ComboBox ComboBox1 ;<br />private Button button1 ;<br />private System.Data.DataSet myDataSet ;<br />private System.ComponentModel.Container components = null ;</p><p>public Form1 ( )<br />{<br />file://打开数据链接，得到数据集<br />GetConnect ( ) ;<br />InitializeComponent ( ) ;<br />}<br />file://清除程序中使用过的资源<br />protected override void Dispose ( bool disposing )<br />{<br />if ( disposing )<br />{<br />if ( components != null ) <br />{<br />components.Dispose ( ) ;<br />}<br />}<br />base.Dispose ( disposing ) ;<br />}</p><p>private void GetConnect ( )<br />{<br />file://创建一个 OleDbConnection<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;</p><p>myConn.Open ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定person数据表<br />myCommand.Fill ( myDataSet , "person" ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;</p><p>}</p><p>private void button1_Click ( object sender , System.EventArgs e )<br />{<br />ComboBox1.DataSource = myDataSet ;<br />ComboBox1.DisplayMember = "person.xm" ;<br />ComboBox1.ValueMember = "person.xm" ;<br />}<br />static void Main ( ) <br />{<br />Application.Run ( new Form1 ( ) ) ;<br />}<br />}<br /></p><p>图03：对ComboBox组件数据绑定的程序界面 </p><p>　　得到了ComboBox组件对本地数据库的数据绑定程序，也就十分方便的得到ComboBox组件绑定Sql Server 2000源程序代码（Combox02.cs）具体如下：</p><p> </p><p>public class Form1 : Form<br />{<br />private ComboBox ComboBox1 ;<br />private Button button1 ;<br />private System.Data.DataSet myDataSet ;<br />private System.ComponentModel.Container components = null ;</p><p>public Form1 ( )<br />{<br />file://打开数据链接，得到数据集<br />GetConnect ( ) ;<br />InitializeComponent ( ) ;<br />}<br />file://清除程序中使用过的资源<br />protected override void Dispose ( bool disposing )<br />{<br />if ( disposing )<br />{<br />if ( components != null ) <br />{<br />components.Dispose ( ) ;<br />}<br />}<br />base.Dispose ( disposing ) ;<br />}</p><p>private void GetConnect ( )<br />{<br />// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1<br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定person数据表<br />myCommand.Fill ( myDataSet , " person " ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;<br />}<br />private void button1_Click ( object sender , System.EventArgs e )<br />{<br />ComboBox1.DataSource = myDataSet ;<br />ComboBox1.DisplayMember = "person.xm" ;<br />ComboBox1.ValueMember = "person.xm" ;<br />}<br />static void Main ( ) <br />{<br />Application.Run ( new Form1 ( ) ) ;<br />}<br />}</p>　　（2）.ListBox组件的数据绑定： 
<p>　　ListBox组件的数据绑定和ComboBox组件的数据绑定的方法大致相同，也是通过设定"DisplayMember"、"ValueMember"。其中"DataSource"这三个属性来完成的。并且这三个属性在ListBox组件中代表的意思和ComboBox组件的意思基本一样。由此可以得到ListBox组件对本地数据库和远程数据库进行数据绑定的源程序。其中ListBox01.cs是对本地数据库进行数据绑定，ListBox02.cs是对远程数据库进行数据绑定，具体如下：</p><p>　　ListBox01.cs源程序代码节选：</p><p> </p><p>public class Form1 : Form<br />{<br />private ListBox ListBox1 ;<br />private Button button1 ;<br />private System.Data.DataSet myDataSet ;<br />private System.ComponentModel.Container components = null ;</p><p>public Form1 ( )<br />{<br />file://打开数据链接，得到数据集<br />GetConnect ( ) ;<br />InitializeComponent ( ) ;<br />}<br />file://清除程序中使用过的资源<br />protected override void Dispose ( bool disposing )<br />{<br />if ( disposing )<br />{<br />if ( components != null ) <br />{<br />components.Dispose ( ) ;<br />}<br />}<br />base.Dispose ( disposing ) ;<br />}</p><p>private void GetConnect ( )<br />{<br />file://创建一个 OleDbConnection<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;</p><p>myConn.Open ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定person数据表<br />myCommand.Fill ( myDataSet , "person" ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;</p><p>}</p><p>private void button1_Click ( object sender , System.EventArgs e )<br />{<br />ListBox1.DataSource = myDataSet ;<br />ListBox1.DisplayMember = "person.xm" ;<br />ListBox1.ValueMember = "person.xm" ;<br />}<br />static void Main ( ) <br />{<br />Application.Run ( new Form1 ( ) ) ;<br />}<br />}<br /></p><p> </p><p>图04：对ListBox组件数据绑定的程序界面 </p><p>　　以下代码是ListBox组件对Sql Server 2000数据库进行数据绑定的源程序节选（ListBox02.cs）：</p><p> </p><p>{<br />private ListBox ListBox1 ;<br />private Button button1 ;<br />private System.Data.DataSet myDataSet ;<br />private System.ComponentModel.Container components = null ; <br />public Form1 ( )<br />{<br />file://打开数据链接，得到数据集<br />GetConnect ( ) ;<br />InitializeComponent ( ) ;<br />}<br />file://清除程序中使用过的资源<br />protected override void Dispose ( bool disposing )<br />{<br />if ( disposing )<br />{<br />if ( components != null ) <br />{<br />components.Dispose ( ) ;<br />}<br />}<br />base.Dispose ( disposing ) ;<br />}</p><p>private void GetConnect ( )<br />{<br />// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1<br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定person数据表<br />myCommand.Fill ( myDataSet , " person " ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;<br />}</p><p>private void button1_Click ( object sender , System.EventArgs e )<br />{<br />ListBox1.DataSource = myDataSet ;<br />ListBox1.DisplayMember = "person.xm" ;<br />ListBox1.ValueMember = "person.xm" ;<br />}<br />static void Main ( ) <br />{<br />Application.Run ( new Form1 ( ) ) ;<br />}<br />}<br /></p><p>　　六． 总结：</p><p>　　本文介绍的实现数据绑定组件的都是在程序设计中经常用到的WinForm组件。当然在.Net FrameWork SDK中提供的WinForm组件是很多的，由于本文的限制，不可能一一介绍，一般来说，WinForm组件都可以实现数据绑定，虽然在某些具体的方法上有所差异，但也总是大同小异。在以下的文章中，将以此为基础探讨Visual C＃中数据库编程。</p><img src ="http://www.cnitblog.com/bbming/aggbug/20350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-11 11:01 <a href="http://www.cnitblog.com/bbming/archive/2006/12/11/20350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 实战Visual C＃数据库编程 </title><link>http://www.cnitblog.com/bbming/archive/2006/12/11/20349.html</link><dc:creator>老Ming</dc:creator><author>老Ming</author><pubDate>Mon, 11 Dec 2006 02:52:00 GMT</pubDate><guid>http://www.cnitblog.com/bbming/archive/2006/12/11/20349.html</guid><wfw:comment>http://www.cnitblog.com/bbming/comments/20349.html</wfw:comment><comments>http://www.cnitblog.com/bbming/archive/2006/12/11/20349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/bbming/comments/commentRss/20349.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/bbming/services/trackbacks/20349.html</trackback:ping><description><![CDATA[［编者的话：］关于数据库编程，微软提供了一个统一的数据对象访问模型，在Visual Studio6.0中称为ADO，在.NET中则统一为ADO.NET,掌握ADO.NET就等于掌握了数据库编程的核心，因此有必要首先复习一下以前发表的《ADO.NET完全攻略》。 
<p>　　针对数据库编程始终是程序设计语言的一个重要方面的内容，也是一个难点。数据库编程的内容十分丰富，但最为基本编程的也就是那么几点，譬如：连接数据库、得到需要的数据和针对数据记录的浏览、删除、修改、插入等操作。其中又以后面针对数据记录的数据操作为重点。本文就来着重探讨一下Visual C＃数据库基本编程，即：如何浏览记录、修改记录、删除记录和插入记录。</p><p>　　一．程序设计和运行的环境设置：</p><p>　　（1）.视窗2000服务器版</p><p>　　（2）.Microsoft Data Acess Component 2.6 以上版本 ( MDAC 2.6 )</p><p>　　（3）..Net FrameWork SDK Beta 2</p><p>　　为了更清楚的说明问题，在数据库的选用上，采用了当前比较典型的数据库，一个是本地数据库Access 2000，另外一个是远程数据库Sql Server 2000。其中本地数据库名称为"db.mdb"，在其中定义了一张数据表"person"，"person"表的数据结构如下表：</p><p> </p><p>字段名称 字段类型 字段意思 <br />id 数字 序号 <br />xm 文本 姓名 <br />xb 文本 性别 <br />nl 文本 年龄 <br />zip 文本 邮政编码 </p><p>　　远程数据库Sql Server 2000的数据库服务器名称为"Server1",数据库名称为"Data1"，登陆的ID为"sa"，口令为空，在数据库也定义了一张"person"表，数据结构如上表。</p><br />　　二．如何浏览数据： 
<p>　　在《Visual C＃的数据绑定》中，已经了解了如何把数据集中的某些字段绑定到WinForm组件的某个属性上，这样程序员就可以根据以WinForm组件的来定制数据显示的形式，并且此时的WinForm组件显示内容就可以随着记录指针的变化而改变。至此可见，浏览数据记录的关键就是如何改变记录指针。要实现这种操作，就要使用到BindingManagerBase类，此类的主要作用是管理对于那些实现了对同一个数据源进行绑定的对象。说的具体些，就是能够使得Windows窗体上的已经对同一数据源进行数据绑定的组件保持同步。在BindingManagerBase类中定义了一个属性"Position"，通过这个属性就可以改变BindingManagerBase对象中的数据指针。创建BindingManagerBase对象必须要使用到BindingContext类，其实每一个由Control类中继承而得到的对象，都有单一的BindingContext对象，在大多数创建窗体中实现数据绑定组件的BindingManagerBase对象是使用Form类的BindingContext来得到。下列代码是以Access 2000数据库为模型，创建的一个名称为"myBind"的BindingManagerBase对象。</p><p>//创建一个 OleDbConnection<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;</p><p>myConn.Open ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定books数据表<br />myCommand.Fill ( myDataSet , "person" ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;<br />myBind = this.BindingContext [ myDataSet , "person" ] ; </p><p>　　下列代码是以Sql Server 2000数据库为模型，创建一个名称为"myBind"的BindingManagerBase对象。</p><p>// 设定数据连接字符串，此字符串的意思是打开Sql server数据库，服务器名称为server1,数据库为data1<br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定person数据表<br />myCommand.Fill ( myDataSet , " person " ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;<br />myBind = this.BindingContext [ myDataSet , "person" ] ; </p><p>　　得到了是同一数据源的BindingManagerBase对象，通过改变此对象的"Position"属性值，这样绑定数据的组件显示的数据就随之变化，从而实现导航数据记录。</p><p>　　&lt; I &gt; .导航按钮"上一条"实现方法：</p><p>protected void GoPrevious ( object sender , System.EventArgs e )<br />{<br />if ( myBind.Position == 0 ) <br />MessageBox.Show ( "已经到了第一条记录！" , "信息提示！" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;<br />else<br />myBind.Position -= 1 ;<br />} </p><p>　　&lt; II &gt; . 导航按钮"下一条"实现方法：</p><p>protected void GoNext ( object sender , System.EventArgs e )<br />{<br />if ( myBind.Position == myBind.Count -1 )<br />MessageBox.Show ( "已经到了最后一条记录！", "信息提示！" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;<br />else<br />myBind.Position += 1 ;<br />} </p><p>&lt; III &gt; . 导航按钮"至尾"实现方法：</p><p>protected void GoLast ( object sender , System.EventArgs e )<br />{<br />myBind.Position = myBind.Count - 1 ;<br />}<br />&lt; IV &gt; . 导航按钮"至首"实现方法：<br />protected void GoFirst ( object sender , System.EventArgs e )<br />{<br />myBind.Position = 0 ;<br />} </p><p>　　注释："Count"是BindingManagerBase对象的另外一个重要的属性，是数据集记录的总数。</p><p><br />　　三．实现删除记录： </p><p>　　在对数据记录进行操作的时候，有二点必须十分清晰：</p><p>　　其一：在对数据记录进行操作的时候，我想有一些程序员一定有这样一个疑惑，当对数据库服务器请求数据集的时候，就会产生"DataSet"对象，用以管理数据集，这样如果这些对数据库服务器的请求非常多，同样也就会产生很多的"DataSet"对象，达到一定时候必然会使得数据库服务器崩溃。这种想法是自然的，但和实际并不相符，因为"DataSet"对象并不是在服务器端产生的，而是在客户端产生的。所以面对众多的数据请求的时候对数据库服务器的影响并不十分太大。</p><p>　　其二：记得在用Delphi编写三层数据模型的时候的，每一次对数据库的修改其实只是对第二层产生的数据集的修改，要真正修改数据库，还必须调用一个另外的方法。在用ADO.NET处理数据库的时候，虽然处理的直接对象是数据库，但此时"DataSet"对象中的内容并没有随之改变，而绑定的数据组件显示的数据又来源于"DataSet"对象，这样就会产生一个错觉，就是修改了的记录并没有修改掉，删除的记录并没有删除掉。所以对数据记录进行操作的时候，在修改数据库后，还要对"DataSet"对象进行必要的修改，这样才能保证"DataSet"对象和数据库内容一致、同步。下面代码是删除当前绑定组件显示的记录的程序代码，此代码是以Access 2000数据库为模板的：</p><p>protected void Delete_record ( object sender , System.EventArgs e )<br />{ <br />DialogResult r = MessageBox.Show ( "是否删除当前记录！" , "删除当前记录！" , MessageBoxButtons.YesNo , MessageBoxIcon.Question ) ;<br />int ss = ( int ) r ;<br />　 if ( ss == 6 ) // 按动"确定"按钮<br />{ <br />try{<br />file://连接到一个数据库<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strDele = "DELETE FROM person WHERE id= " + t_id.Text ;<br />OleDbCommand myCommand = new OleDbCommand ( strDele , myConn ) ;<br />file://从数据库中删除指定记录<br />myCommand.ExecuteNonQuery ( ) ;<br />file://从DataSet中删除指定记录<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . Delete ( ) ;<br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;<br />myConn.Close ( ) ;<br />}<br />catch ( Exception ed )<br />{<br />MessageBox.Show ( "删除记录错误信息： " + ed.ToString ( ) , "错误！" ) ;<br />} <br />}<br />} </p><p>　　下面代码是删除当前绑定组件显示的记录的程序代码，此代码是以Sql Server 2000数据库为模板的，二者的区别仅仅在于数据链接：</p><p>protected void Delete_record ( object sender , System.EventArgs e )<br />{ <br />DialogResult r = MessageBox.Show ( "是否删除当前记录！" , "删除当前记录！" , MessageBoxButtons.YesNo , MessageBoxIcon.Question ) ;<br />int ss = ( int ) r ;<br />　 if ( ss == 6 ) // 按动"确定"按钮<br />{ <br />try{<br />// 设定数据连接字符串，意思是打开Sql server数据库，服务器名称为server1,数据库为data1<br />string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strDele = "DELETE FROM person WHERE id= " + t_id.Text ;<br />OleDbCommand myCommand = new OleDbCommand ( strDele , myConn ) ;<br />file://从数据库中删除指定记录<br />myCommand.ExecuteNonQuery ( ) ;<br />file://从DataSet中删除指定记录<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . Delete ( ) ;<br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;<br />myConn.Close ( ) ;<br />}<br />catch ( Exception ed )<br />{<br />MessageBox.Show ( "删除记录错误信息： " + ed.ToString ( ) , "错误！" ) ;<br />} <br />}<br />} </p><p>　　在这二段代码中，在更改数据库的同时也对"DatsSet"对象进行了必要的修改。<br />下图是程序中对数据记录进行删除操作的运行界面： </p><p><strong>四．插入数据记录： <br /><br /></strong>　　 对数据库进行插入记录操作和删除记录操作基本的思路是一致的，就是通过ADO.NET首先插入数据记录到数据库，然后对"DataSet"对象进行必要的修改。下列代码就是以Access 2000数据库为模型修改当前记录的代码： <br /><br />protected void Update_record ( object sender , System.EventArgs e ) <br />{ <br />int i = myBind.Position ; <br />try{ <br />file://连接到一个数据库 <br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb " ; <br />OleDbConnection myConn = new OleDbConnection ( strCon ) ; <br />myConn.Open ( ) ; <br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . BeginEdit ( ) ; <br />file://从数据库中修改指定记录 <br />string strUpdt = " UPDATE person SET xm = '" <br />+ t_xm.Text + "' , xb = '" <br />+ t_xb.Text + "' , nl = " <br />+ t_nl.Text + " , zip = " <br />+ t_books.Text + " WHERE id = " + t_id.Text ; <br />OleDbCommand myCommand = new OleDbCommand ( strUpdt , myConn ) ; <br />myCommand.ExecuteNonQuery ( ) ; <br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . EndEdit ( ) ; <br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ; <br />myConn.Close ( ) ; <br />} <br />catch ( Exception ed ) <br />{ <br />MessageBox.Show ( "修改指定记录错误： " + ed.ToString ( ) , "错误！" ) ; <br />} <br />myBind.Position = i ; <br />} <br />　　 由于对Sql Server 2000数据记录修改操作和Access 2000数据记录修改操作的差异只在于不同的数据链接，具体的代码可以参考"删除数据记录"中的代码，在这里就不提供了。<br /><strong>五．插入数据记录： </strong><br /><br />　　 和前面二种操作在思路是一致的，就是通过ADO.NET首先插入数据记录到数据库，然后对"DataSet"对象进行必要的修改。下列代码就是以Access 2000数据库为模型插入一条数据记录的代码 <br /><br />protected void Insert_record ( object sender , System.EventArgs e ) <br />{ <br />try <br />{ <br />file://判断所有字段是否添完，添完则执行，反之弹出提示 <br />if ( t_id.Text != "" &amp;&amp; t_xm.Text != "" &amp;&amp; t_xb.Text != "" &amp;&amp; t_nl.Text != "" &amp;&amp; t_books.Text != "" ) <br />{ <br />string myConn1 = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; <br />OleDbConnection myConn = new OleDbConnection ( myConn1 ) ; <br />myConn.Open ( ) ; <br />string strInsert = " INSERT INTO person ( id , xm , xb , nl , zip ) VALUES ( " ; <br />strInsert += t_id.Text + ", '" ; <br />strInsert += t_xm.Text + "', '" ; <br />strInsert += t_xb.Text + "', " ; <br />strInsert += t_nl.Text + ", " ; <br />strInsert += t_books.Text + ")" ; <br />OleDbCommand inst = new OleDbCommand ( strInsert , myConn ) ; <br />inst.ExecuteNonQuery ( ) ; <br />myConn.Close ( ) ; <br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . BeginEdit ( ) ; <br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . EndEdit ( ) ; <br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ; <br />} <br />else <br />{ <br />MessageBox.Show ( "必须填满所有字段值！" , "错误！" ) ; <br />} <br />} <br />catch ( Exception ed ) <br />{ <br />MessageBox.Show ( "保存数据记录发生 " + ed.ToString ( ) , "错误！" ) ; <br />} <br />} <br />　　 同样对Sql Server 2000数据库进行插入记录操作和Access 2000数据库插入记录操作的差异也只在于不同的数据链接，具体的代码可以参考"删除数据记录"中的代码，在这里就不提供了。<br />　　六．Visual C＃数据库编程的完成源代码和程序运行的主界面： </p><p> </p><p>　　掌握了上面要点，编写一个完整的数据库编程的程序就显得非常容易了，下面是Visual C＃进行数据库编程的完整代码（Data01.cs），此代码是以Access 2000数据库为模型设计的，具体如下：</p><p>using System ;<br />using System.Drawing ;<br />using System.ComponentModel ;<br />using System.Windows.Forms ;<br />using System.Data.OleDb ;<br />using System.Data ;</p><p>public class Data : Form <br />{<br />private System.ComponentModel.Container components = null ;<br />private Button lastrec ;<br />private Button nextrec ;<br />private Button previousrec ;<br />private Button firstrec ;<br />private TextBox t_books ;<br />private TextBox t_nl ;<br />private ComboBox t_xb ;<br />private TextBox t_xm ;<br />private TextBox t_id ;<br />private Label l_books ;<br />private Label l_nl ;<br />private Label l_xb ;<br />private Label l_xm ;<br />private Label l_id ;<br />private Label label1 ;<br />private DataSet myDataSet ;<br />private Button button1 ;<br />private Button button2 ;<br />private Button button3 ;<br />private Button button4 ;<br />private BindingManagerBase myBind ; </p><p>public Data ( ) <br />{<br />file://连接到一个数据库<br />GetConnected ( ) ; <br />// 对窗体中所需要的内容进行初始化<br />InitializeComponent ( ) ;<br />}<br />file://清除在程序中使用过的资源<br />protected override void Dispose( bool disposing )<br />{<br />if( disposing )<br />{<br />if ( components != null ) <br />{<br />components.Dispose ( ) ;<br />}<br />}<br />base.Dispose( disposing ) ;<br />}<br />public static void Main ( ) <br />{<br />Application.Run ( new Data ( ) ) ;<br />}<br />public void GetConnected ( )<br />{<br />try<br />{<br />file://创建一个 OleDbConnection<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />string strCom = " SELECT * FROM person " ;<br />file://创建一个 DataSet<br />myDataSet = new DataSet ( ) ;</p><p>myConn.Open ( ) ;<br />file://用 OleDbDataAdapter 得到一个数据集<br />OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ;<br />file://把Dataset绑定books数据表<br />myCommand.Fill ( myDataSet , "person" ) ;<br />file://关闭此OleDbConnection<br />myConn.Close ( ) ;<br />}<br />catch ( Exception e )<br />{<br />MessageBox.Show ( "连接错误! " + e.ToString ( ) , "错误" ) ; <br />}<br />} <br />private void InitializeComponent ( )<br />{</p><p>file://添加控件，略</p><p>this.Name = "Data" ;<br />this.Text = "Visual C＃的数据库编程！" ;<br />this.ResumeLayout(false) ;<br />myBind = this.BindingContext [ myDataSet , "person" ] ;<br />}<br />protected void New_record ( object sender , System.EventArgs e )<br />{</p><p>t_id.Text = ( myBind.Count + 1 ).ToString ( ) ;<br />t_xm.Text = "" ;<br />t_xb.Text = "" ;<br />t_nl.Text = "" ;<br />t_books.Text = "" ;</p><p>}<br />protected void Insert_record ( object sender , System.EventArgs e )<br />{<br />try<br />{<br />file://判断所有字段是否添完，添完则执行，反之弹出提示 <br />if ( t_id.Text != "" &amp;&amp; t_xm.Text != "" &amp;&amp; t_xb.Text != "" &amp;&amp; t_nl.Text != "" &amp;&amp; t_books.Text != "" )<br />{<br />string myConn1 = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ;<br />OleDbConnection myConn = new OleDbConnection ( myConn1 ) ;<br />myConn.Open ( ) ;<br />string strInsert = " INSERT INTO person ( id , xm , xb , nl , zip ) VALUES ( " ;<br />strInsert += t_id.Text + ", '" ;<br />strInsert += t_xm.Text + "', '" ;<br />strInsert += t_xb.Text + "', " ;<br />strInsert += t_nl.Text + ", " ;<br />strInsert += t_books.Text + ")" ;<br />OleDbCommand inst = new OleDbCommand ( strInsert , myConn ) ;<br />inst.ExecuteNonQuery ( ) ;<br />myConn.Close ( ) ;<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . BeginEdit ( ) ;<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . EndEdit ( ) ;<br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;<br />}<br />else<br />{<br />MessageBox.Show ( "必须填满所有字段值！" , "错误！" ) ;<br />}<br />}<br />catch ( Exception ed )<br />{<br />MessageBox.Show ( "保存数据记录发生 " + ed.ToString ( ) , "错误！" ) ;<br />} <br />}</p><p>protected void Update_record ( object sender , System.EventArgs e )<br />{<br />int i = myBind.Position ;<br />try{<br />file://连接到一个数据库<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . BeginEdit ( ) ;<br />file://从数据库中修改指定记录<br />string strUpdt = " UPDATE person SET xm = '"<br />+ t_xm.Text + "' , xb = '"<br />+ t_xb.Text + "' , nl = "<br />+ t_nl.Text + " , zip = "<br />+ t_books.Text + " WHERE id = " + t_id.Text ;<br />OleDbCommand myCommand = new OleDbCommand ( strUpdt , myConn ) ;<br />myCommand.ExecuteNonQuery ( ) ; <br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . EndEdit ( ) ;<br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;<br />myConn.Close ( ) ;<br />}<br />catch ( Exception ed )<br />{<br />MessageBox.Show ( "修改指定记录错误： " + ed.ToString ( ) , "错误！" ) ; <br />}<br />myBind.Position = i ;<br />}<br /></p><p>protected void Delete_record ( object sender , System.EventArgs e )<br />{ <br />DialogResult r = MessageBox.Show ( "是否删除当前记录！" , "删除当前记录！" , MessageBoxButtons.YesNo , MessageBoxIcon.Question ) ;<br />int ss = ( int ) r ;<br />　 if ( ss == 6 ) // 按动"确定"按钮<br />{ <br />try{<br />file://连接到一个数据库<br />string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb " ;<br />OleDbConnection myConn = new OleDbConnection ( strCon ) ;<br />myConn.Open ( ) ;<br />string strDele = "DELETE FROM person WHERE id= " + t_id.Text ;<br />OleDbCommand myCommand = new OleDbCommand ( strDele , myConn ) ;<br />file://从数据库中删除指定记录<br />myCommand.ExecuteNonQuery ( ) ;<br />file://从DataSet中删除指定记录<br />myDataSet.Tables [ "person" ] . Rows [ myBind.Position ] . Delete ( ) ;<br />myDataSet.Tables [ "person" ] . AcceptChanges ( ) ;<br />myConn.Close ( ) ;<br />}<br />catch ( Exception ed )<br />{<br />MessageBox.Show ( "删除记录错误信息： " + ed.ToString ( ) , "错误！" ) ;<br />} <br />}<br />}</p><p>file://按钮"尾记录"对象事件程序 <br />protected void GoLast ( object sender , System.EventArgs e )<br />{<br />myBind.Position = myBind.Count - 1 ;<br />}</p><p>file://按钮"下一条"对象事件程序 <br />protected void GoNext ( object sender , System.EventArgs e )<br />{<br />if ( myBind.Position == myBind.Count -1 )<br />MessageBox.Show ( "已经到了最后一条记录！", "信息提示！" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;<br />else<br />myBind.Position += 1 ;<br />}<br />file://按钮"上一条"对象事件程序 <br />protected void GoPrevious ( object sender , System.EventArgs e )<br />{<br />if ( myBind.Position == 0 ) <br />MessageBox.Show ( "已经到了第一条记录！" , "信息提示！" , MessageBoxButtons.OK , MessageBoxIcon.Information ) ;<br />else<br />myBind.Position -= 1 ;<br />}<br />file://按钮"首记录"对象事件程序<br />protected void GoFirst ( object sender , System.EventArgs e )<br />{<br />myBind.Position = 0 ;<br />}<br />}<br />图02：Visual C＃数据库编程主界面<br /></p><p>　　对于以Sql Server 2000数据库为模型的程序代码，只要把Data01.cs中的数据链接，即：<br /></p><p>string myConn1 = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = db.mdb" ; </p><p>　　改换成：<br /></p><p>string strCon = "Provider = SQLOLEDB.1 ; Persist Security Info = False ; User ID = sa ; Initial Catalog = data1 ; Data Source = server1 " ; </p><p>　　注释：此数据链接代表的意思是：打开Sql server数据库，服务器名称为server1,数据库为data1<br />就可以得到Visual C＃针对Sql Server 2000数据库为模板编程的完成源程序代码了。所以本文就不再提供了。</p><p>　　七．总结：</p><p>　　数据库编程始终是程序编程内容中的一个重点和难点。而以上介绍的这些操作又是数据库编程中最为基本，也是最为重要的内容。那些复杂的编程无非是以上这些处理的若干个叠加。</p><img src ="http://www.cnitblog.com/bbming/aggbug/20349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/bbming/" target="_blank">老Ming</a> 2006-12-11 10:52 <a href="http://www.cnitblog.com/bbming/archive/2006/12/11/20349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>