如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
生活随笔
收集整理的這篇文章主要介紹了
如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有多種方法使用 ADO.NET 調(diào)用存儲(chǔ)過(guò)程并獲得返回值和返回參數(shù),其中包括:
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) 在本文的每個(gè)示例中,這些參數(shù)都被添加到 Command 對(duì)象的 Parameters 集合中。使用 SqlCommand 對(duì)象時(shí),您不必按照任何特定的順序添加參數(shù),但必須保證參數(shù)名正確。使用 OleDbCommand 對(duì)象時(shí),必須按照正確的順序添加參數(shù),不能按照名稱(chēng)使用參數(shù)。
回到頂端在運(yùn)行 Microsoft SQL Server 的服務(wù)器上創(chuàng)建下面的存儲(chǔ)過(guò)程: 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)
新建一個(gè)新的 Visual C# .NET Windows 應(yīng)用程序項(xiàng)目。 對(duì) System 和 System.Data 命名空間使用 using 語(yǔ)句,這樣,在后面的代碼中就無(wú)需限定這些命名空間中的聲明了。將此代碼添加到"窗體"代碼模塊的頂部。請(qǐng)確保只復(fù)制對(duì)應(yīng)于您所選的提供程序的代碼。SQL 客戶(hù)端 using System.Data.SqlClient;
OLE DB 數(shù)據(jù)提供程序 using System.Data.OleDb;
用以下代碼替換 private Form_Load 事件中的代碼:SQL 客戶(hù)端 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 數(shù)據(jù)提供程序 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 對(duì)象的連接字符串,以便指向運(yùn)行 SQL Server 的計(jì)算機(jī)。 運(yùn)行上述代碼。注意,DataReader 檢索記錄并返回參數(shù)值。可以使用 DataReader 對(duì)象的 Read 方法遍歷返回的記錄。
"輸出"窗口顯示兩本書(shū)的標(biāo)題、返回值 5 和輸出參數(shù),其中包含記錄的數(shù)目 (2)。注意,必須關(guān)閉代碼中的 DataReader 才能看到參數(shù)值。另外還要注意,如果關(guān)閉了 DataReader,則不必為了查看返回參數(shù)而遍歷所有記錄。 回到頂端 在運(yùn)行 SQL Server 的服務(wù)器上創(chuàng)建下面的存儲(chǔ)過(guò)程: 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)
新建一個(gè)新的 Visual C# .NET Windows 應(yīng)用程序項(xiàng)目。 對(duì) System 和 System.Data 命名空間使用 using 語(yǔ)句,這樣,在后面的代碼中就無(wú)需限定這些命名空間中的聲明了。將此代碼添加到"窗體"代碼模塊的頂部。請(qǐng)確保只復(fù)制對(duì)應(yīng)于您所選的提供程序的代碼。SQL 客戶(hù)端 using System.Data.SqlClient;
OLE DB 數(shù)據(jù)提供程序 using System.Data.OleDb;
將下面的代碼添加到 Form_Load 事件:SQL 客戶(hù)端 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 數(shù)據(jù)提供程序 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 對(duì)象的連接字符串,以便指向運(yùn)行 SQL Server 的計(jì)算機(jī)。 運(yùn)行上述代碼。注意,Command 對(duì)象的 ExecuteScalar 方法將返回參數(shù)。ExecuteScalar 還將返回所返回的行集中的第一行第一列的值。因此,intCount 的值是存儲(chǔ)過(guò)程的 count 函數(shù)的結(jié)果。 回到頂端
如果只需要知道更改的行數(shù),那么在使用 INSERT、UPDATE 或 DELETE 語(yǔ)句時(shí),ExecuteNonQuery 方法特別有用。當(dāng)存儲(chǔ)過(guò)程中僅使用 SELECT 語(yǔ)句時(shí),您將收到 -1,因?yàn)椴樵?xún)不會(huì)影響任何行。在運(yùn)行 SQL Server 的計(jì)算機(jī)上創(chuàng)建下面的存儲(chǔ)過(guò)程: 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)
新建一個(gè)新的 Visual C# .NET Windows 應(yīng)用程序項(xiàng)目。 對(duì) System 和 System.Data 命名空間使用 using 語(yǔ)句,這樣,在后面的代碼中就無(wú)需限定這些命名空間中的聲明了。將此代碼添加到"窗體"代碼模塊的頂部。請(qǐng)確保只復(fù)制對(duì)應(yīng)于您所選的提供程序的代碼。SQL 客戶(hù)端 using System.Data.SqlClient;
OLE DB 數(shù)據(jù)提供程序 using System.Data.OleDb;
用以下代碼替換 Form1 代碼模塊中 private Form1_Load 事件后面的代碼:SQL 客戶(hù)端 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 數(shù)據(jù)提供程序 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 對(duì)象的連接字符串,以便指向運(yùn)行 SQL Server 的計(jì)算機(jī)。 運(yùn)行上述代碼。"輸出"窗口顯示受影響的行數(shù) (intRowAffect) 和返回參數(shù)的值。 回到頂端
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 檢索數(shù)據(jù)
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 對(duì)象,在獲得返回值和返回參數(shù)之外,還可以收集并使用返回的數(shù)據(jù)行。
- 使用 DataReader 對(duì)象收集返回的行,遍歷這些行,然后收集返回值和返回參數(shù)。
- 使用 ExecuteScalar 方法返回結(jié)果中第一行的第一列的值以及返回值和返回參數(shù)。這對(duì)于聚合函數(shù)特別有用。
- 使用 ExecuteNonQuery 方法只返回參數(shù)和值。任何返回的行都將被丟棄。這對(duì)于執(zhí)行操作查詢(xún)特別有用。
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) 在本文的每個(gè)示例中,這些參數(shù)都被添加到 Command 對(duì)象的 Parameters 集合中。使用 SqlCommand 對(duì)象時(shí),您不必按照任何特定的順序添加參數(shù),但必須保證參數(shù)名正確。使用 OleDbCommand 對(duì)象時(shí),必須按照正確的順序添加參數(shù),不能按照名稱(chēng)使用參數(shù)。
回到頂端
使用 DataReader 返回行和參數(shù)
您可以使用 DataReader 對(duì)象返回只讀的僅向前型數(shù)據(jù)流。DataReader 中所包含的信息可以來(lái)自一個(gè)存儲(chǔ)過(guò)程。本示例使用 DataReader 對(duì)象運(yùn)行帶有輸入和輸出參數(shù)的存儲(chǔ)過(guò)程,然后遍歷返回記錄,以查看返回參數(shù)。"輸出"窗口顯示兩本書(shū)的標(biāo)題、返回值 5 和輸出參數(shù),其中包含記錄的數(shù)目 (2)。注意,必須關(guān)閉代碼中的 DataReader 才能看到參數(shù)值。另外還要注意,如果關(guān)閉了 DataReader,則不必為了查看返回參數(shù)而遍歷所有記錄。
使用 Command 對(duì)象的 ExecuteScalar 方法
可以使用 Command 對(duì)象的 ExecuteScalar 方法檢索參數(shù)值。另外,ExecuteScalar 返回該存儲(chǔ)過(guò)程的第一行的第一列。這對(duì)于聚合函數(shù)特別有用,如下例所示。使用 Command 對(duì)象的 ExecuteNonQuery 方法
此示例使用 ExecuteNonQuery 方法運(yùn)行查詢(xún)并返回參數(shù)值。ExecuteNonQuery 還返回在運(yùn)行此查詢(xún)后受影響的記錄數(shù)。但是,ExecuteNonQuery 不從該存儲(chǔ)過(guò)程返回任何行或列。如果只需要知道更改的行數(shù),那么在使用 INSERT、UPDATE 或 DELETE 語(yǔ)句時(shí),ExecuteNonQuery 方法特別有用。當(dāng)存儲(chǔ)過(guò)程中僅使用 SELECT 語(yǔ)句時(shí),您將收到 -1,因?yàn)椴樵?xún)不會(huì)影響任何行。
參考
有關(guān)其他信息,請(qǐng)?jiān)L問(wèn)下面的 MSDN 網(wǎng)站: .NET Framework 類(lèi)庫(kù)簡(jiǎn)介http://msdn.microsoft.com/library/defa...
有關(guān)其他信息,請(qǐng)?jiān)L問(wèn)下面的 MSDN 網(wǎng)站: .NET Framework 類(lèi)庫(kù)簡(jiǎn)介
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 檢索數(shù)據(jù)
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)
轉(zhuǎn)載于:https://www.cnblogs.com/vibratea/archive/2009/07/27/1531885.html
總結(jié)
以上是生活随笔為你收集整理的如何使用 ADO.NET 和 Visual C# .NET 调用带参数的存储过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SVN--subversion的五种访问
- 下一篇: QQ协议TEA加密解密代码 C#