如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
生活随笔
收集整理的這篇文章主要介紹了
如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有多種方法使用 ADO.NET 調用存儲過程并獲得返回值和返回參數,其中包括:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconadonetproviders.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconadonetproviders.asp) 在本文的每個示例中,這些參數都被添加到 Command 對象的 Parameters 集合中。使用 SqlCommand 對象時,您不必按照任何特定的順序添加參數,但必須保證參數名正確。使用 OleDbCommand 對象時,必須按照正確的順序添加參數,不能按照名稱使用參數。
回到頂端在運行 Microsoft SQL Server 的服務器上創建下面的存儲過程: Create Procedure TestProcedure
(@au_idIN varchar (11),@numTitlesOUT Integer OUTPUT
)
AS select A.au_fname, A.au_lname, T.title
from authors as A join titleauthor as TA on
A.au_id=TA.au_id
join titles as T
on T.title_id=TA.title_id
where A.au_id=@au_idIN
set @numTitlesOUT = @@Rowcount
return (5)
新建一個新的 Visual C# .NET Windows 應用程序項目。 對 System 和 System.Data 命名空間使用 using 語句,這樣,在后面的代碼中就無需限定這些命名空間中的聲明了。將此代碼添加到"窗體"代碼模塊的頂部。請確保只復制對應于您所選的提供程序的代碼。SQL 客戶端 using System.Data.SqlClient;
OLE DB 數據提供程序 using System.Data.OleDb;
用以下代碼替換 private Form_Load 事件中的代碼:SQL 客戶端 SqlConnection PubsConn = new SqlConnection
("Data Source=server;integrated " +
"Security=sspi;initial catalog=pubs;");
SqlCommand testCMD = new SqlCommand
("TestProcedure", PubsConn);testCMD.CommandType = CommandType.StoredProcedure;SqlParameter RetVal = testCMD.Parameters.Add ("RetVal", SqlDbType.Int);
RetVal.Direction = ParameterDirection.ReturnValue;
SqlParameter IdIn = testCMD.Parameters.Add ("@au_idIN", SqlDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;
SqlParameter NumTitles = testCMD.Parameters.Add ("@numtitlesout", SqlDbType.VarChar, 11);
NumTitles.Direction = ParameterDirection.Output ;IdIn.Value = "213-46-8915";
PubsConn.Open();SqlDataReader myReader = testCMD.ExecuteReader();
Console.WriteLine ("Book Titles for this Author:");
while (myReader.Read()) {Console.WriteLine ("{0}", myReader.GetString (2));};
myReader.Close() ;
Console.WriteLine("Number of Rows: " + NumTitles.Value );
Console.WriteLine("Return Value: " + RetVal.Value);
OLE DB 數據提供程序 OleDbConnection PubsConn = new OleDbConnection ("Provider=SQLOLEDB;Data Source=server;" + "integrated Security=sspi;initial catalog=pubs;");
OleDbCommand testCMD = new OleDbCommand ("TestProcedure", PubsConn);testCMD.CommandType = CommandType.StoredProcedure;OleDbParameter RetVal = testCMD.Parameters.Add ("RetVal", OleDbType.Integer);RetVal.Direction = ParameterDirection.ReturnValue;
OleDbParameter IdIn = testCMD.Parameters.Add ("@au_idIN", OleDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;
OleDbParameter NumTitles = testCMD.Parameters.Add ("@numtitlesout", OleDbType.VarChar, 11);
NumTitles.Direction = ParameterDirection.Output;IdIn.Value = "213-46-8915";PubsConn.Open();OleDbDataReader myReader = testCMD.ExecuteReader();
Console.WriteLine ("Book Titles for this Author:");
while (myReader.Read()) {Console.WriteLine ("{0}", myReader.GetString (2));};
myReader.Close() ;
Console.WriteLine("Number of Rows: " + NumTitles.Value );
Console.WriteLine("Return Value: " + RetVal.Value);
修改 Connection 對象的連接字符串,以便指向運行 SQL Server 的計算機。 運行上述代碼。注意,DataReader 檢索記錄并返回參數值??梢允褂?DataReader 對象的 Read 方法遍歷返回的記錄。
"輸出"窗口顯示兩本書的標題、返回值 5 和輸出參數,其中包含記錄的數目 (2)。注意,必須關閉代碼中的 DataReader 才能看到參數值。另外還要注意,如果關閉了 DataReader,則不必為了查看返回參數而遍歷所有記錄。 回到頂端 在運行 SQL Server 的服務器上創建下面的存儲過程: Create Procedure TestProcedure2
(@au_idIN varchar (11)
)
As
/* set nocount on */
select count (T.title)
from authors as A join titleauthor as TA on
A.au_id=TA.au_id
join titles as T
on T.title_id=TA.title_id
where A.au_id=@au_idIN
Return(5)
新建一個新的 Visual C# .NET Windows 應用程序項目。 對 System 和 System.Data 命名空間使用 using 語句,這樣,在后面的代碼中就無需限定這些命名空間中的聲明了。將此代碼添加到"窗體"代碼模塊的頂部。請確保只復制對應于您所選的提供程序的代碼。SQL 客戶端 using System.Data.SqlClient;
OLE DB 數據提供程序 using System.Data.OleDb;
將下面的代碼添加到 Form_Load 事件:SQL 客戶端 string strCount;
SqlConnection PubsConn = new SqlConnection ("Data Source=server;integrated " + "Security=sspi;initial catalog=pubs;");
SqlCommand testCMD = new SqlCommand ("TestProcedure2", PubsConn);testCMD.CommandType = CommandType.StoredProcedure;SqlParameter RetVal = testCMD.Parameters.Add ("RetVal", SqlDbType.Int);
RetVal.Direction = ParameterDirection.ReturnValue;
SqlParameter IdIn = testCMD.Parameters.Add ("@au_idIN", SqlDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;IdIn.Value = "213-46-8915";PubsConn.Open();strCount =testCMD.ExecuteScalar ().ToString() ;Console.WriteLine("Number of Rows: " + strCount );
Console.WriteLine("Return Value: " + RetVal.Value);
OLE DB 數據提供程序 string strCount;
OleDbConnection PubsConn = new OleDbConnection ("Provider=SQLOLEDB;Data Source=server;" + "integrated Security=sspi;initial catalog=pubs;");
OleDbCommand testCMD = new OleDbCommand ("TestProcedure2", PubsConn);testCMD.CommandType = CommandType.StoredProcedure;OleDbParameter RetVal = testCMD.Parameters.Add ("RetVal", OleDbType.Integer);
RetVal.Direction = ParameterDirection.ReturnValue;
OleDbParameter IdIn = testCMD.Parameters.Add ("@au_idIN", OleDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;IdIn.Value = "213-46-8915";PubsConn.Open();strCount = testCMD.ExecuteScalar().ToString() ;Console.WriteLine("Number of Rows: " + strCount);
Console.WriteLine("Return Value: " + RetVal.Value);
修改 Connection 對象的連接字符串,以便指向運行 SQL Server 的計算機。 運行上述代碼。注意,Command 對象的 ExecuteScalar 方法將返回參數。ExecuteScalar 還將返回所返回的行集中的第一行第一列的值。因此,intCount 的值是存儲過程的 count 函數的結果。 回到頂端
如果只需要知道更改的行數,那么在使用 INSERT、UPDATE 或 DELETE 語句時,ExecuteNonQuery 方法特別有用。當存儲過程中僅使用 SELECT 語句時,您將收到 -1,因為查詢不會影響任何行。在運行 SQL Server 的計算機上創建下面的存儲過程: Create Procedure TestProcedure3
(@au_idIN varchar (11),@au_fnam varchar (30)
)As
/* set nocount on */
Update authors set au_fname = @au_fnam
where au_id = @au_idin
return (5)
新建一個新的 Visual C# .NET Windows 應用程序項目。 對 System 和 System.Data 命名空間使用 using 語句,這樣,在后面的代碼中就無需限定這些命名空間中的聲明了。將此代碼添加到"窗體"代碼模塊的頂部。請確保只復制對應于您所選的提供程序的代碼。SQL 客戶端 using System.Data.SqlClient;
OLE DB 數據提供程序 using System.Data.OleDb;
用以下代碼替換 Form1 代碼模塊中 private Form1_Load 事件后面的代碼:SQL 客戶端 string strRowAffect;
SqlConnection PubsConn = new SqlConnection ("Data Source=server;integrated Security=sspi;" + "initial catalog=pubs;");
SqlCommand testCMD = new SqlCommand ("TestProcedure3", PubsConn);testCMD.CommandType = CommandType.StoredProcedure;SqlParameter RetVal = testCMD.Parameters.Add ("RetVal", SqlDbType.Int);
RetVal.Direction = ParameterDirection.ReturnValue;
SqlParameter IdIn = testCMD.Parameters.Add ("@au_idIN", SqlDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;
SqlParameter FnameIn = testCMD.Parameters.Add ("@au_fnam", SqlDbType.VarChar, 30);
FnameIn.Direction = ParameterDirection.Input;IdIn.Value = "213-46-8915";
FnameIn.Value = "Marjorie";PubsConn.Open();strRowAffect =testCMD.ExecuteNonQuery ().ToString() ;Console.WriteLine("Number of Rows: " + strRowAffect );
Console.WriteLine("Return Value: " + RetVal.Value);
OLE DB 數據提供程序 int intRowAffected;
OleDbConnection PubsConn = new OleDbConnection ("Provider=SQLOLEDB;Data Source=server;" + "integrated Security=sspi;initial catalog=pubs;");
OleDbCommand testCMD = new OleDbCommand ("TestProcedure3", PubsConn);testCMD.CommandType = CommandType.StoredProcedure;OleDbParameter RetVal = testCMD.Parameters.Add ("RetVal", OleDbType.Integer);
RetVal.Direction = ParameterDirection.ReturnValue;
OleDbParameter IdIn = testCMD.Parameters.Add ("@au_idIN", OleDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;
OleDbParameter FnameIn = testCMD.Parameters.Add("@au_fname", OleDbType.VarChar, 30);
FnameIn.Direction = ParameterDirection.Input;IdIn.Value = "213-46-8915";
FnameIn.Value = "Marjorie";PubsConn.Open();
intRowAffected = testCMD.ExecuteNonQuery();Console.WriteLine("Number of Rows affected: " + intRowAffected);
Console.WriteLine(RetVal.Value);
修改 Connection 對象的連接字符串,以便指向運行 SQL Server 的計算機。 運行上述代碼。"輸出"窗口顯示受影響的行數 (intRowAffect) 和返回參數的值。 回到頂端
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconthenetframeworkclasslibrary.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconthenetframeworkclasslibrary.asp)
使用 DataReader 檢索數據
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontheadonetdatareader.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontheadonetdatareader.asp)
- 使用 DataSet 對象,在獲得返回值和返回參數之外,還可以收集并使用返回的數據行。
- 使用 DataReader 對象收集返回的行,遍歷這些行,然后收集返回值和返回參數。
- 使用 ExecuteScalar 方法返回結果中第一行的第一列的值以及返回值和返回參數。這對于聚合函數特別有用。
- 使用 ExecuteNonQuery 方法只返回參數和值。任何返回的行都將被丟棄。這對于執行操作查詢特別有用。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconadonetproviders.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconadonetproviders.asp) 在本文的每個示例中,這些參數都被添加到 Command 對象的 Parameters 集合中。使用 SqlCommand 對象時,您不必按照任何特定的順序添加參數,但必須保證參數名正確。使用 OleDbCommand 對象時,必須按照正確的順序添加參數,不能按照名稱使用參數。
回到頂端
使用 DataReader 返回行和參數
您可以使用 DataReader 對象返回只讀的僅向前型數據流。DataReader 中所包含的信息可以來自一個存儲過程。本示例使用 DataReader 對象運行帶有輸入和輸出參數的存儲過程,然后遍歷返回記錄,以查看返回參數。"輸出"窗口顯示兩本書的標題、返回值 5 和輸出參數,其中包含記錄的數目 (2)。注意,必須關閉代碼中的 DataReader 才能看到參數值。另外還要注意,如果關閉了 DataReader,則不必為了查看返回參數而遍歷所有記錄。
使用 Command 對象的 ExecuteScalar 方法
可以使用 Command 對象的 ExecuteScalar 方法檢索參數值。另外,ExecuteScalar 返回該存儲過程的第一行的第一列。這對于聚合函數特別有用,如下例所示。使用 Command 對象的 ExecuteNonQuery 方法
此示例使用 ExecuteNonQuery 方法運行查詢并返回參數值。ExecuteNonQuery 還返回在運行此查詢后受影響的記錄數。但是,ExecuteNonQuery 不從該存儲過程返回任何行或列。如果只需要知道更改的行數,那么在使用 INSERT、UPDATE 或 DELETE 語句時,ExecuteNonQuery 方法特別有用。當存儲過程中僅使用 SELECT 語句時,您將收到 -1,因為查詢不會影響任何行。
參考
有關其他信息,請訪問下面的 MSDN 網站: .NET Framework 類庫簡介http://msdn.microsoft.com/library/defa...
有關其他信息,請訪問下面的 MSDN 網站: .NET Framework 類庫簡介
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconthenetframeworkclasslibrary.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconthenetframeworkclasslibrary.asp)
使用 DataReader 檢索數據
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontheadonetdatareader.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontheadonetdatareader.asp)
轉載于:https://www.cnblogs.com/vibratea/archive/2009/07/27/1531885.html
總結
以上是生活随笔為你收集整理的如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SVN--subversion的五种访问
- 下一篇: latex中希腊字母_LaTeX符号(L