欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何實現(xiàn)SQLServer存儲過程在C#中調(diào)用

這篇文章主要為大家展示了如何實現(xiàn)SQL Server存儲過程在C#中調(diào)用,內(nèi)容簡而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

成都創(chuàng)新互聯(lián)公司主營宜昌網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,手機APP定制開發(fā),宜昌h5重慶小程序開發(fā)搭建,宜昌網(wǎng)站營銷推廣歡迎宜昌等地區(qū)企業(yè)咨詢

0. 簡介

【定義】:存儲過程(Stored Procedure) 是在大型數(shù)據(jù)庫系統(tǒng)中,一組為了完成特定功能的SQL 語句集,它存儲在數(shù)據(jù)庫中,一次編譯后永久有效,用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。

【優(yōu)缺點】:存儲過程優(yōu)缺點都非常的明顯!幾乎每一篇討論存儲過程的文字,都是會說其他優(yōu)點是balabala,缺點是balabala,然而最后作者的結(jié)論都是:“我不推薦使用存儲過程”。
具體的存儲過程的優(yōu)缺點這里就不詳述了!

公司舊項目使用存儲過程實現(xiàn)業(yè)務(wù)邏輯,沒辦法只能研究了一下 🙃!

閑言碎語不要講,書歸正傳,下面就開始存儲過程!

1. 語法細節(jié)

變量與變量之間使用逗號隔開,語句結(jié)尾無標(biāo)點符號

聲明變量:declare @variate_name variate_type,例如聲明并賦值:declare @name nvarchar(50) ='shanzm'

變量賦值:set @variate_name =value

打印變量:print @variate_name

begin……end 之間的SQL語句稱之為一個代碼塊

可以使用if……else實現(xiàn)邏輯判斷

創(chuàng)建存儲過程:create procedure pro_name

執(zhí)行存儲過程:execute pro_name

輸出參數(shù):存儲過程返回的是SQL語句查閱結(jié)果,在定義參數(shù)后,添加output,設(shè)置為一個輸出參數(shù)(和C#中輸出參數(shù)類似),相當(dāng)于多了一個返回值!

創(chuàng)建存儲過程的基本形式:

create procedure pro_name_tableName
@param1 param1_type,
@param2 param2_type,
as
begin 
  --sql語句
end
go

2. 示例1:模擬轉(zhuǎn)賬

①示例背景:使用存儲過程,模擬在一張存款表中實現(xiàn)用戶與用戶之間的轉(zhuǎn)賬

②準(zhǔn)備工作1:在數(shù)據(jù)庫中創(chuàng)建表szmBank

CREATE TABLE [dbo].[szmBank](
 [Id] [bigint] IDENTITY(1,1) NOT NULL,
 [Balance] [decimal](18, 0) NOT NULL

添加一些測試數(shù)據(jù):

Id                   Balance
---------------      ----------------
1                    1000
2                    2000
3                    3000

③準(zhǔn)備工作2:封裝C#代碼中的SQL輔助類SqlHelper

注意封裝的時候要有一個CommandType參數(shù),決定是執(zhí)行SQL語句還是存儲過程,
CommandType是一個枚舉類型,其中Text值為執(zhí)行SQL語句,StoreProcedure為執(zhí)行存儲過程
具體封裝細節(jié)這里就不詳述了。

找到了2年前我封裝的一個SqlHelper.cs,常規(guī)使用沒有任何問題,僅供參考:

#region
// ===============================================================================
// Project Name    :  
// Project Description : 
// ===============================================================================
// Class Name     :  SqlHelper
// Class Version    :  v1.0.0.0
// Class Description  :  SQL語句輔助類
// CLR         :  4.0.30319.18408 
// Author       :  shanzm
// Create Time     :  2018-8-14 18:22:59
// Update Time     :  2018-8-14 18:22:59
// ===============================================================================
// Copyright © SHANZM-PC 2018 . All rights reserved.
// ===============================================================================
#endregion

using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace _16StoreProcedure
{
  public class SqlHelper
  {
    private static readonly string connStr =
      ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;

    /// <summary>
    /// 返回查詢結(jié)果的的表
    /// </summary>
    /// <param name="sql">SQL語句或存儲過程</param>
    /// <param name="type">執(zhí)行類型</param>
    /// <param name="param">參數(shù)</param>
    /// <returns></returns>
    public static DataTable GetDataTable(string sql, CommandType type, params SqlParameter[] param)
    {
      using (SqlConnection conn = new SqlConnection(connStr))
      {
        using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conn))
        {
          if (param != null)
          {
            adapter.SelectCommand.Parameters.AddRange(param);
          }

          adapter.SelectCommand.CommandType = type;
          DataTable da = new DataTable();
          adapter.Fill(da);
          return da;
        }
      }
    }


    /// <summary>
    /// 返回影響行數(shù)
    /// </summary>
    /// <param name="sql">SQL語句或存儲過程</param>
    /// <param name="type">執(zhí)行類型</param>
    /// <param name="param">參數(shù)</param>
    /// <returns></returns>
    public static int ExecuteNonquery(string sql, CommandType type, params SqlParameter[] param)
    {
      using (SqlConnection conn = new SqlConnection(connStr))
      {
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
          if (param != null)
          {
            cmd.Parameters.AddRange(param);
          }
          cmd.CommandType = type;
          conn.Open();
          return cmd.ExecuteNonQuery();

        }
      }

    }

    /// <summary>
    /// 返回查詢結(jié)果的第一行第一個單元格的數(shù)據(jù)
    /// </summary>
    /// <param name="sql">SQL語句或存儲過程</param>
    /// <param name="type">執(zhí)行類型</param>
    /// <param name="param">參數(shù)</param>
    /// <returns></returns>
    public static object ExecuteScalar(string sql, CommandType type, params SqlParameter[] param)
    {
      using (SqlConnection conn=new SqlConnection (connStr ))
      {
        using (SqlCommand cmd=new SqlCommand (sql,conn))
        {
          if (param !=null )
          {
            cmd.Parameters.AddRange(param);
          }
          cmd.CommandType = type ;
          conn.Open();
          return cmd.ExecuteScalar();
        }
      }
    }

  }
}

