快速玩轉 SQL Server中帶 表類型參數 的存儲過程 —附源碼


摘要:

    最近做項目中遇到批量添加和修改的問題,在老大的指導下學會了使用表類型參數來做批量操作。為了鞏固強化,圍繞這個技術又做了個小demo。

 

開始正題:   

    首先,我們在SQL Server 2008下創建一個示例數據庫名為TableTypeTest,再在該數據庫下創建一個名為Class和Student的表,結構如下:

             

           

再在TableTypeTest數據庫下創建一個自定義表類型,取名StudentType,如下:

View Code
CREATE TYPE [dbo].[StudentType] AS TABLE(
    [SID] [int] NOT NULL,
    [CID] [int] NOT NULL,
    [SName] [nvarchar](50) NOT NULL
)
GO

 

然后,創建兩個存儲過程,批量添加和批量修改,分別為InserNewStudent和UpdateStudent,如下

InserNewStudent:

View Code
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:

View Code
CREATE PROCEDURE [dbo].[UpdateStudent] 
    @Dt dbo.StudentType readonly
AS
BEGIN
    Update dbo.Student set CID=t.CID,SName=t.SName from @Dt as t where dbo.Student.[SID]=t.[SID]
END
GO

 

啟動Visual Studio 2010,創建一個默認的窗體應用程序,窗體用於顯示所有班級列表,操作每個班級下的學生通過選中該班級,然后右鍵操作。如下:

創建顯示班級下的所有學生列表窗體,如下:

創建批量添加學生的窗體,如下:

關鍵代碼如下:

View Code
/// <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;
             }
         }
View Code
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;//此列雖然在添加的時候無用,但必須賦值,否則報錯
                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();
                }
            }
        }

 創建批量更改班級學生姓名的窗體,如下:

關鍵代碼如下:

View Code
/// <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;
             }
         }
View Code
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("批量更改失敗!");
            }
        }

 

源碼下載

PS:數據庫連接要在程序中的App.Config中配置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM