前面的文章地址:
http://dev.youkuaiyun.com/develop/article/26/26246.shtm
http://dev.youkuaiyun.com/develop/article/26/26480.shtm
http://dev.youkuaiyun.com/develop/article/26/26481.shtm
这次我们用实例演示DataReader的基本应用,当然同时包含Command以及Connection的基本操作。通过这个实例的学习我们能处理一般的数据库系统了。
WinForm的个人通讯录(vs.net2003 + sql server2000)
1. 建立数据库(前面的文章已经讨论)
2. 启动Vs.net建立contract工程并设计如下界面:
其中重要控件属性列表如下:
控件类型 | Text | Name | 其他 |
ListView |
| listView | 显示模式为details,FullRowSelect为ture |
Button | 确定 | btnOK | 默认enable为false |
Button | 重填 | btnRE | 默认enable为false |
Button | 添加联系人信息 | btnAdd |
|
Button | 修改选中联系人信息 | btnEdit |
|
Button | 删除选中联系人信息 | btnDel |
|
TextBox |
| txtName | 默认enable为false |
TextBox |
| txtPhone | 默认enable为false |
TextBox |
| txtAddress | 默认enable为false,Multiline为true |
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表没有用到,这个表是用来保存登陆信息的,你可以自己为这个程序做一个登陆提示。
整个工程代码下载:点击下载