SqlServer預存程序之簡單入門

來源:互聯網
上載者:User

一、簡單一實例

1.首先來一個最簡單的預存程序吧
CREATE PROCEDURE dbo.testProcedure_AX
AS
select userID from USERS order by userid desc
注:dbo.testProcedure_AX是你建立的預存程序名,可以改為:AXzhz等,別跟關鍵字衝突就行了,AS下面就是一條SQL語句.

2.如何在ASP.NET中調用這個預存程序?
        public static string GetCustomerCName(ref ArrayList arrayCName,ref ArrayList arrayID)
        {
            SqlConnection con=ADConnection.createConnection();
            SqlCommand cmd=new SqlCommand("testProcedure_AX",con);
            cmd.CommandType=CommandType.StoredProcedure;
            con.Open();
            try
            {
                SqlDataReader dr=cmd.ExecuteReader();
                while(dr.Read())
                {
                    if(dr[0].ToString()=="")
                    {
                        arrayCName.Add(dr[1].ToString());
                    }
                }
                con.Close();
                return "OK!";
            }
            catch(Exception ex)
            {
                con.Close();
                return ex.ToString();
            }
        }
注:其實就是把以前
SqlCommand cmd=new SqlCommand("select userID from USERS order by userid desc",con);
中的SQL語句替換為預存程序名,再把cmd的類型標註為CommandType.StoredProcedure(預存程序)

3.再來個帶參數的預存程序吧.
CREATE PROCEDURE dbo.AXzhz
/*
這裡寫注釋
*/
@startDate varchar(16),
@endDate varchar(16)
AS
 select id  from table_AX where commentDateTime>@startDate and commentDateTime<@endDate order by contentownerid DESC

注:@startDate varchar(16)是聲明@startDate 這個變數,多個變數名間用【,】隔開.後面的SQL就可以使用這個變數了.

4.如何在ASP.NET中調用這個帶參數的預存程序?
 public static string GetCustomerCNameCount(string startDate,string endDate,ref DataSet ds)
{
            SqlConnection con=ADConnection.createConnection();
//-----------------------注意這一段--------------------------------------------------------------------------
            SqlDataAdapter da=new SqlDataAdapter("AXzhz",con);

            para0=new SqlParameter("@startDate",startDate);
            para1=new SqlParameter("@endDate",endDate);
            da.SelectCommand.Parameters.Add(para0);
            da.SelectCommand.Parameters.Add(para1);
            da.SelectCommand.CommandType=CommandType.StoredProcedure;
//-----------------------------------------------------------------------------------------------------------
            try
            {
                con.Open();
                da.Fill(ds);
                con.Close();
                return "OK";
            }
            catch(Exception ex)
            {
                return ex.ToString();
            }           
        }

注:把命令的參數添加進去,就OK了.

5.如何查看SQL命令執行成功了沒有.
CREATE PROCEDURE dbo.AXzhz
/*
  @parameter1 使用者名稱
  @parameter2 新密碼
*/
@password nvarchar(20),
@userName nvarchar(20)
AS
declare @err0 int
update WL_user set password=@password where UserName=@userName
set @err0=@@error
select  @err0 as err0

注:先聲明一個整型變數@err0,再給其賦值為@@error(這個是系統自動給出的語句是否執行成功,0為成功,其它為失敗),最後通過select把它選擇出來.

6.如何從後台獲得這個執行成功與否的值?
下面這段代碼可以告訴你答案:
    public static string GetCustomerCName()
        {
            SqlConnection con=ADConnection.createConnection();            
            SqlCommand cmd=new SqlCommand("AXzhz",con);
            cmd.CommandType=CommandType.StoredProcedure;
            para0=new SqlParameter("@startDate","2006-9-10");
            para1=new SqlParameter("@endDate","2006-9-20");
            da.SelectCommand.Parameters.Add(para0);
            da.SelectCommand.Parameters.Add(para1);
            con.Open();
            try
            {
               Int32 re=(int32)cmd.ExecuteScalar();
                con.Close();
                if (re==0)
                 return "OK!";
                else
                 return "false";
            }
            catch(Exception ex)
            {
                con.Close();
                return ex.ToString();
            }
        }

