ADO.NET無(wú)連接模式的詳細(xì)介紹
無(wú)連接模式:可以在沒(méi)有打開連接時(shí)在內(nèi)存中操作數(shù)據(jù),DataAdapter通過(guò)管理連接為無(wú)連接模式提供服務(wù),當(dāng)要從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)時(shí),DataAdapter打開一個(gè)連接,填充指定的DataSet,等數(shù)據(jù)讀取完馬上自動(dòng)關(guān)閉連接,然后可以對(duì)數(shù)據(jù)做修改,再次使用DataAdapter打開連接,持久化修改(無(wú)論是更新,刪除或是更新),最后自動(dòng)關(guān)閉連接,使用無(wú)連接模式的情況是有一些獨(dú)立數(shù)據(jù),它們不會(huì)發(fā)生改變或者很少改變,因?yàn)樵趯⑻畛銬ataSet和更新數(shù)據(jù)這段時(shí)間內(nèi)數(shù)據(jù)庫(kù)中的實(shí)際數(shù)據(jù)也許會(huì)發(fā)生改變,如果需要將數(shù)據(jù)立即持久化到數(shù)據(jù)庫(kù)請(qǐng)使用連接模式
讀取數(shù)據(jù)到DataSet:無(wú)連接意味著一個(gè)連接建立了一個(gè)與數(shù)據(jù)庫(kù)的會(huì)話,請(qǐng)求的數(shù)據(jù)讀入到DataSet中,然后通過(guò)斷開數(shù)據(jù)庫(kù)的連接關(guān)閉會(huì)話,這時(shí)會(huì)話因?yàn)榕c數(shù)據(jù)庫(kù)的斷開而關(guān)閉,DataSet成為一個(gè)無(wú)連接的數(shù)據(jù)庫(kù)
/// <summary>
/// 查詢學(xué)生信息
/// </summary>
/// <returns>返回填充了學(xué)生表的DataSet</returns>
public DataSet GetUserInfor()
{
string str = "Data Source=.;Initial Catalog=Student;Integrated Security=True";
var conn = new SqlConnection(str);
DataSet ds = new DataSet();
var sda = new SqlDataAdapter("SELECT * FROM Student",conn);
sda.Fill(ds, "student");//調(diào)用fill方法時(shí),SqlDataAdapter會(huì)自動(dòng)打開連接,讀取數(shù)據(jù)然后關(guān)閉連接
foreach (DataRow dr in ds.Tables["student"].Rows)
{
Console.WriteLine(dr["name"]);
}
return ds;
}
將DataSet的修改保存到數(shù)據(jù)庫(kù)
插入數(shù)據(jù)
/// <summary>
/// 插入學(xué)生信息,并返回插入后的DataSet
/// </summary>
/// <param name="stu">學(xué)生實(shí)體類</param>
public DataSet InsertStudnt(Student stu)
{
DataSet ds = GetUserInfor();
string str = "Data Source=.;Initial Catalog=Student;Integrated Security=True";
string sql = "INSERT INTO student VALUES (@name,@age)";
var conn = new SqlConnection(str);
var cmd = new SqlCommand(sql,conn);
var sda = new SqlDataAdapter();
SqlParameter sqlParam1 = new SqlParameter()
{
ParameterName = "@name",
SourceColumn = "name"
};
SqlParameter sqlParam2 = new SqlParameter()
{
ParameterName = "@age",
SourceColumn = "age"
};
SqlParameter[] sqlParamArray = new SqlParameter[] {sqlParam1,sqlParam2 };
cmd.Parameters.AddRange(sqlParamArray);
sda.InsertCommand = cmd;
DataRow dr = ds.Tables["student"].NewRow();
dr["name"] = stu.name;
dr["age"] = stu.age;
ds.Tables["student"].Rows.Add(dr);
sda.Update(ds,"student");
return ds;
}
更新數(shù)據(jù)
/// <summary>
/// 根據(jù)ID更新姓名和年齡
/// </summary>
/// <param name="name">姓名</param>
/// <param name="age">年齡</param>
/// <param name="id">學(xué)生ID</param>
/// <returns>返回更新后的DataSet</returns>
public DataSet UpdateStudent(Student stu,int id)
{
DataSet ds = GetUserInfor();
string str = "Data Source=.;Initial Catalog=Student;Integrated Security=True";
string sql = "UPDATE student SET name=@name,age=@age WHERE id=@id";
var conn = new SqlConnection(str);
var cmd = new SqlCommand(sql, conn);
var sda = new SqlDataAdapter();
SqlParameter param1 = new SqlParameter()
{
ParameterName="@name",SourceColumn="name"
};
SqlParameter param2 = new SqlParameter()
{
ParameterName = "@age",
SourceColumn = "age",
SqlDbType=SqlDbType.Int
};
SqlParameter param3 = new SqlParameter()
{
ParameterName = "@id",
SourceColumn = "id"
};
SqlParameter[] param = new SqlParameter[] {param1,param2,param3 };
cmd.Parameters.AddRange(param);
sda.UpdateCommand = cmd;
DataTable dt = ds.Tables["student"];
foreach (DataRow dr in dt.Rows)
{
int oldID=Convert.ToInt32(dr["id"]);
if (oldID == id)
{
dr["name"] = stu.name;
dr["age"] = stu.age;
}
}
sda.Update(ds,"student");
return ds;
}
刪除數(shù)據(jù)
/// <summary>
/// 根據(jù)ID刪除一個(gè)學(xué)生
/// </summary>
/// <param name="id">返回更新后的DataSet</param>
public DataSet DeleteStudent(int id)
{
DataSet ds = GetUserInfor();
string str = "Data Source=.;Initial Catalog=Student;Integrated Security=True";
string sql = "DELETE FROM student WHERE id=@id";
var conn = new SqlConnection(str);
var cmd = new SqlCommand(sql, conn);
var sda = new SqlDataAdapter();
SqlParameter param = new SqlParameter()
{
ParameterName="@id",SourceColumn="id",SqlDbType=SqlDbType.Int
};
cmd.Parameters.Add(param);
sda.DeleteCommand = cmd;
DataTable dt=ds.Tables["student"];
foreach (DataRow dr in dt.Rows)
{
int oldId = Convert.ToInt32(dr["id"]);
if (oldId == id)
dr.Delete();
}
sda.Update(ds,"student");
return ds;
}
相關(guān)文章
ASP.Net中利用CSS實(shí)現(xiàn)多界面的兩種方法
這篇文章主要介紹了ASP.Net中利用CSS實(shí)現(xiàn)多界面的兩種方法,包括動(dòng)態(tài)加載css樣式與動(dòng)態(tài)設(shè)置頁(yè)面同類控件的方法來(lái)實(shí)現(xiàn)該功能,是非常具有實(shí)用價(jià)值的技巧,需要的朋友可以參考下2014-12-12
.Net Core簡(jiǎn)單使用Mvc內(nèi)置的Ioc
這篇文章主要為大家詳細(xì)介紹了.Net Core簡(jiǎn)單使用Mvc內(nèi)置的Ioc,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
NET Core TagHelper實(shí)現(xiàn)分頁(yè)標(biāo)簽
這篇文章主要介紹了NET Core TagHelper實(shí)現(xiàn)分頁(yè)標(biāo)簽,講述實(shí)現(xiàn)一個(gè)簡(jiǎn)單分頁(yè)和總要注意步奏,感興趣的小伙伴們可以參考一下2016-07-07
asp.net 程序性能優(yōu)化的七個(gè)方面 (c#(或vb.net)程序改進(jìn))
在我們開發(fā)asp.net過(guò)程中,需要注意的一些細(xì)節(jié),以達(dá)到我們優(yōu)化程序執(zhí)行效率。2009-03-03
ASP.NET實(shí)現(xiàn)可以縮放和旋轉(zhuǎn)的圖片預(yù)覽頁(yè)效果
本文詳細(xì)介紹了如何在ASP.NET?WebForms中實(shí)現(xiàn)一個(gè)功能豐富的圖片預(yù)覽頁(yè)面,通過(guò)結(jié)合HTML、CSS和JavaScript,用戶可以方便地對(duì)圖片進(jìn)行放大、縮小以及旋轉(zhuǎn)操作,感興趣的朋友跟隨小編一起看看吧2024-08-08
ng-repeat中Checkbox默認(rèn)選中的方法教程
這篇文章主要給大家介紹了關(guān)于ng-repeat中Checkbox默認(rèn)選中的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
用.NET 2.0壓縮/解壓功能處理大型數(shù)據(jù)
用.NET 2.0壓縮/解壓功能處理大型數(shù)據(jù)...2006-09-09
asp.net 長(zhǎng)文章通過(guò)設(shè)定的行數(shù)分頁(yè)
長(zhǎng)文章通過(guò)設(shè)定的行數(shù)來(lái)實(shí)現(xiàn)分頁(yè)的代碼。2009-12-12
ASP.NET網(wǎng)站第一次訪問(wèn)慢的解決方法
這篇文章主要為大家詳細(xì)介紹了IIS8上ASP.NET第一次訪問(wèn)慢的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04

