1. 程式人生 > >C#中呼叫儲存過程

C#中呼叫儲存過程

1、沒有引數沒有返回值  

2、有引數沒有返回值 

3、有引數有返回值 

 下面就這幾種情況分別舉例:1、沒有引數沒有返回值,象這種情況最簡單。

儲存過程

USE Northwind 

CREATE PROC novaluenoparameter 

AS 

  SELECT * FROM products 

GO

/// <summary> 

/// c#程式碼 方法

/// </summary> 

SqlConnection conn = new SqlConnection(); 

conn.ConnectionString = strConn; 

conn.Open(); 

SqlCommand comm = new SqlCommand("EXEC novaluenoparameter", conn); 

comm.ExecuteNonQuery(); 

conn.Close(); 

情況2、有引數沒有返回值

儲存過程(帶引數,沒有返回值) 

CREATE PROC novaluebeparameter 

@i int , 

@productname varchar(20) 

AS 

   SELECT TOP @i * FROM products where productname = @productname 

GO 

/// <summary> 

/// C#程式碼:呼叫帶引數沒有返回值的儲存過程 

/// </summary> 

SqlConnection conn = new SqlConnection(); 

conn.ConnectionString = strConn; 

conn.Open(); 

SqlCommand comm = new SqlCommand("novaluebeparameter", conn); //“novaluebeparameter”是儲存過程名 

comm.CommandType = CommandType.StoredProcedure; 

comm.Parameters.Add(new SqlParameter("@i",SqlDbType.Int)); 

comm.Parameters.Add(new SqlParameter("@productname",SqlDbType.varchar,20)); 

comm.Parameters["@i"].Value=3; 

comm.Parameters["@productname"].value = "Tofu" 

comm.ExecuteNonQuery(); 

conn.Close();

3、帶引數,有返回值(返回一個值,這裡說下,有返回一個值的,有返回一個數據集的。)

儲存過程(帶引數,有返回值) 

CREATE PROC novaluebeparameter 

@i int , 

@j int, 

@sum int output 

AS 

   SET @sum = @i + @j 

   RETURN @sum 

GO

儲存過程的呼叫在B/S系統中用的很多。傳統的呼叫方法不僅速度慢,而且程式碼會隨著儲存過程的增多不斷膨脹,難以維護。新的方法在一定程度上解決了這些問題。 

在使用.NET的過程中,資料庫訪問是一個很重要的部分,特別是在B/S系統的構建過程中,資料庫操作幾乎成為了一個必不可少的操作。呼叫儲存過程實現資料庫操作使很多程式設計師使用的方法,而且大多數的程式設計師都是能使用儲存過程就使用儲存過程,很少直接使用SQL語句,所以儲存過程是很有用而且很重要的。 

儲存過程簡介
簡單的說,儲存過程是由一些SQL語句和控制語句組成的被封裝起來的過程,它駐留在資料庫中,可以被客戶應用程式呼叫,也可以從另一個過程或觸發器呼叫。它的引數可以被傳遞和返回。與應用程式中的函式過程類似,儲存過程可以通過名字來呼叫,而且它們同樣有輸入引數和輸出引數。 
根據返回值型別的不同,我們可以將儲存過程分為三類:返回記錄集的儲存過程, 返回數值的儲存過程(也可以稱為標量儲存過程),以及行為儲存過程。顧名思義,返回記錄集的儲存過程的執行結果是一個記錄集,典型的例子是從資料庫中檢索出符合某一個或幾個條件的記錄;返回數值的儲存過程執行完以後返回一個值,例如在資料庫中執行一個有返回值的函式或命令;最後,行為儲存過程僅僅是用來實現資料庫的某個功能,而沒有返回值,例如在資料庫中的更新和刪除操作。 

