近幾天對(duì)DataSet的新認(rèn)識(shí)
更新時(shí)間:2007年04月16日 00:00:00 作者:
做管理軟件總是在和DataTable,DataSet,DataGridView打交道,以前經(jīng)常用,但是自己思考的問(wèn)題不多,用的都是最笨的方法,做出來(lái)的都是最丑陋的界面和低效率的程序,上周某天晚上把DataGridView認(rèn)真的研究了一下,主要是界面上的東西,覺(jué)得被我改進(jìn)后的界面看起來(lái)就是不一樣了,呵呵~我覺(jué)得看起來(lái)還可以的界面代碼:
DataGridViewCellStyle style = new DataGridViewCellStyle(); //自定義一種單元格樣式.
style.BackColor = Color.LightCyan; //其實(shí)就是換種顏色.
dataGridView1.RowHeadersVisible = false; //覺(jué)得顯示在行頭的那個(gè)方塊不好看,去掉~
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; //單擊某個(gè)單元格,選中其所在的行,這樣看數(shù)據(jù)蠻方便.
dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; //用戶不能調(diào)整列標(biāo)題欄的大小.
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; //列寬度樣式,最長(zhǎng)的數(shù)據(jù)能全部顯示,這樣就不會(huì)出現(xiàn)"....."了.
dataGridView1.AlternatingRowsDefaultCellStyle = style; //奇數(shù)行的樣式設(shè)置為先前定義的樣式,讓相鄰行有顏色反差.
還有很多效果沒(méi)用~但是這樣簡(jiǎn)單的幾行還是能蠻大的改善程序的美觀性~
然后說(shuō)說(shuō)數(shù)據(jù)綁定的新認(rèn)識(shí),以前一直知道這東西,但不知道怎么用,也沒(méi)花時(shí)間去研究,但是這些天在CSDN的論壇里逛時(shí),好象很多人都用這方面問(wèn)題,才讓我有動(dòng)力去研究這些用法.哎~有時(shí)候覺(jué)得自己蠻懶的~經(jīng)常要做數(shù)據(jù)處理方面的東西,竟然還是今天才第一次對(duì)它有深入的了解~慚愧!!
說(shuō)說(shuō)具體的實(shí)現(xiàn)過(guò)程吧~連接SQL Server數(shù)據(jù)庫(kù)的SqlConnection和SqlCommand必不可少~其次是SqlDataAdapter(其實(shí)這個(gè)也經(jīng)常用,但用的只是用它來(lái)讀數(shù)據(jù)),其實(shí)這個(gè)數(shù)據(jù)適配器用處很大,使用它可以很方便的從數(shù)據(jù)庫(kù)里讀取數(shù)據(jù),通過(guò)DataGridView顯示給用戶,用戶修改DataGridView里的數(shù)據(jù)后,再通過(guò)SqlDataAdapter可以把修改的數(shù)據(jù)反映到數(shù)據(jù)庫(kù)里,期間不需要我們寫任何操作數(shù)據(jù)庫(kù)代碼,.Net框架給我們包辦!而且這些數(shù)據(jù)只是存儲(chǔ)在DataSet或者DataTable這樣的緩存中,不用一直保持?jǐn)?shù)據(jù)庫(kù)連接~哦~忘了,還需要使用SqlCommandBuilder來(lái)自動(dòng)生成一些修改的SQL語(yǔ)句,簡(jiǎn)單的實(shí)現(xiàn)代碼如下:
DataSet ds = null;
SqlDataAdapter adapter = null;
SqlCommandBuilder sqlbuilder = null;
//該按鈕讀取數(shù)據(jù),并綁定數(shù)據(jù)
private void button1_Click(object sender, EventArgs e)
...{
ds = new DataSet();
SqlConnection cn = new SqlConnection("Data Source=.;User ID=sa;Password=0;Initial Catalog=BMIS");
SqlCommand cm = new SqlCommand();
adapter = new SqlDataAdapter(cm);
sqlbuilder = new SqlCommandBuilder(adapter);
cm.Connection = cn;
cm.CommandType = CommandType.Text;
cm.CommandText = "select * from [providerInfo]";
adapter.Fill(ds); //該方法把得到的數(shù)據(jù)放入一個(gè)DataTable中
dataGridView1.DataSource = ds.Tables[0]; 把數(shù)據(jù)綁定到DataGridView
}
//向數(shù)據(jù)庫(kù)返回修改的數(shù)據(jù).
private void button2_Click(object sender, EventArgs e)
...{
adapter.Update(ds);
}
用戶在DataGridView中做的數(shù)據(jù)改變會(huì)反映到它所綁定的DataTable里,最后使用SqlDataAdapter的Update方法,把修改反映到數(shù)據(jù)庫(kù)中,感覺(jué)使用的DataTable是一個(gè)中間存儲(chǔ)數(shù)據(jù)工具,而SqlDataAdapter是一個(gè)中間數(shù)據(jù)操作工具,兩者結(jié)合起來(lái)完成更新數(shù)據(jù)源的任務(wù).
現(xiàn)在我想說(shuō)一下這段代碼運(yùn)行后在SQL Server里具體做的是什么事情.首先,假設(shè)我在DataGridView顯示數(shù)據(jù)后,修改了一行數(shù)據(jù),增加了一行數(shù)據(jù).打開SQL Server的事件探察器,對(duì)一次操作做了全程的監(jiān)聽(tīng).登錄,執(zhí)行查詢語(yǔ)句并無(wú)二樣,但是當(dāng)我執(zhí)行一次Update時(shí),都會(huì)調(diào)用一個(gè)名為sp_reset_connection的存儲(chǔ)過(guò)程,看名字猜想應(yīng)該是連接數(shù)據(jù)庫(kù)的意思,然后針對(duì)每一行修改的數(shù)據(jù)執(zhí)行一個(gè)名為exec sp_executesql的存儲(chǔ)過(guò)程,更新數(shù)據(jù)庫(kù),比如我修改一行后的數(shù)據(jù)得到的是這么一條語(yǔ)句"exec sp_executesql N'UPDATE [providerInfo] SET [telNo] = @p1 WHERE (([id] = @p2) AND ([name] = @p3) AND ((@p4 = 1 AND [address] IS NULL) OR ([address] = @p5)) AND ((@p6 = 1 AND [telNo] IS NULL) OR ([telNo] = @p7)) AND ((@p8 = 1 AND [tradeSum] IS NULL) OR ([tradeSum] = @p9)) AND ((@p10 = 1 AND [remark] IS NULL) OR ([remark] = @p11)))', N'@p1 varchar(3),@p2 int,@p3 varchar(2),@p4 int,@p5 varchar(3),@p6 int,@p7 varchar(4),@p8 int,@p9 int,@p10 int,@p11 varchar(3)', @p1 = '110', @p2 = 1, @p3 = 'WT', @p4 = 0, @p5 = 'ABC', @p6 = 0, @p7 = '0000', @p8 = 0, @p9 = 8, @p10 = 0, @p11 = 'AAA'",
而新增一行的語(yǔ)句是"exec sp_executesql N'INSERT INTO [providerInfo] ([name], [address], [telNo], [tradeSum], [remark]) VALUES (@p1, @p2, @p3, @p4, @p5)', N'@p1 varchar(2),@p2 varchar(8000),@p3 varchar(8000),@p4 int,@p5 varchar(8000)', @p1 = 'TT', @p2 = NULL, @p3 = NULL, @p4 = NULL, @p5 = NULL"
這樣看起來(lái)就比較明白SqlDataAdapter的工作機(jī)制了,記錄下發(fā)生變化的行,通過(guò)SqlCommanBuilder生成相應(yīng)的SQL語(yǔ)句,再執(zhí)行,達(dá)到修改目的.
但是我做了一下對(duì)多表關(guān)聯(lián)的得到的數(shù)據(jù)進(jìn)行修改,很遺憾,修改是不成功的,其實(shí)也不應(yīng)該成功,比如我在學(xué)生信息的導(dǎo)師的字段里存的僅僅是老師的ID,而顯示的是根據(jù)導(dǎo)師信息表關(guān)聯(lián)后導(dǎo)師的真實(shí)姓名,用戶如果修改了導(dǎo)師的姓名,反應(yīng)到學(xué)生表里的不可能是老師的ID,修改也就不成功.相信這個(gè)問(wèn)題是有解決辦法的,只是我還沒(méi)發(fā)現(xiàn),應(yīng)該繼續(xù)研究!
最后,羅嗦幾句說(shuō)說(shuō)今天的事情.下午體育課測(cè)50米,在搶跑的情況下跑了個(gè)6秒2~有點(diǎn)假~下課后和大一的幾個(gè)院隊(duì)的同學(xué)打球~打到5點(diǎn)~回來(lái)去澡堂洗澡我真怕我摔在澡堂里~實(shí)在沒(méi)力氣了~不過(guò)跟他們打球心情還是很好的,首先他們打球不菜,討厭和菜的人打~其次他們充滿活力的樣子讓我好象也回到了大一的感覺(jué)~天天打球的生活真好!明天早上英語(yǔ)課默單詞~~不想去了~~所以今晚決定stay up coding!!!還好還有點(diǎn)吃的~
復(fù)制代碼 代碼如下:
DataGridViewCellStyle style = new DataGridViewCellStyle(); //自定義一種單元格樣式.
style.BackColor = Color.LightCyan; //其實(shí)就是換種顏色.
dataGridView1.RowHeadersVisible = false; //覺(jué)得顯示在行頭的那個(gè)方塊不好看,去掉~
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; //單擊某個(gè)單元格,選中其所在的行,這樣看數(shù)據(jù)蠻方便.
dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; //用戶不能調(diào)整列標(biāo)題欄的大小.
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; //列寬度樣式,最長(zhǎng)的數(shù)據(jù)能全部顯示,這樣就不會(huì)出現(xiàn)"....."了.
dataGridView1.AlternatingRowsDefaultCellStyle = style; //奇數(shù)行的樣式設(shè)置為先前定義的樣式,讓相鄰行有顏色反差.
還有很多效果沒(méi)用~但是這樣簡(jiǎn)單的幾行還是能蠻大的改善程序的美觀性~
然后說(shuō)說(shuō)數(shù)據(jù)綁定的新認(rèn)識(shí),以前一直知道這東西,但不知道怎么用,也沒(méi)花時(shí)間去研究,但是這些天在CSDN的論壇里逛時(shí),好象很多人都用這方面問(wèn)題,才讓我有動(dòng)力去研究這些用法.哎~有時(shí)候覺(jué)得自己蠻懶的~經(jīng)常要做數(shù)據(jù)處理方面的東西,竟然還是今天才第一次對(duì)它有深入的了解~慚愧!!
說(shuō)說(shuō)具體的實(shí)現(xiàn)過(guò)程吧~連接SQL Server數(shù)據(jù)庫(kù)的SqlConnection和SqlCommand必不可少~其次是SqlDataAdapter(其實(shí)這個(gè)也經(jīng)常用,但用的只是用它來(lái)讀數(shù)據(jù)),其實(shí)這個(gè)數(shù)據(jù)適配器用處很大,使用它可以很方便的從數(shù)據(jù)庫(kù)里讀取數(shù)據(jù),通過(guò)DataGridView顯示給用戶,用戶修改DataGridView里的數(shù)據(jù)后,再通過(guò)SqlDataAdapter可以把修改的數(shù)據(jù)反映到數(shù)據(jù)庫(kù)里,期間不需要我們寫任何操作數(shù)據(jù)庫(kù)代碼,.Net框架給我們包辦!而且這些數(shù)據(jù)只是存儲(chǔ)在DataSet或者DataTable這樣的緩存中,不用一直保持?jǐn)?shù)據(jù)庫(kù)連接~哦~忘了,還需要使用SqlCommandBuilder來(lái)自動(dòng)生成一些修改的SQL語(yǔ)句,簡(jiǎn)單的實(shí)現(xiàn)代碼如下:
復(fù)制代碼 代碼如下:
DataSet ds = null;
SqlDataAdapter adapter = null;
SqlCommandBuilder sqlbuilder = null;
//該按鈕讀取數(shù)據(jù),并綁定數(shù)據(jù)
private void button1_Click(object sender, EventArgs e)
...{
ds = new DataSet();
SqlConnection cn = new SqlConnection("Data Source=.;User ID=sa;Password=0;Initial Catalog=BMIS");
SqlCommand cm = new SqlCommand();
adapter = new SqlDataAdapter(cm);
sqlbuilder = new SqlCommandBuilder(adapter);
cm.Connection = cn;
cm.CommandType = CommandType.Text;
cm.CommandText = "select * from [providerInfo]";
adapter.Fill(ds); //該方法把得到的數(shù)據(jù)放入一個(gè)DataTable中
dataGridView1.DataSource = ds.Tables[0]; 把數(shù)據(jù)綁定到DataGridView
}
//向數(shù)據(jù)庫(kù)返回修改的數(shù)據(jù).
private void button2_Click(object sender, EventArgs e)
...{
adapter.Update(ds);
}
現(xiàn)在我想說(shuō)一下這段代碼運(yùn)行后在SQL Server里具體做的是什么事情.首先,假設(shè)我在DataGridView顯示數(shù)據(jù)后,修改了一行數(shù)據(jù),增加了一行數(shù)據(jù).打開SQL Server的事件探察器,對(duì)一次操作做了全程的監(jiān)聽(tīng).登錄,執(zhí)行查詢語(yǔ)句并無(wú)二樣,但是當(dāng)我執(zhí)行一次Update時(shí),都會(huì)調(diào)用一個(gè)名為sp_reset_connection的存儲(chǔ)過(guò)程,看名字猜想應(yīng)該是連接數(shù)據(jù)庫(kù)的意思,然后針對(duì)每一行修改的數(shù)據(jù)執(zhí)行一個(gè)名為exec sp_executesql的存儲(chǔ)過(guò)程,更新數(shù)據(jù)庫(kù),比如我修改一行后的數(shù)據(jù)得到的是這么一條語(yǔ)句"exec sp_executesql N'UPDATE [providerInfo] SET [telNo] = @p1 WHERE (([id] = @p2) AND ([name] = @p3) AND ((@p4 = 1 AND [address] IS NULL) OR ([address] = @p5)) AND ((@p6 = 1 AND [telNo] IS NULL) OR ([telNo] = @p7)) AND ((@p8 = 1 AND [tradeSum] IS NULL) OR ([tradeSum] = @p9)) AND ((@p10 = 1 AND [remark] IS NULL) OR ([remark] = @p11)))', N'@p1 varchar(3),@p2 int,@p3 varchar(2),@p4 int,@p5 varchar(3),@p6 int,@p7 varchar(4),@p8 int,@p9 int,@p10 int,@p11 varchar(3)', @p1 = '110', @p2 = 1, @p3 = 'WT', @p4 = 0, @p5 = 'ABC', @p6 = 0, @p7 = '0000', @p8 = 0, @p9 = 8, @p10 = 0, @p11 = 'AAA'",
而新增一行的語(yǔ)句是"exec sp_executesql N'INSERT INTO [providerInfo] ([name], [address], [telNo], [tradeSum], [remark]) VALUES (@p1, @p2, @p3, @p4, @p5)', N'@p1 varchar(2),@p2 varchar(8000),@p3 varchar(8000),@p4 int,@p5 varchar(8000)', @p1 = 'TT', @p2 = NULL, @p3 = NULL, @p4 = NULL, @p5 = NULL"
這樣看起來(lái)就比較明白SqlDataAdapter的工作機(jī)制了,記錄下發(fā)生變化的行,通過(guò)SqlCommanBuilder生成相應(yīng)的SQL語(yǔ)句,再執(zhí)行,達(dá)到修改目的.
但是我做了一下對(duì)多表關(guān)聯(lián)的得到的數(shù)據(jù)進(jìn)行修改,很遺憾,修改是不成功的,其實(shí)也不應(yīng)該成功,比如我在學(xué)生信息的導(dǎo)師的字段里存的僅僅是老師的ID,而顯示的是根據(jù)導(dǎo)師信息表關(guān)聯(lián)后導(dǎo)師的真實(shí)姓名,用戶如果修改了導(dǎo)師的姓名,反應(yīng)到學(xué)生表里的不可能是老師的ID,修改也就不成功.相信這個(gè)問(wèn)題是有解決辦法的,只是我還沒(méi)發(fā)現(xiàn),應(yīng)該繼續(xù)研究!
最后,羅嗦幾句說(shuō)說(shuō)今天的事情.下午體育課測(cè)50米,在搶跑的情況下跑了個(gè)6秒2~有點(diǎn)假~下課后和大一的幾個(gè)院隊(duì)的同學(xué)打球~打到5點(diǎn)~回來(lái)去澡堂洗澡我真怕我摔在澡堂里~實(shí)在沒(méi)力氣了~不過(guò)跟他們打球心情還是很好的,首先他們打球不菜,討厭和菜的人打~其次他們充滿活力的樣子讓我好象也回到了大一的感覺(jué)~天天打球的生活真好!明天早上英語(yǔ)課默單詞~~不想去了~~所以今晚決定stay up coding!!!還好還有點(diǎn)吃的~
相關(guān)文章
.NET數(shù)組使用中的注意事項(xiàng)小結(jié)
這篇文章主要介紹了.NET數(shù)組使用中的注意事項(xiàng),總結(jié)了常見(jiàn)的三個(gè)數(shù)組使用中的注意事項(xiàng),對(duì)于.NET初學(xué)者有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12WPF數(shù)據(jù)綁定中的RelativeSource屬性
這篇文章介紹了WPF數(shù)據(jù)綁定中的RelativeSource屬性,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04MVC使用Log4Net進(jìn)行錯(cuò)誤日志記錄學(xué)習(xí)筆記4
這篇文章主要為大家詳細(xì)介紹了MVC使用Log4Net進(jìn)行錯(cuò)誤日志記錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09asp.net不同頁(yè)面間數(shù)據(jù)傳遞的多種方法
這篇文章主要介紹了asp.net不同頁(yè)面間數(shù)據(jù)傳遞的多種方法,包括使用QueryString顯式傳遞、頁(yè)面對(duì)象的屬性、cookie、Cache等9種方法2014-01-01淺談Asp.Net母版頁(yè)的相關(guān)知識(shí)
母版頁(yè)的使用與普通頁(yè)面類似,可以在其中放置文件或者圖形、任何的HTML控件和Web控件,后置代碼等,這篇文章主要介紹了淺談Asp.Net母版頁(yè)的相關(guān)知識(shí),感興趣的小伙伴們可以參考一下2018-11-11ASP.NET2.0中數(shù)據(jù)源控件之異步數(shù)據(jù)訪問(wèn)
ASP.NET2.0中數(shù)據(jù)源控件之異步數(shù)據(jù)訪問(wèn)...2006-09-09asp.net使用jQuery Uploadify上傳附件示例
Uploadify是JQuery的一個(gè)上傳插件,實(shí)現(xiàn)的效果非常不錯(cuò),帶進(jìn)度顯示,本文是一個(gè)簡(jiǎn)單的介紹Demo,主要是動(dòng)態(tài)傳遞參數(shù)方法,通過(guò)formdata 向處理程序傳遞額外的表單數(shù)據(jù)2014-01-01