C#開發(fā)Winform程序調(diào)用存儲過程
數(shù)據(jù)表及數(shù)據(jù)準備:
create table Member ( MemberId int primary key identity(1,1), MemberAccount nvarchar(20) unique, MemberPwd nvarchar(20), MemberName nvarchar(20), MemberPhone nvarchar(20) ) truncate table Member insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone) values('liubei','123456','劉備','4659874564') insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone) values('guanyu','123456','關(guān)羽','42354234124') insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone) values('zhangfei','123456','張飛','41253445') insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone) values('zhangyun','123456','趙云','75675676547') insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone) values('machao','123456','馬超','532523523')
本文以下內(nèi)容都借助于前面封裝的DBHelper類
一、調(diào)用exec語句執(zhí)行存儲過程
由于在SQL SERVER內(nèi)部調(diào)用存儲過程使用的方式是:
exec 存儲過程名 參數(shù)1,參數(shù)2,參數(shù)3...
所以我們可以在C#中調(diào)用exec的sql語句,讓此sql語句去調(diào)用存儲過程,嚴格來說,此種方式并不能稱之為C#調(diào)用存儲過程,本質(zhì)上仍然是調(diào)用的sql語句。
示例:
需求:采用調(diào)用存儲過程的方式實現(xiàn)數(shù)據(jù)的顯示以及數(shù)據(jù)的新增。
主要代碼:
SQL存儲過程代碼:
--查詢Member表所有數(shù)據(jù)的存儲(沒有參數(shù)) create proc procSelectMember as select * from Member go exec procSelectMember --添加會員信息(有輸入?yún)?shù)) create proc procInsertMember @acc nvarchar(20), @pwd nvarchar(20), @memName nvarchar(20), @memPhone nvarchar(20) as insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone) values(@acc,@pwd,@memName,@memPhone) go exec procInsertMember 'sunwukong','123456','孫悟空','13554856985'
數(shù)據(jù)顯示C#代碼:
private void BindData() { DBHelper.PrepareSql("exec procSelectMember"); this.dataGridView1.DataSource = DBHelper.ExecQuery(); } private void Form1_Load(object sender, EventArgs e) { BindData(); }
數(shù)據(jù)新增C#代碼:
private void btAdd_Click(object sender, EventArgs e) { DBHelper.PrepareSql(string.Format("exec procInsertMember '{0}','{1}','{2}','{3}'" ,this.txtAccount.Text,this.txtPwd.Text,this.txtNickName.Text,this.txtPhone.Text)); DBHelper.ExecNonQuery(); }
二、直接調(diào)用存儲過程
調(diào)用存儲過程需要將CommandType執(zhí)行命令類型設(shè)置為CommandType.StoredProcedure存儲過程。
(1)調(diào)用沒有參數(shù)的存儲過程
需求:實現(xiàn)數(shù)據(jù)的顯示。
主要代碼:
SQL存儲過程代碼:
--查詢Member表所有數(shù)據(jù)的存儲(沒有參數(shù)) create proc procSelectMember as select * from Member go --調(diào)用 exec procSelectMember
為了支持存儲過程,給DBHelper添加方法:
public static void PrepareProc(string sql) { OpenConn(); //打開數(shù)據(jù)庫連接 adp = new SqlDataAdapter(sql, conn); adp.SelectCommand.CommandType = CommandType.StoredProcedure; }
窗體代碼:
private void BindData() { DBHelper.PrepareProc("procSelectMember"); this.dataGridView1.DataSource = DBHelper.ExecQuery(); } private void Form1_Load(object sender, EventArgs e) { BindData(); }
(2)調(diào)用有輸入?yún)?shù)的存儲過程
需求:實現(xiàn)數(shù)據(jù)的新增。
主要代碼:
SQL存儲過程代碼:
--添加會員信息(有輸入?yún)?shù)) create proc procInsertMember @acc nvarchar(20), @pwd nvarchar(20), @memName nvarchar(20), @memPhone nvarchar(20) as insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone) values(@acc,@pwd,@memName,@memPhone) go --調(diào)用 exec procInsertMember 'sunwukong','123456','孫悟空','13554856985'
窗體代碼:
private void btAdd_Click(object sender, EventArgs e) { DBHelper.PrepareProc("procInsertMember"); DBHelper.SetParameter("acc", this.txtAccount.Text); DBHelper.SetParameter("pwd",this.txtPwd.Text); DBHelper.SetParameter("memName", this.txtNickName.Text); DBHelper.SetParameter("memPhone", this.txtPhone.Text); DBHelper.ExecNonQuery(); }
(3)調(diào)用有輸入和輸出參數(shù)的存儲過程
需求:輸入用戶名,點擊"查詢電話"按鈕,在下面顯示姓名和號碼。
主要代碼:
SQL存儲過程:
--根據(jù)賬號查詢姓名和電話(有輸入?yún)?shù),有輸出參數(shù)) create proc procGetInfoByAcc @acc nvarchar(20), @memName nvarchar(20) output, @phone nvarchar(20) output as select @memName = (select MemberName from Member where MemberAccount=@acc) select @phone = (select MemberPhone from Member where MemberAccount=@acc) go --調(diào)用 declare @name nvarchar(20) declare @phone nvarchar(20) exec procGetInfoByAcc 'machao',@name output,@phone output select @name,@phone
為了支持輸出參數(shù),給DBHelper添加方法:
/// <summary> /// 設(shè)置輸出參數(shù)(不指定長度,適合非字符串) /// </summary> /// <param name="parameterName">參數(shù)名稱</param> /// <param name="dbType">參數(shù)類型</param> public static void SetOutParameter(string parameterName, SqlDbType dbType) { parameterName = "@" + parameterName.Trim(); SqlParameter parameter = new SqlParameter(parameterName, dbType); parameter.Direction = ParameterDirection.Output; adp.SelectCommand.Parameters.Add(parameter); } /// <summary> /// 設(shè)置輸出參數(shù)(指定長度,適合字符串) /// </summary> /// <param name="parameterName">參數(shù)名稱</param> /// <param name="dbType">參數(shù)類型</param> /// <param name="size">參數(shù)長度</param> public static void SetOutParameter(string parameterName, SqlDbType dbType, int size) { parameterName = "@" + parameterName.Trim(); SqlParameter parameter = new SqlParameter(parameterName, dbType, size); parameter.Direction = ParameterDirection.Output; adp.SelectCommand.Parameters.Add(parameter); } /// <summary> /// 獲取參數(shù)內(nèi)容值 /// </summary> /// <param name="parameterName">參數(shù)名稱</param> /// <returns>參數(shù)值</returns> public static object GetParameter(string parameterName) { parameterName = "@" + parameterName.Trim(); return adp.SelectCommand.Parameters[parameterName].Value; }
窗體代碼:
private void btSearch_Click(object sender, EventArgs e) { DBHelper.PrepareProc("procGetInfoByAcc"); DBHelper.SetParameter("acc", this.txtAccount.Text); DBHelper.SetOutParameter("memName", SqlDbType.NVarChar, 20); DBHelper.SetOutParameter("phone", SqlDbType.NVarChar, 20); DBHelper.ExecNonQuery(); this.lblName.Text = "姓名:" + DBHelper.GetParameter("memName").ToString(); this.lblPhone.Text = "電話:" + DBHelper.GetParameter("phone").ToString(); }
(4)調(diào)用有輸入輸出參數(shù)的存儲過程
需求:密碼升級,傳入用戶名和密碼;如果用戶名密碼正確,并且密碼長度<8,自動升級成8位密碼。
主要代碼:
SQL存儲過程(SQLSERVER中output參數(shù)直接傳入值即可以做輸入?yún)?shù),也可以做輸出參數(shù)):
--密碼升級,傳入用戶名和密碼,如果用戶名密碼正確,并且密碼長度<8,自動升級成8位密碼 --有輸入輸出參數(shù)(密碼作為輸入?yún)?shù)也作為輸出參數(shù)) select FLOOR(RAND()*10) --0-9之間隨機數(shù) create proc procPwdUpgrade @acc nvarchar(20), @pwd nvarchar(20) output as if not exists(select * from Member where MemberAccount=@acc and MemberPwd=@pwd) set @pwd = '' else begin if len(@pwd) < 8 begin declare @len int = 8- len(@pwd) declare @i int = 1 while @i <= @len begin set @pwd = @pwd + cast(FLOOR(RAND()*10) as varchar(1)) set @i = @i+1 end update Member set MemberPwd = @pwd where MemberAccount=@acc end end go --調(diào)用 declare @pwd nvarchar(20) = '123456' exec procPwdUpgrade 'liubei',@pwd output select @pwd
為了支持輸入輸出參數(shù),給DBHelper添加方法:
/// <summary> /// 設(shè)置輸入輸出參數(shù)(不指定長度,適合非字符串) /// </summary> /// <param name="parameterName">參數(shù)名稱</param> /// <param name="dbType">參數(shù)類型</param> public static void SetInOutParameter(string parameterName, SqlDbType dbType, object parameterValue) { parameterName = "@" + parameterName.Trim(); SqlParameter parameter = new SqlParameter(parameterName, dbType); parameter.Value = parameterValue; parameter.Direction = ParameterDirection.InputOutput; adp.SelectCommand.Parameters.Add(parameter); } /// <summary> /// 設(shè)置輸入輸出參數(shù)(指定長度,適合字符串) /// </summary> /// <param name="parameterName">參數(shù)名稱</param> /// <param name="dbType">參數(shù)類型</param> /// <param name="size">參數(shù)長度</param> public static void SetInOutParameter(string parameterName, SqlDbType dbType, int size, object parameterValue) { parameterName = "@" + parameterName.Trim(); SqlParameter parameter = new SqlParameter(parameterName, dbType, size); parameter.Value = parameterValue; parameter.Direction = ParameterDirection.InputOutput; adp.SelectCommand.Parameters.Add(parameter); }
窗體代碼:
//密碼升級,傳入用戶名和密碼, //如果用戶名密碼正確,并且密碼長度<8,自動升級成8位密碼 private void btUpgrade_Click(object sender, EventArgs e) { DBHelper.PrepareProc("procPwdUpgrade"); DBHelper.SetParameter("acc", this.txtAccount.Text); DBHelper.SetInOutParameter("pwd", SqlDbType.NVarChar, 20, this.txtPwd.Text); DBHelper.ExecNonQuery(); this.lblNewPwd.Text = DBHelper.GetParameter("pwd").ToString(); }
(5)調(diào)用有返回值的存儲過程
SQLSERVER存儲過程返回值只能是整數(shù)。
需求:實現(xiàn)數(shù)據(jù)的新增,由SQLSERVER返回執(zhí)行的狀態(tài)。
主要代碼:
SQL存儲過程代碼:
--添加會員信息(有返回值) create proc procInsertMember @acc nvarchar(20), @pwd nvarchar(20), @memName nvarchar(20), @memPhone nvarchar(20) as insert into Member(MemberAccount,MemberPwd,MemberName,MemberPhone) values(@acc,@pwd,@memName,@memPhone) declare @myErr int = @@error if @myErr = 0 return 1 else if @myErr = 2627 --唯一約束 return -1 else return -100 go --調(diào)用 declare @return int exec @return = procInsertMember 'sunwukong','123456','孫悟空','13554854785' print @return
為了支持返回值,給DBHelper添加方法:
/// <summary> /// 設(shè)置返回值參數(shù) /// </summary> /// <param name="parameterName">參數(shù)名稱</param> public static void SetReturnParameter(string parameterName) { parameterName = "@" + parameterName.Trim(); SqlParameter parameter = new SqlParameter(); parameter.ParameterName = parameterName; parameter.Direction = ParameterDirection.ReturnValue; adp.SelectCommand.Parameters.Add(parameter); }
窗體代碼:
private void btAdd_Click(object sender, EventArgs e) { try { DBHelper.PrepareProc("procInsertMember"); DBHelper.SetParameter("acc", this.txtAccount.Text); DBHelper.SetParameter("pwd", this.txtPwd.Text); DBHelper.SetParameter("memName", this.txtNickName.Text); DBHelper.SetParameter("memPhone", this.txtPhone.Text); DBHelper.SetReturnParameter("returnValue"); DBHelper.ExecNonQuery(); int result = (int)DBHelper.GetParameter("returnValue"); if (result == 1) MessageBox.Show("添加成功!"); } catch (Exception ex) { int result = (int)DBHelper.GetParameter("returnValue"); if (result == -1) MessageBox.Show("用戶名重名了,違反了唯一約束!"); if (result == -100) MessageBox.Show(ex.Message); } }
到此這篇關(guān)于C#開發(fā)Winform程序調(diào)用存儲過程的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
winform導(dǎo)出dataviewgrid數(shù)據(jù)為excel的方法
這篇文章主要介紹了winform導(dǎo)出dataviewgrid數(shù)據(jù)為excel的方法,可實現(xiàn)將dataViewGrid視圖中的數(shù)據(jù)導(dǎo)出為excel格式的功能,非常具有實用價值,需要的朋友可以參考下2015-01-01C#多態(tài)的三種實現(xiàn)方式(小結(jié))
這篇文章主要介紹了C#多態(tài)的三種實現(xiàn)方式(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03