④編寫存儲過程:

在數(shù)據(jù)庫中:指定數(shù)據(jù)庫-->可編程性-->存儲過程-->右鍵:新建-->存儲過程:

SQL Server中編寫的SQL語句沒有默認的格式化,所有代碼排版按照我自己習(xí)慣進行Tab縮進

建議放到編輯器中查看下面的存儲過程,會好看一些!

SQL大小寫不敏感,我習(xí)慣小寫,方便閱讀!

-- =============================================
-- Author: shanzm
-- Create date: 2020年5月2日 19:56:51
-- Description: 模擬賬戶之間轉(zhuǎn)賬
-- =============================================
create procedure pro_transfer_szmbank
@from bigint,
@to bigint,
@balance decimal(18,0),
@returnNum int output--(1表示轉(zhuǎn)賬成功,2表示失敗,3表示余額不足)
as
begin
 --判斷轉(zhuǎn)出賬戶是否有足夠的金額
 declare @money decimal(18,0)
 select @money=Balance from dbo.szmBank where Id=@from; 
 if @money-@balance>=0.1 
   --開始轉(zhuǎn)賬
  begin 
  begin transaction
   declare @sum int =0
   --轉(zhuǎn)出賬戶扣錢
   update szmBank set balance=balance-@balance where id=@from
   set @sum=@sum+@@error
   --轉(zhuǎn)入賬戶加錢
   update szmBank set balance=balance+@balance where id=@to
   set @sum=@sum+@@error
   --判斷是否成功
   if @sum<>0
   begin
    set @returnNum=2--轉(zhuǎn)賬失敗
    rollback
   end
   else
   begin
    set @returnNum=1--轉(zhuǎn)賬成功
    commit
   end
  end
 else
 begin
  set @returnNum=3--余額不足
 end
end
go

在數(shù)據(jù)庫中執(zhí)行測試(F5):

--執(zhí)行測試:
declare @ret int
execute pro_transfer_szmbank 
@from='1',
@to='2',
@balance='10',
@returnNum=@ret output--注意輸出參數(shù)在執(zhí)行語句中也是要表明"output"
print @ret --結(jié)果是打印:1,即存儲過程實現(xiàn)成功

【注意】:

  • 我們需要查看某個存儲過程,則可以使用數(shù)據(jù)中自帶的存儲過程查看:
  • sp_helptext pro_transfer_szmBank
  • 修改現(xiàn)有的存儲過程,右鍵存儲過程-->修改:顯示的存儲過程只是把創(chuàng)建存儲過程中的create變?yōu)榱薬lert
  • 可以在SQL Server的SQL窗口選中某些SQL語句,點擊執(zhí)行,即執(zhí)行選中的SQL語句

⑤控制臺中測試

新建一個控制臺項目,在配置文件中添加連接字符串

