例如在向資料庫添加新資料時,需要檢測是否有重複
本例介紹如何把這個檢測的過程放在存儲過程中,并用程式調用檢測的結果做出反應。
存儲過程如下
CREATE PROCEDURE DInstitute_Insert
@InstituteNO nvarchar(6),@InstituteName nvarchar(40)
AS
declare @return int,@count int
if(ltrim(rtrim(@InstituteName))='' or ltrim(rtrim(@InstituteNO))='')
select @return=3--傳回3表示送出的資料有空值
else
begin
select @count=count(1) from DInstitute where InstituteNO=@InstituteNO
if(@count>0)
select @return=1--傳回1表示編号有重複
else
begin
insert into DInstitute (InstituteNO,InstituteName) values (@InstituteNO,@InstituteName)
if(@@error>0)
select @return=2--傳回2表示資料操作錯誤
else
select @return=0--傳回0表示資料操作成功
end
end
return @return
GO
其中DInstitute 是一個學院資訊表。隻有InstituteNO(學院編号)、InstituteName(學院名稱)兩個字段。
在C#中調用本存儲過程的代碼如下:
//執行插入操作
SqlCommand com1 = new SqlCommand("DInstitute_Insert", DBcon);
if (com1.Connection.State == ConnectionState.Closed)
com1.Connection.Open();
com1.CommandType = CommandType.StoredProcedure;
com1.Parameters.Add(new SqlParameter("@InstituteNO",SqlDbType.NVarChar,6));
com1.Parameters.Add(new SqlParameter("@InstituteName", SqlDbType.NVarChar, 40));
com1.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));
com1.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
com1.Parameters["@InstituteNO"].Value = t_NO.Text;
com1.Parameters["@InstituteName"].Value = t_name.Text;
try
{
com1.ExecuteScalar();
}
catch(SqlException ee)
DB.msgbox("操作失敗!"+ee.Message.ToString());
return;
finally
com1.Connection.Close();
string temp = com1.Parameters["@return"].Value.ToString();
//傳回0表示資料操作成功
//傳回1表示編号有重複
//傳回2表示資料操作錯誤
//傳回3表示送出的資料有空值
switch (temp)
case "0":
DB.msgbox("添加成功!");
break;
case "1":
DB.msgbox("編号有重複!");
case "2":
DB.msgbox("資料操作錯誤!");
case "3":
DB.msgbox("送出的資料有空值!");
Binding(); //重新整理datagrid
---------------------------------------------- 補充其它方法。
System.Data.SqlClient.SqlConnection scon = new System.Data.SqlClient.SqlConnection("server=Netangel;uid=etopsUS;pwd=etops;database=etops");
System.Data.SqlClient.SqlCommand scom = new System.Data.SqlClient.SqlCommand("",scon);
scon.Open();
scom.CommandText="p_CorpClassAdd";
scom.CommandType = System.Data.CommandType.StoredProcedure;
scom.Parameters.Add(
new SqlParameter("ReturnValue", SqlDbType.Int, 4,
ParameterDirection.ReturnValue, false, 0, 0,
string.Empty, DataRowVersion.Default, null)) //增加存儲過程的傳回值參數
scom.ExecuteNonQuery();
Response.Write(scom.Parameters["ReturnValue"].Value.ToString()); //輸出存儲過程
cmd = New SqlCommand("sp_del_office_byID", conn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@OfficeID", SqlDbType.Int)
cmd.Parameters("@OfficeID").Value = officeid_pk
cmd.Parameters.Add("s", SqlDbType.Int)
cmd.Parameters("s").Direction = ParameterDirection.ReturnValue
cmd.ExecuteNonQuery()
s = cmd.Parameters("s").Value
通用的,輸入輸出參數各1個,調用時隻要傳入參數和存儲過程名即可傳回結果
//程式部分
public bool Execute(string Procname,SqlParameter []parameter,out string procout)
{
SqlConnection Sqlcon=new SqlConnection(Configuration.ConnectionString);
SqlCommand Sqlcom=new SqlCommand();
Sqlcon.Open();
Sqlcom.Connection=Sqlcon;
Sqlcom.CommandText=Procname;
Sqlcom.CommandType=CommandType.StoredProcedure;
Sqlcom.Parameters.Add(new SqlParameter("@m_return",SqlDbType.Int));
for(int i=0;i<parameter.Length;i++)
Sqlcom.Parameters.Add(parameter[i]);
Sqlcom.Parameters["@m_return"].Direction=ParameterDirection.ReturnValue;
Sqlcom.ExecuteNonQuery();
procout=Sqlcom.Parameters["@m_return"].Value.ToString();
return true;
private void button2_Click(object sender, System.EventArgs e)
SqlParameter[] parameter={new SqlParameter("@ID",SqlDbType.Int)};
parameter[0].Value=1;
string UC;
bool retVal=Execute("管理者_CheckExist",parameter,out UC);
button2.Text=UC.ToString();
}
//存儲過程部分
ALTER PROCEDURE dbo.管理者_CheckExist
@ID int
AS
declare @matchCount int
select @matchCount = count(*) from 管理者 where ID=@ID
return @matchCount