| |||||||||||||||||||||||||||||||||||||||||
前面的文章地址: http://dev.csdn.net/develop/article/26/26246.shtm http://dev.csdn.net/develop/article/26/26480.shtm http://dev.csdn.net/develop/article/26/26481.shtm 这次我们用实例演示DataReader的基本应用,当然同时包含Command以及Connection的基本操作。通过这个实例的学习我们能处理一般的数据库系统了。 WinForm的个人通讯录(vs.net2003 + sql server2000) 1. 建立数据库(前面的文章已经讨论) 2. 启动Vs.net建立contract工程并设计如下界面:
其中重要控件属性列表如下:
3. 编写代码: 首先我们在窗体加载事件里面添加liestView显示数据事件 private void Form1_Load(object sender, System.EventArgs e) { getInfo(); } 在getInfo方法里面我们必须把数据库里面的信息读取出来同时显示到listView里面。这时一个可行的办法是使用DataReader直接读取数据然后显示。但是我这里不想这样做,我编写一个专门的类contractDB来处理数据,这个类里面有自己的一些方法,实现对数据库的操作。 // class contractDB,封装应用程序所有对数据库的操作事件 using System; using System.Data; using System.Data.SqlClient;
namespace contract { /// <summary> /// contractDB 的摘要说明。 /// </summary> public class contractDB { string connStr = "Data Source = joycode;Initial Catalog = contract;user id = sa;password = 87345587"; //string sql; //SqlCommand cmd;
public contractDB() { // // TODO: 在此处添加构造函数逻辑 // }
/// <summary> /// 获得所有联系人信息 /// </summary> /// <returns>所有联系人信息</returns> public SqlDataReader getReader() { string sql = "select Fid,Fname,Fphone,Faddress from friend"; SqlConnection conn = new SqlConnection(connStr); conn.Open(); SqlCommand cmd = new SqlCommand(sql,conn); SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); return reader; } } } 我的目的很明显,我将调用getReader方法得到我须要的DataReader,因此在Form1里面的getInfo方法代码如下: private void getInfo() { contractDB cdb = new contractDB(); try { SqlDataReader reader = cdb.getReader(); this.listView.Items.Clear(); while(reader.Read()) { string[] subItems = new string[] { reader.GetInt32(0).ToString(), reader.GetString(1), reader.GetString(2), reader.GetString(3) }; this.listView.Items.Add(new ListViewItem(subItems)); } reader.Close(); } catch(Exception ex) { MessageBox.Show(ex.ToString()); } } 上面的代码很简单,不做解释,但是注意由于我们在数据访问类没有考虑异常,那么我们在这里必须处理可能出现的异常。 类似的我们在数据访问类中添加另外的方法:添加联系人,删除联系人,修改信息。整个类文件如下: using System; using System.Data; using System.Data.SqlClient;
namespace contract { /// <summary> /// contractDB 的摘要说明。 /// </summary> public class contractDB { string connStr = "Data Source = bineon;Initial Catalog = contract;user id = sa;password = 87345587"; //string sql; //SqlCommand cmd;
public contractDB() { // // TODO: 在此处添加构造函数逻辑 // }
/// <summary> /// 获得所有联系人信息 /// </summary> /// <returns>所有联系人信息</returns> public SqlDataReader getReader() { string sql = "select Fid,Fname,Fphone,Faddress from friend"; SqlConnection conn = new SqlConnection(connStr); conn.Open(); SqlCommand cmd = new SqlCommand(sql,conn); SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); return reader; }
/// <summary> /// 添加新联系人 /// </summary> /// <param name="_name">姓名</param> /// <param name="_phone">电话</param> /// <param name="_address">地址</param> public void addInfo(string _name,string _phone,string _address) { //可以使用Command Parameter来构造sql语句以获得更好的效率和更高的安全性 string sql = "insert into friend (Fname,Fphone,Faddress) values ('"; sql += _name + "','" + _phone + "','" + _address + "')"; SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = new SqlCommand(sql,conn); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); }
/// <summary> /// 修改联系人信息 /// </summary> /// <param name="_id">需要修改的联系人的id</param> /// <param name="_name"></param> /// <param name="_phone"></param> /// <param name="_address"></param> public void changeInfo(int _id,string _name,string _phone,string _address) { string sql = "update friend set Fname = '" + _name + "',Fphone = '" + _phone + "',Faddress = '" + _address + "'"; SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = new SqlCommand(sql,conn); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); }
/// <summary> /// 删除指定fid的联系人信息 /// </summary> /// <param name="infoID"></param> public void deleteInfo(int infoID) { string sql = "delete friend where Fid = " + infoID; SqlConnection conn = new SqlConnection(connStr); conn.Open(); SqlCommand cmd = new SqlCommand(sql,conn); cmd.ExecuteNonQuery(); conn.Close(); } } } 关于以上类代码的说明:你可以自己写一个基类,然后上面这个类继承该基类,基类包含ExeNonQueryString等方法,这样你就不必每个方法都写建立连接等的代码。另外上面的sql语句构造建议使用Command Parameter的方法,这样效率以及安全性都比较高。 另外数据库里面的admin表没有用到,这个表是用来保存登陆信息的,你可以自己为这个程序做一个登陆提示。 整个工程代码下载:点击下载 |
ADO.NET详细研究(四)--实例演示DataReader基本操作
最新推荐文章于 2024-02-26 08:54:46 发布