這篇文章主要講解了“C#怎么開發Winform程序調用存儲”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C#怎么開發Winform程序調用存儲”吧!
數據表及數據準備:
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','關羽','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')
由于在SQL SERVER內部調用存儲過程使用的方式是:
exec 存儲過程名 參數1,參數2,參數3...
所以我們可以在C#中調用exec的sql語句,讓此sql語句去調用存儲過程,嚴格來說,此種方式并不能稱之為C#調用存儲過程,本質上仍然是調用的sql語句。
示例:
需求:采用調用存儲過程的方式實現數據的顯示以及數據的新增。
SQL存儲過程代碼:
--查詢Member表所有數據的存儲(沒有參數) create proc procSelectMember as select * from Member go exec procSelectMember --添加會員信息(有輸入參數) 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'
數據顯示C#代碼:
private void BindData() { DBHelper.PrepareSql("exec procSelectMember"); this.dataGridView1.DataSource = DBHelper.ExecQuery(); } private void Form1_Load(object sender, EventArgs e) { BindData(); }
數據新增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(); }
調用存儲過程需要將CommandType執行命令類型設置為CommandType.StoredProcedure存儲過程。
需求:實現數據的顯示。
SQL存儲過程代碼:
--查詢Member表所有數據的存儲(沒有參數) create proc procSelectMember as select * from Member go --調用 exec procSelectMember
為了支持存儲過程,給DBHelper添加方法:
public static void PrepareProc(string sql) { OpenConn(); //打開數據庫連接 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(); }
需求:實現數據的新增。
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) go --調用 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(); }
需求:輸入用戶名,點擊"查詢電話"按鈕,在下面顯示姓名和號碼。
SQL存儲過程:
--根據賬號查詢姓名和電話(有輸入參數,有輸出參數) 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 --調用 declare @name nvarchar(20) declare @phone nvarchar(20) exec procGetInfoByAcc 'machao',@name output,@phone output select @name,@phone
為了支持輸出參數,給DBHelper添加方法:
/// <summary> /// 設置輸出參數(不指定長度,適合非字符串) /// </summary> /// <param name="parameterName">參數名稱</param> /// <param name="dbType">參數類型</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> /// 設置輸出參數(指定長度,適合字符串) /// </summary> /// <param name="parameterName">參數名稱</param> /// <param name="dbType">參數類型</param> /// <param name="size">參數長度</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> /// 獲取參數內容值 /// </summary> /// <param name="parameterName">參數名稱</param> /// <returns>參數值</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(); }
需求:密碼升級,傳入用戶名和密碼;如果用戶名密碼正確,并且密碼長度<8,自動升級成8位密碼。
SQL存儲過程(SQLSERVER中output參數直接傳入值即可以做輸入參數,也可以做輸出參數):
--密碼升級,傳入用戶名和密碼,如果用戶名密碼正確,并且密碼長度<8,自動升級成8位密碼 --有輸入輸出參數(密碼作為輸入參數也作為輸出參數) select FLOOR(RAND()*10) --0-9之間隨機數 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 --調用 declare @pwd nvarchar(20) = '123456' exec procPwdUpgrade 'liubei',@pwd output select @pwd
為了支持輸入輸出參數,給DBHelper添加方法:
/// <summary> /// 設置輸入輸出參數(不指定長度,適合非字符串) /// </summary> /// <param name="parameterName">參數名稱</param> /// <param name="dbType">參數類型</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> /// 設置輸入輸出參數(指定長度,適合字符串) /// </summary> /// <param name="parameterName">參數名稱</param> /// <param name="dbType">參數類型</param> /// <param name="size">參數長度</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(); }
SQLSERVER存儲過程返回值只能是整數。
需求:實現數據的新增,由SQLSERVER返回執行的狀態。
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 --調用 declare @return int exec @return = procInsertMember 'sunwukong','123456','孫悟空','13554854785' print @return
為了支持返回值,給DBHelper添加方法:
/// <summary> /// 設置返回值參數 /// </summary> /// <param name="parameterName">參數名稱</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); } }
感謝各位的閱讀,以上就是“C#怎么開發Winform程序調用存儲”的內容了,經過本文的學習后,相信大家對C#怎么開發Winform程序調用存儲這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。