欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#開發(fā)Winform程序調(diào)用存儲過程

 更新時間:2022年05月04日 11:06:46   作者:農(nóng)碼一生  
這篇文章介紹了C#開發(fā)Winform程序調(diào)用存儲過程的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

數(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)文章

  • C#操作XML方法詳解

    C#操作XML方法詳解

    對于XML讀寫操作,項目中經(jīng)常要用到,之前木有好好總結(jié)過,例如LINQ TO XML也用過,這篇文章主要介紹了C#操作XML的方法
    2021-11-11
  • vs代碼段快捷鍵設(shè)置(圖文)

    vs代碼段快捷鍵設(shè)置(圖文)

    學(xué)習(xí)代碼快捷鍵是程序員必學(xué)知識點,會使用代碼快捷在程序開發(fā)過程中會提高開發(fā)效率,下面小編給大家整理些有關(guān)vs代碼段快捷鍵設(shè)置的技巧,需要的朋友可以參考下
    2015-08-08
  • C# 大小寫轉(zhuǎn)換(金額)實例代碼

    C# 大小寫轉(zhuǎn)換(金額)實例代碼

    C# 大小寫轉(zhuǎn)換(金額)實例代碼,需要的朋友可以參考一下
    2013-03-03
  • C# 字符串處理小工具

    C# 字符串處理小工具

    本文主要介紹C#字符串處理小工具,實現(xiàn)功能包括:轉(zhuǎn)換為大寫;轉(zhuǎn)換為小寫;反轉(zhuǎn)字符串;匹配某字符串出現(xiàn)次數(shù);正則匹配;base64加密;base64解密;ROT13加密解密;MD5 32位加密。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • C#約瑟夫問題解決方法

    C#約瑟夫問題解決方法

    這篇文章主要介紹了C#約瑟夫問題解決方法,較為詳細的分析了約瑟夫問題及C#解決技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#中#define后面只加一個參數(shù)的解釋

    C#中#define后面只加一個參數(shù)的解釋

    今天小編就為大家分享一篇關(guān)于C#中#define后面只加一個參數(shù)的解釋,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • winform導(dǎo)出dataviewgrid數(shù)據(jù)為excel的方法

    winform導(dǎo)出dataviewgrid數(shù)據(jù)為excel的方法

    這篇文章主要介紹了winform導(dǎo)出dataviewgrid數(shù)據(jù)為excel的方法,可實現(xiàn)將dataViewGrid視圖中的數(shù)據(jù)導(dǎo)出為excel格式的功能,非常具有實用價值,需要的朋友可以參考下
    2015-01-01
  • 如何用WindowsForm給窗口添加一些簡單的動畫效果

    如何用WindowsForm給窗口添加一些簡單的動畫效果

    這篇文章主要介紹了如何用WindowsForm給窗口添加一些簡單的動畫效果,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#多態(tài)的三種實現(xiàn)方式(小結(jié))

    C#多態(tài)的三種實現(xiàn)方式(小結(jié))

    這篇文章主要介紹了C#多態(tài)的三種實現(xiàn)方式(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C#加密解密類實例程序

    C#加密解密類實例程序

    這篇文章主要介紹了C#加密解密類實例程序,大家參考使用吧
    2013-12-12

最新評論