数据库在程序设计中的地位越来越来高,很有必要掌握这种编程方法。虽然要想在短时间内完全掌握数据库编程是很有难度的,但我们可以首先掌握基本的知识,其他的复杂的技术其实是在这些基础知识上多次迭代而产生的。下面我们来分篇介绍基本的数据库的知识。这里介绍的是ADO.net(ADO和它是差不多的)。
访问数据库的方法有很多,这里介绍的是ADO.NET技术。 1. 连接和关闭数据库 首先要连接数据库,可以通过ADO.NET connection对象来连接数据库。ADO.NET提了 好几个connection对象,例如:OleDbConnection 对象(用于访问通过传统ADO访问的OLE DB数据提供者)和SqlConnection对象(提供队SQL Server的优化访问)。如果要访问的数据库是SQL Server就用后一个对象,否则就用前面一个对象。使用连接对象之前必须要包含相应的命名空间。 using System.Data.OleDb; 在建立连接对象实例之前,必须先要填充连接对象的ConnectionString属性,这个属性包含了多个参数: Provider 数据库提供者的名称 Data Source 数据源,即数据库的路径 User ID 用户名 Password 密码 DRIVER 数据库驱动器的名称,如果指定了DSN就不要这个参数了 SERVER 数据源服务器的网络名称 这个属性初始化的格式是:(假定连接的事Access数据库,数据库文件在C : \temp目录下) m_cnADONetConnection.ConnectionString = @” Provider = Microsoft.Jet.OLEDB.4.0;Data Source = C : \temp\contacts.mdb; User ID = zlw ;Password = 123456 ”; 其他类型的数据库的提供者信息需查阅相关资料。 连接对象的属性设置好后,就可以创建实例对象了: m_cnADONetConnection = new OleDbConnection(); 接下来,可以打开数据库了: m_cnADONetConnection.Open(); 数据库使用完毕后要关闭连接,释放资源: m_cnADONetConnection.Close(); m_cnADONetConnection.Dispose();
2.操作数据库 A.使用sqlcommand 和OleDbCommand类来执行sql语句。 连接数据库后就可以创建一个语句命令对象,然后执行这个语句。 OleDbCommand str = new OleDbCommand(“select * from texts” , m_cnADONetConnection); Str.ExecuteScalar(); //执行这个语句 oleDbDataReader daOle = Str.ExecuteReader(); //返回对象 daOle.FieldCount; //返回查询结构当前行的列数 daOle.GetString(i); //返回当前行第i列的字符串形式 daOle.Read(); // 前进到下一条记录 Sql语句的执行函数有很多种 , 其中最有用的是ExecuteReader()这个函数,这个函数返回一个OleDbDaraReader类对象,这个对象包含语句的查询结果,其中有很多方法可以对数据进行操作。
B.对数据库进行操作,最好的方法是创建DataTable对象,这个对象是数据源中数据的一个快照,可以先对DataTable进行操作,然后再将修改的快照返回数据库,以实现数据的更新。 在使用DataTable之前先要填充这个对象,这里利用DataAdapter的Fill方法。先构造对象: OleDbDataAdapter m_daDataAdapter = new OleDbDataAdapter (“Select * From Contacts” , m_cnADONetConnection); 参数1指定拷贝到DataTable中的数据,参数2指定连接对象。 为了使DataTable能对数据进行操作,此时还应该建立一个CommandBuilder对象,这个对象建立后,并不用主动调用它,只要将它和DataAdapter关联起来,就可以在幕后对数据进行操作了。 OleDbCommandBuilder m_cbCommandBuilder = new OleDbCommandBuilder(m_daDataAdapter); 准备工作完成后就应该创建并填充DataTable了: DataTable m_dtContacts = new DataTable(); m_daDataAdapter.Fill(m_dtContacts);
DataTable可以看成是一个集合,我们可以通过它来直接操作数据库中的表。如: 访问指定行中的指定列的数据,可以通过语句: m_dtContacts[“行号”][“列名”] = “” ; //j将指定位置的数据修改 字符串变量 = m_dtContacts[“行号”][“列名”] ; //取得指定位置的数据 //在表中增加一行 DataRow drNewRow = m_dtContacts.NewRow(); drNewRow[“第一列名”] = str ; drNewRow[“第二列名”] = str; …… m_dtContacts.Rows.Add(drNewRow) ; //删除一行 m_dtContacts.Rows[“行号”].Delete();
在对内存数据库DataSet进行修改处理后必须调用下面语句,才能反映到物理数据库中: m_daDataAdapter.Update(m_dtContacts) ;
上面介绍的修改是通过修改DataSet,然后同步物理数据库的修改。还有一种方法是通过修改物理数据库,然后同步DataSet。这种方法是通过SQL语句来修改物理数据库,然后更新DataSet来同步。具体代码为: string strDele = "DELETE FROM Contacts where 条件 ; OleDbCommand myCommand = new OleDbCommand ( strDele , myConn ) ; file://从数据库中删除指定记录 myCommand.ExecuteNonQuery ( ) ; // 执行SQL语句 file://从DataSet中删除指定记录 ,同步操作 myDataSet.Tables [ " Contacts " ] . Rows [ 行号 ] . Delete ( ) ; myDataSet.Tables [ " Contacts " ] . AcceptChanges ( ) ;
3.绑定数据库 在c#中任何一个从Control类派生来的类均可以绑定数据源。绑定数据源必须要用到DataSet,这个类和DataTable类的区别就像数据库中表和数据库的区别,一个DataSet可以包含多个DataTable,在我们用DataAdapter填充DataTable时,也可以填充DataSet,其语法为: DataSet ds = new DataSet(); m-daDataAdapter。Fill(ds , “Contacts”); // Contacts是ds关联的表名 在有了ds后就可以进行数据的绑定了 textBox1.DataBindings.Add ( "Text" , ds , "Contacts。列名" ) ; 这句代码将表Contacts中的某列的当前行绑定在textBox1上。“Text”是数据类型。 使用这种方法也可以将表中某列绑定到其他的简单控件上。 当要将数据绑定到复杂控件上,必须使用以下代码: ComboBox1.DataSource = ds ; 这种绑定将一列绑定在了ComboBox1上了,我们也可以使用上面的方法将某列中的某行绑定在ComboBox1上。 在控件的容器Form中还有一个BindingManagerBase类对象,这个对象是用来关联关联到此窗口的DataSet的,利用下面语句可以关联这两个对象: BindingManagerBase bmb = this . BindingContext [ ds , "Contacts" ] ; 现在可以利用bmb来操作ds,其中bmb中的Position成员是用来指定ds表中的当前行的,可以对它进行赋值,改变ds表的当前行,这样可以改变绑定到此ds的空间中显示的值。
对于DataSet和DataTable是我们在内存中建立的数据库表的拷贝,其实没有数据库我们也可以在内存中建立一个这样的快照,其语法为: DataSet ds = new DataSet(); // 建立一个空数据库 DataTable dt = ds2.Tables.Add("mdb"); //建立一张表 dt.Columns.Add("01", typeof(string)); //添加一列 dt.Columns.Add("02", typeof(string)); //再添加一列 DataRow dr2 = ds2.Tables["mdb"].NewRow(); //添加一个新行 dr2[0] = "1"; //为行赋值 dr2[1] = "2"; ds2.Tables["mdb"].Rows.Add(dr2) ; //将行添加到表中 |
|