天天看點

.net 接收存儲過程的傳回值 。。。。

例如在向資料庫添加新資料時,需要檢測是否有重複

本例介紹如何把這個檢測的過程放在存儲過程中,并用程式調用檢測的結果做出反應。

存儲過程如下

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