使用儲存過程的好處
相對於直接使用SQL語句,在應用程式中直接呼叫儲存過程有以下好處: 
(1)減少網路通訊量。呼叫一個行數不多的儲存過程與直接呼叫SQL語句的網路通訊量可能不會有很大的差別,可是如果儲存過程包含上百行SQL語句,那麼其效能絕對比一條一條的呼叫SQL語句要高得多。 
(2)執行速度更快。有兩個原因:首先,在儲存過程建立的時候,資料庫已經對其進行了一次解析和優化。其次,儲存過程一旦執行,在記憶體中就會保留一份這個儲存過程,這樣下次再執行同樣的儲存過程時,可以從記憶體中直接呼叫。 
(3)更強的適應性:由於儲存過程對資料庫的訪問是通過儲存過程來進行的,因此資料庫開發人員可以在不改動儲存過程介面的情況下對資料庫進行任何改動,而這些改動不會對應用程式造成影響。 
(4) 布式工作:應用程式和資料庫的編碼工作可以分別獨立進行,而不會相互壓制。 
由以上的分析可以看到,在應用程式中使用儲存過程是很有必要的。 

兩種不同的儲存過程呼叫方法
為了突出新方法的優點,首先介紹一下在.NET中呼叫儲存過程的“官方”方法。另外,本文的所有示例程式均工作於SqlServer資料庫上,其它情況類似,以後不再一一說明。本文所有例子均採用C#語言。 
要在應用程式中訪問資料庫,一般性的步驟是:首先宣告一個數據庫連線SqlConnection,然後宣告一個數據庫命令SqlCommand,用來執行SQL語句和儲存過程。有了這兩個物件後,就可以根據自己的需要採用不同的執行方式達到目的。需要補充的是,不要忘記在頁面上新增如下的引用語句:using System.Data.SqlClient。 
就執行儲存過程來說,如果執行的是第一類儲存過程,那麼就要用一個DataAdapter將結果填充到一個DataSet中,然後就可以使用資料網格控制元件將結果呈現在頁面上了;如果執行的是第二和第三種儲存過程,則不需要此過程,只需要根據特定的返回判定操作是否成功完成即可。 
(1)執行一個沒有引數的儲存過程的程式碼如下: 

複製程式碼程式碼如下:
SqlConnection conn=new SqlConnection(“connectionString”); 
SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = new SqlCommand(); 
da.SelectCommand.Connection = conn; 
da.SelectCommand.CommandText = "NameOfProcedure"; 
da.SelectCommand.CommandType = CommandType.StoredProcedure; 

然後只要選擇適當的方式執行此處過程,用於不同的目的即可。 
(2)執行一個有引數的儲存過程的程式碼如下(我們可以將呼叫儲存過程的函式宣告為ExeProcedure(string inputdate)): 
複製程式碼程式碼如下:
SqlConnection conn=new SqlConnection(“connectionString”); 
SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = new SqlCommand(); 
da.SelectCommand.Connection = conn; 
da.SelectCommand.CommandText = "NameOfProcedure"; 
da.SelectCommand.CommandType = CommandType.StoredProcedure; 

(以上程式碼相同,以下為要新增的程式碼) 
複製程式碼程式碼如下:
param = new SqlParameter("@ParameterName", SqlDbType.DateTime); 
param.Direction = ParameterDirection.Input; 
param.Value = Convert.ToDateTime(inputdate); 
da.SelectCommand.Parameters.Add(param); 

這樣就添加了一個輸入引數。若需要新增輸出引數: 
複製程式碼程式碼如下:
//設定儲存過程的引數值,其中@ParameterName為儲存過程的引數. 
param = new SqlParameter("@ParameterName", SqlDbType.DateTime); 
param.Direction = ParameterDirection.Output; 
param.Value = Convert.ToDateTime(inputdate); //儲存過程引數值; 
da.SelectCommand.Parameters.Add(param); 

若要獲得參儲過程的返回值: 
複製程式碼程式碼如下:
param = new SqlParameter("@ParameterName", SqlDbType.DateTime); 
param.Direction = ParameterDirection.ReturnValue; 
param.Value = Convert.ToDateTime(inputdate); 
da.SelectCommand.Parameters.Add(param); 
執行: DataSet myds=new DataSet(); 
da.Fill(myds,"tableName"); 

