前面的文章地址:
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工程并设计如下界面:
其中重要控件属性列表如下:
控件类型
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表没有用到,这个表是用来保存登陆信息的,你可以自己为这个程序做一个登陆提示。
整个工程代码下载:点击下载