摘要:
最近做項(xiàng)目中遇到批量添加和修改的問(wèn)題,在老大的指導(dǎo)下學(xué)會(huì)了使用表類(lèi)型參數(shù)來(lái)做批量操作。為了鞏固強(qiáng)化,圍繞這個(gè)技術(shù)又做了個(gè)小demo。
開(kāi)始正題:
首先,我們?cè)赟QL Server 2008下創(chuàng)建一個(gè)示例數(shù)據(jù)庫(kù)名為T(mén)ableTypeTest,再在該數(shù)據(jù)庫(kù)下創(chuàng)建一個(gè)名為Class和Student的表,結(jié)構(gòu)如下:
再在TableTypeTest數(shù)據(jù)庫(kù)下創(chuàng)建一個(gè)自定義表類(lèi)型,取名StudentType,如下:
CREATE TYPE [dbo].[StudentType] AS TABLE( [SID] [int] NOT NULL, [CID] [int] NOT NULL, [SName] [nvarchar](50) NOT NULL ) GO
然后,創(chuàng)建兩個(gè)存儲(chǔ)過(guò)程,批量添加和批量修改,分別為InserNewStudent和UpdateStudent,如下
InserNewStudent:
CREATE PROCEDURE [dbo].[InserNewStudent] @Dt dbo.StudentType readonly AS BEGIN insert into dbo.Student(CID,SName) select t.CID,t.SName from @Dt as t END GO
UpdateStudent:
啟動(dòng)Visual Studio 2010,創(chuàng)建一個(gè)默認(rèn)的窗體應(yīng)用程序,窗體用于顯示所有班級(jí)列表,操作每個(gè)班級(jí)下的學(xué)生通過(guò)選中該班級(jí),然后右鍵操作。如下:
創(chuàng)建顯示班級(jí)下的所有學(xué)生列表窗體,如下:
創(chuàng)建批量添加學(xué)生的窗體,如下:
關(guān)鍵代碼如下:
/// <summary> /// 批量添加 /// </summary> public static bool AddBantch(DataTable dt) { string pName = "dbo.InserNewStudent"; List<SqlParameter> pList = new List<SqlParameter>() { DbHelper.CreateSqlParemeterStructured("@Dt",dt) }; try { DbHelper.RunProcedure(pName, pList); return true; } catch { return false; } }
private void button1_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(this.textBox1.Text) || string.IsNullOrEmpty(this.textBox4.Text) || string.IsNullOrEmpty(this.textBox6.Text)) { MessageBox.Show("不能有空文本框"); } else { DataTable dt = new DataTable(); dt.Columns.Add("SID"); dt.Columns.Add("CID"); dt.Columns.Add("SName"); DataRow dr; dr = dt.NewRow(); dr["SID"] = 0;//此列雖然在添加的時(shí)候無(wú)用,但必須賦值,否則報(bào)錯(cuò) dr["CID"] = CID; dr["SName"] = this.textBox1.Text; dt.Rows.Add(dr); dr = dt.NewRow(); dr["SID"] = 0; dr["CID"] = CID; dr["SName"] = this.textBox4.Text; dt.Rows.Add(dr); dr = dt.NewRow(); dr["SID"] = 0; dr["CID"] = CID; dr["SName"] = this.textBox6.Text; dt.Rows.Add(dr); if (Library.AddBantch(dt)) { MessageBox.Show("批量添加成功!"); this.Close(); } else { MessageBox.Show("批量添加失!"); this.Close(); } } }
創(chuàng)建批量更改班級(jí)學(xué)生姓名的窗體,如下:
關(guān)鍵代碼如下:
/// <summary> /// 批量修改 /// </summary> public static bool UpdateBantch(DataTable dt) { string pName = "dbo.UpdateStudent"; List<SqlParameter> pList = new List<SqlParameter>() { DbHelper.CreateSqlParemeterStructured("@Dt",dt) }; try { DbHelper.RunProcedure(pName, pList); return true; } catch { return false; } }
private void button1_Click(object sender, EventArgs e) { int rows = this.dataGridView1.Rows.Count; DataTable dt = new DataTable(); dt.Columns.Add("SID"); dt.Columns.Add("CID"); dt.Columns.Add("SName"); DataRow dr; for (int i = 0; i < rows;i++ ) { DataGridViewRow dtr=this.dataGridView1.Rows[i]; dr = dt.NewRow(); dr["SID"] = dtr.Cells[0].Value; dr["CID"] = dtr.Cells[1].Value; dr["SName"] = dtr.Cells[2].Value; dt.Rows.Add(dr); } if (Library.UpdateBantch(dt)) { MessageBox.Show("批量更改成功!"); } else { MessageBox.Show("批量更改失敗!"); } }