從上面的程式碼我們可以看出,當儲存過程比較多或者儲存過程的引數比較多時,這種方法會大大影響開發的速度;另外一方面,如果專案比較大,那麼這些用於資料庫邏輯的函式在以後的維護中也是一個很大的負擔。那麼,有沒有一種改進的方法可以解決這個問題呢?想到在執行沒有引數的儲存過程時只需要傳入一個儲存過程的名字就可以呼叫相應的儲存過程,而且在SqlServer資料庫中我們可以直接在查詢分析器中敲入“儲存過程名(引數列表)”樣的字串就可以執行儲存過程,那麼,是否可以把這種思想應用到應用程式中呢? 
於是在編譯器中鍵入相應程式碼。這些程式碼是在呼叫不帶引數的儲存過程的程式碼的基礎上改的。具體程式碼如下: 
複製程式碼程式碼如下:
SqlConnection conn=new SqlConnection(“connectionString”); 
SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = new SqlCommand(); 
da.SelectCommand.Connection = conn; 
da.SelectCommand.CommandText = "NameOfProcedure('para1','para2',para3)"; 
da.SelectCommand.CommandType = CommandType.StoredProcedure; 

為了使程式碼更具有代表性,要呼叫的儲存過程的第一個和第二個引數都為字串型別,第三個引數為整型。執行以後發現,完全可以達到預期的效果! 

兩種呼叫方法的比較
通過比較我們可以看到,第二種方法具有一個很明顯的優點,那就是可以提高開發速度,節省開發時間,而且程式碼容易維護,在一定程度上也減少了系統大小。但是,由於對儲存過程引數的處理比較籠統,如果要獲取輸出引數或者得到儲存過程的返回值,這種方法就不能滿足需要了。雖然如此,但是,這種方法畢竟可以讓開發人員少些很大一部分的程式碼。如果不需要獲取輸出引數和返回值,那麼幾乎可以做到“一勞永逸”。因此在實際的程式開發中,這種方法還是具有一定的實用價值的。 
用來建立DataRead的儲存過程呼叫; 
複製程式碼程式碼如下:
//資料庫連線字串 
string connStr="Server=localhost;database=stuIMS;uid=sa;pwd=admin"; 
//建立連線 
SqlConnection conn=new SqlConnection(connStr); 
//建立查詢命令 
SqlCommand myCommand=new SqlCommand("儲存過程名",conn); 
//呼叫儲存過程名 
myCommand.CommandType=CommandType.StoredProcedure; 
//設定儲存過程的引數值,其中@id 為儲存過程的引數. 
SqlParameter id=myCommand.Parameters.Add("@id",SqlDbType.NText); 
id.Value=儲存過程引數值; 
//執行命令 
SqlDataReader reader=myCommand.ExecuteReader();//讀取資料 
//或者 
SqlDataReader reader=myCommand.ExecuteNonQuery();//資料更新 

轉載:http://www.jb51.net/article/32760.htm

相關推薦

C#呼叫儲存過程

1、沒有引數沒有返回值   2、有引數沒有返回值  3、有引數有返回值   下面就這幾種情況分別舉例:1、沒有引數沒有返回值,象這種情況最簡單。 儲存過程 USE Northwind  CREATE PROC novaluenoparameter  AS    SE

