ADO.NET詳細研究(四)--實例演示DataReader基本操作
2024-07-10 13:03:13
供稿:網友
前面的文章地址:
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表沒有用到,這個表是用來保存登陸信息的,你可以自己為這個程序做一個登陸提示。
整個工程代碼下載:點擊下載