因為封裝的SqlHelper中需要從配置文件中讀取數(shù)據(jù)庫連接字符串,所以添加引用:System.Configuration

static void Main(string[] args)
{
  //轉(zhuǎn)出賬戶的Id
  int from = 1;
  //轉(zhuǎn)入賬戶的Id
  int to = 2;
  //轉(zhuǎn)賬金額
  decimal balance = 10;

  SqlParameter[] param =
  {
    new SqlParameter ("@from",from),
    new SqlParameter("@to",to),
    new SqlParameter ("@balance",balance),
    //-------------------------------注意:這里設(shè)置為輸出參數(shù)
    new SqlParameter ("@returnNum",System.Data.SqlDbType.Int{Direction=System.Data.ParameterDirection.Output }
  };

  //------------------------設(shè)置CommonType為StorProcedure類型
  SqlHelper.ExecuteNonquery("pro_transfer_szmbank",System.Data.CommandType.StoredProcedure, param);

  //------------------------獲取輸出參數(shù)
  //根據(jù)輸出參數(shù)判斷轉(zhuǎn)賬結(jié)果
  int outPutparam = Convert.ToInt16(param[3].Value);

  switch (outPutparam)
  {
    case 1: Console.WriteLine($"success:從Id:{from}轉(zhuǎn)賬{balance}元到Id:{to}");break;
    case 2: Console.WriteLine("error"); break;
    case 3: Console.WriteLine("余額不足"); break;
  }

  Console.ReadKey();
}

測試結(jié)果:

success:從Id:1轉(zhuǎn)賬10元到Id:2

3. 示例2:測試返回DataTable

①存儲過程:

create procedure [dbo].[pro_ReturnDataTable]
as
begin
 select Id as 用戶ID ,Balance as 余額 from szmBank;
end
go

②數(shù)據(jù)庫中測試:

execute pro_ReturnDataTable

測試結(jié)果:即顯示szmBank中的所有數(shù)據(jù)

③控制臺中測試:

static void Main(string[] args)
{
  DataTable dt = SqlHelper.GetDataTable("pro_ReturnDataTable", CommandType.StoredProcedure);
  foreach (DataRow row in dt.Rows)
  {
    Console.WriteLine(row["用戶ID"].ToString() + ":" + row["余額"].ToString());
  }
  Console.ReadKey();
  //TransferAccounts();
  ReturnDataTable();
} 

測試結(jié)果:即打印szmBank中的所有數(shù)據(jù)

以上就是關(guān)于如何實現(xiàn)SQL Server存儲過程在C#中調(diào)用的內(nèi)容,如果你們有學(xué)習(xí)到知識或者技能,可以把它分享出去讓更多的人看到。

網(wǎng)站名稱:如何實現(xiàn)SQLServer存儲過程在C#中調(diào)用
URL標(biāo)題:http://chinadenli.net/article42/ppcshc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站收錄域名注冊、關(guān)鍵詞優(yōu)化、營銷型網(wǎng)站建設(shè)微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
精品综合欧美一区二区三区| 99久久精品一区二区国产| 亚洲性日韩精品一区二区| 亚洲少妇人妻一区二区| 日韩成人h视频在线观看| 一区二区三区日韩在线| 在线播放欧美精品一区| 成人午夜视频精品一区| 日韩色婷婷综合在线观看| 欧美成人免费夜夜黄啪啪| 欧美日韩精品视频在线| 暴力性生活在线免费视频| 美女被后入福利在线观看| 中国日韩一级黄色大片| 五月天六月激情联盟网| 婷婷亚洲综合五月天麻豆| 黄片在线免费观看全集| 久久精品国产熟女精品| av国产熟妇露脸在线观看| 国产精品夜色一区二区三区不卡| 亚洲女同一区二区另类| 九九热精彩视频在线免费| 日韩欧美一区二区黄色| 亚洲伦片免费偷拍一区| 韩国日本欧美国产三级| 大香蕉伊人一区二区三区 | 在线欧美精品二区三区| 午夜国产精品福利在线观看| 久久精品色妇熟妇丰满人妻91| 爱草草在线观看免费视频| 国产又大又黄又粗又免费| 黑丝袜美女老师的小逼逼| 国产黑人一区二区三区| 亚洲国产欧美久久精品| 开心久久综合激情五月天| 久久99国产精品果冻传媒| 中国日韩一级黄色大片| 深夜福利亚洲高清性感| 日本久久精品在线观看| 久久热在线视频免费观看| 日韩成人中文字幕在线一区 |