C# 後臺呼叫儲存過程

   protected void Page_Load(object sender, EventArgs e)         {             if (!Page.IsPostBack)             { #region 實參            

C# 後臺呼叫儲存過程,獲取DataTable

 public System.Data.DataTable GetDataBy_storedproc2()         {             #region _adapter             var _adapter = new System.Data.Sq

在PL/SQL呼叫儲存過程--oracle

在oracle10中寫好了儲存過程,程式碼如下: CREATE OR REPLACE Procedure Proc_Insert ( sName in varchar2, sAge in int,

oracle呼叫儲存過程

儲存過程的呼叫 增加,修改,刪除的儲存過程呼叫 帶輸入引數的儲存過程呼叫 帶輸出引數的儲存過程的呼叫:此處以登入成功還是失敗為例.返回0 或者1 增加,修改,刪除的儲存過程呼叫

shell呼叫儲存過程

將需要呼叫的儲存過程寫在檔案tasklist.txt中 下面將批量執行檔案列表中的儲存過程 #!/bin/ksh if [ $# -eq 0 ];then echo "no paramer please input one paramer A OR B" exit fi e

oracle 函式呼叫儲存過程

  專案中開發了一個儲存過程來給報表提供資料來源,而程式業務邏輯中需要有一個對該資料來源進行判斷的功能,開始是使用拼接sql的方式在儲存過程中對應sql的外面包裝一層來進行處理,但是覺得這種方式拼接的sql太長,而且以後業務邏輯改變要同時修改儲存過程和程式碼,容易發生遺漏,

ASP呼叫儲存過程、語法、寫法-sql server資料庫,return,output

ASP與儲存過程(Stored Procedures)的文章不少,但是我懷疑作者們是否真正實踐過。我在初學時查閱過大量相關資料,發現其中提供的很多方法實際操作起來並不是那麼回事。對於簡單的應用,這些資料也許是有幫助的,但僅限於此,因為它們根本就是千篇一律,互相抄襲,稍微複雜

CI框架呼叫儲存過程報錯:Commands out of sync; you can't run this command now

專案開發中碰到的問題,資料庫寫了個儲存過程,在ci框架中呼叫此儲存過程,碰到了問題,接觸ci框架時間不長,摸索了好半天,才終於解決。 問題如下: $common = $this->db->query("call welcome_common_data

Java呼叫儲存過程 -- Mybatis

Java中呼叫儲存過程 -- Mybatis public interface XXXMapper { ​ /* * 1.沒有出參(返回值,void) 返回不了值,返回值都封裝在入參的實體類或Map中(引用型別) * 原因:存過的入參、出參都在java呼叫的入參中

在Java呼叫儲存過程(詳細)

本文闡述了怎麼使用DBMS儲存過程。我闡述了使用儲存過程的基本的和高階特性,比如返回ResultSet。本文假設你對DBMS和JDBC已經非常熟悉,也假設你能夠毫無障礙地閱讀其它語言寫成的程式碼(即不是Java的語言),但是,並不要求你有任何儲存過程的程式設計經歷。  儲

C#利用儲存過程(含有引數)返回dataset

public   DataSet   SQLDB(string   teacheranme)     {     try     {     SqlConnection   conn   =   new       SqlConnection("Password   =  

MyBatis呼叫儲存過程和函式

一.呼叫儲存過程    1.首先在資料庫中定義儲存過程,定義的儲存過程的程式碼如下: //定義儲存過程create or replace procedure pag_add(p1 varchar2,p2 varchar2,p3 out varchar2) as begin

在python呼叫儲存過程

儲存過程一般來說在資料庫中直接定義,然後在python中呼叫 新建儲存過程: 執行 結果符合預期,接下來在python呼叫它 import pymysql conn = pymysql.connect(host='127.0.0.1', u

資料庫儲存過程,事務 jfinal呼叫儲存過程,事務

mysql DELIMITER $$ CREATE PROCEDURE `student`.`ceshi`(n INT,j CHAR(1)) BEGIN IF j = 'h' THEN SELECT * FROM blog

java呼叫儲存過程並傳遞list集合引數的方法

sql: CREATE OR REPLACE TYPE test as object( FID NUMBER,  NUM nVARCHAR2(30),  TESKID NUMBER,  CID NUMBER, USERCODE nVARCHAR2(100) ) CREA

在SSH專案呼叫儲存過程

一. 建表與初始化資料 create database user create table userInfo ( id int identity(1,1) primary key not null, name varchar(20) not null, age int no

Wcf Ria Services學習筆記(三):WCF RIA Service呼叫儲存過程

            專案中碰到要呼叫儲存過程的情況!但Wcf Ria Service呼叫儲存過程似乎有點麻煩!將碰到的問題簡單做個記錄。 分別以幾個特別的儲存過程為例說明下,Wcf Ria Service中怎麼樣呼叫儲存過程。 (一)帶輸入引數和輸出引數的儲存過程。

.net呼叫儲存過程

摘要:在一個專案的開發中,經常會呼叫資料庫中的儲存過程。可是,幾乎所有儲存過程的呼叫都是同一個模式,主要區別就在於建立的每個引數型別、值等不一樣。那麼,能不能實現通過一個函式(或者類)呼叫所有的儲存過程呢?本文在利用資料庫提供的系統表原理上,實現了統一呼叫的方法,該方法只需

C#對資料庫的基本操作(增刪改以及呼叫儲存過程

因為最近在寫web API的時候需要對資料庫操作,所以要用到ADO.NET,因為之前沒有接觸過.NET所以也是一邊上網查資料看C#書一邊寫,現在對這塊基礎的部分已經掌握了,現在寫下來只是想對自己前段時間的學習做個簡單的總結,也便於自己以後查閱(網上有很多類似的資源,大家可以