7.如何根據傳入的參數判斷執行哪條SQL語句?
ALTER PROCEDURE dbo.selectCustomerCNameCount
@customerID int
AS
if @customerID=-1
 begin
 select contentownerid ,userCName,count(*) as countAll from view_usercomment group by contentownerid,userCName order by contentownerid DESC
 end
else
 begin
 select contentownerid ,userCName,count(*) as countAll from view_usercomment where contentownerid=@customerID group by contentownerid,userCName order by contentownerid DESC
 end

二、C#中使用帶傳回值的預存程序

例如在向資料庫添加新資料時,需要檢測是否有重複
本例介紹如何把這個檢測的過程放在預存程序中,並用程式調用檢測的結果做出反應。
預存程序如下:
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("編號有重複!");
                    break;
                case "2":
                    DB.msgbox("資料操作錯誤!");
                    break;
                case "3":
                    DB.msgbox("提交的資料有空值!");
                    break;
            }
            Binding(); //重新整理datagrid

三、SqlServer預存程序的交易處理

方法一:
--測試的表  
  create   table   tb(  id   int     not   null     constraint   PK_sys_zj_fielddict   primary   key   ,aa   int)   
  --交易處理  
  begin   tran  
  insert   into   tb   values(1,1)  
  if   @@error<>0   goto   lb_rollback  
  insert   into   tb   values(1,1)  
  if   @@error<>0   goto   lb_rollback  
  insert   into   tb   values(2,1)  
  if   @@error<>0   goto   lb_rollback  
  insert   into   tb   values(2,1)  
  if   @@error<>0   goto   lb_rollback  
  insert   into   tb   values(3,1)  
  if   @@error<>0   goto   lb_rollback  
  lb_commit:  
  commit   tran  
  goto   lb_ok  
  lb_rollback:  
  rollback   tran       
  --顯示結果  
  lb_ok:  
  select   *   from   tb  
  drop   table   tb

方法二:
--建立測試表  
  create   table   tb(id   int     not   null     constraint   PK_sys_zj_fielddict   primary   key  ,aa   int)       
  --設定選項  
  SET   XACT_ABORT   on       
  --交易處理  
  begin   tran  
  insert   into   tb   values(1,1)  
  insert   into   tb   values(1,1)  
  insert   into   tb   values(2,1)  
  commit   tran       
  --顯示結果  
  /*--------注意  
          如果這樣寫的話,後面的語句不會被執行,如果要執行後面的語句,要在這句後面加上GO,僅查詢分析分析器支援,所以如果是在預存程序中,要保證commit   tran後面沒有其他語句,否則出錯時,其他語句不會被執行  
  -----------*/  
  select   *   from   tb  
  drop   table   tb  

四、.Net中使用交易處理

SqlConnection myConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;");
myConnection.Open();

SqlTransaction myTrans = myConnection.BeginTransaction(); //使用New新產生一個事務
SqlCommand myCommand = new SqlCommand();
myCommand.Transaction = myTrans;

try
{
myCommand.CommandText = "Update Address set location='23 rain street' where userid='0001'";
myCommand.ExecuteNonQuery();

myCommand.CommandText = "Update table2 set dd='23 rain street' where userid='0001'";
myCommand.ExecuteNonQuery();

myTrans.Commit();
Console.WriteLine("Record is udated.");
}
catch(Exception e)
{
myTrans.Rollback();
Console.WriteLine(e.ToString());
Console.WriteLine("Sorry, Record can not be updated.");
}
finally
{
myConnection.Close();
}

說明:在SqlServer中,每條Sql語句都作為一個事務來執行,所以無論在預存程序,還是在.net代碼中使用,執行單條Sql語句沒有必要使用交易處理。

資訊來源:http://www.cnblogs.com/tuyile006/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.