您的位置:首页 > 其它

使用Command执行存储过程

2003-10-13 00:02 441 查看

.NETFrameworkDeveloper'sGuide
使用Command执行存储过程
在数据驱动的应用程序中,存储过程可以提供很多优点。使用存储过程可以将数据库操作封装到一条简单的命令中,可以优化效能,可以增强安全性。只需要按照SQL语法在存储过程名后面跟带参数就可以调用该存储过程。使用ADO.NET中Command对象的Parameters属性你还可以明确的定义和使用output参数和return值。

调用存储过程时,要设置Command对象的CommandType属性为StoreProcedure。一旦设定了CommandType属性为StoreProcedure,你就可以使用Parameters集合来定义参数,就像下面的例子。

注意使用OdbcCommand调用存储过程时要求提供完整的ODBCCALL语法。

SqlClient

[VisualBasic]
DimnwindConnAsSqlConnection=NewSqlConnection("DataSource=localhost;IntegratedSecurity=SSPI;"&_
"InitialCatalog=northwind")
DimsalesCMDAsSqlCommand=NewSqlCommand("SalesByCategory",nwindConn)
salesCMD.CommandType=CommandType.StoredProcedure
DimmyParmAsSqlParameter=salesCMD.Parameters.Add("@CategoryName",SqlDbType.NVarChar,15)
myParm.Value="Beverages"
nwindConn.Open()
DimmyReaderAsSqlDataReader=salesCMD.ExecuteReader()
Console.WriteLine("{0},{1}",myReader.GetName(0),myReader.GetName(1))
DoWhilemyReader.Read()
Console.WriteLine("{0},${1}",myReader.GetString(0),myReader.GetDecimal(1))
Loop
myReader.Close()
nwindConn.Close()
[C#]
SqlConnectionnwindConn=newSqlConnection("DataSource=localhost;IntegratedSecurity=SSPI;InitialCatalog=northwind");
SqlCommandsalesCMD=newSqlCommand("SalesByCategory",nwindConn);
salesCMD.CommandType=CommandType.StoredProcedure;
SqlParametermyParm=salesCMD.Parameters.Add("@CategoryName",SqlDbType.NVarChar,15);
myParm.Value="Beverages";
nwindConn.Open();
SqlDataReadermyReader=salesCMD.ExecuteReader();
Console.WriteLine("{0},{1}",myReader.GetName(0),myReader.GetName(1));
while(myReader.Read())
{
Console.WriteLine("{0},${1}",myReader.GetString(0),myReader.GetDecimal(1));
}
myReader.Close();
nwindConn.Close();

OleDb

[VisualBasic]
DimnwindConnAsOleDbConnection=NewOleDbConnection("Provider=SQLOLEDB;DataSource=localhost;IntegratedSecurity=SSPI;"&_
"InitialCatalog=northwind")
DimsalesCMDAsOleDbCommand=NewOleDbCommand("SalesByCategory",nwindConn)
salesCMD.CommandType=CommandType.StoredProcedure
DimmyParmAsOleDbParameter=salesCMD.Parameters.Add("@CategoryName",OleDbType.VarChar,15)
myParm.Value="Beverages"
nwindConn.Open()
DimmyReaderAsOleDbDataReader=salesCMD.ExecuteReader()
Console.WriteLine("{0},{1}",myReader.GetName(0),myReader.GetName(1))
DoWhilemyReader.Read()
Console.WriteLine("{0},${1}",myReader.GetString(0),myReader.GetDecimal(1))
Loop
myReader.Close()
nwindConn.Close()
[C#]
OleDbConnectionnwindConn=newOleDbConnection("Provider=SQLOLEDB;DataSource=localhost;IntegratedSecurity=SSPI;"+
"InitialCatalog=northwind");
OleDbCommandsalesCMD=newOleDbCommand("SalesByCategory",nwindConn);
salesCMD.CommandType=CommandType.StoredProcedure;
OleDbParametermyParm=salesCMD.Parameters.Add("@CategoryName",OleDbType.VarChar,15);
myParm.Value="Beverages";
nwindConn.Open();
OleDbDataReadermyReader=salesCMD.ExecuteReader();
Console.WriteLine("/t{0},{1}",myReader.GetName(0),myReader.GetName(1));
while(myReader.Read())
{
Console.WriteLine("/t{0},${1}",myReader.GetString(0),myReader.GetDecimal(1));
}
myReader.Close();
nwindConn.Close();

Odbc

[VisualBasic]
DimnwindConnAsOdbcConnection=NewOdbcConnection("Driver={SQLServer};Server=localhost;Trusted_Connection=yes;"&_
"Database=northwind")
nwindConn.Open()
DimsalesCMDAsOdbcCommand=NewOdbcCommand("{CALLSalesByCategory(?)}",nwindConn)
salesCMD.CommandType=CommandType.StoredProcedure
DimmyParmAsOdbcParameter=salesCMD.Parameters.Add("@CategoryName",OdbcType.VarChar,15)
myParm.Value="Beverages"
DimmyReaderAsOdbcDataReader=salesCMD.ExecuteReader()
Console.WriteLine("{0},{1}",myReader.GetName(0),myReader.GetName(1))
DoWhilemyReader.Read()
Console.WriteLine("{0},${1}",myReader.GetString(0),myReader.GetDecimal(1))
Loop
myReader.Close()
nwindConn.Close()
[C#]
OdbcConnectionnwindConn=newOdbcConnection("Driver={SQLServer};Server=localhost;Trusted_Connection=yes;"+
"Database=northwind");
nwindConn.Open();
OdbcCommandsalesCMD=newOdbcCommand("{CALLSalesByCategory(?)}",nwindConn);
salesCMD.CommandType=CommandType.StoredProcedure;
OdbcParametermyParm=salesCMD.Parameters.Add("@CategoryName",OdbcType.VarChar,15);
myParm.Value="Beverages";
OdbcDataReadermyReader=salesCMD.ExecuteReader();
Console.WriteLine("/t{0},{1}",myReader.GetName(0),myReader.GetName(1));
while(myReader.Read())
{
Console.WriteLine("/t{0},${1}",myReader.GetString(0),myReader.GetDecimal(1));
}
myReader.Close();
nwindConn.Close();

一个Parameter对象可以使用Parameter构造器创建,也可以通过调用Command对象的Parameters集合的Add方法创建。Parameters.Add方法的输入参数可以和构造器相同,也可以使用一个存在的Parameter对象。用System.DBNull.Value设置Parameter的值为空。

如果要设置Parameter为非一般的输入参数时,必须设置ParameterDirection属性为InputOutputOutput,或者ReturnValue。下面的例子演示了创建Input,Output,和ReturnValue参数的差别。

SqlClient

[VisualBasic]
DimsampleCMDAsSqlCommand=NewSqlCommand("SampleProc",nwindConn)
sampleCMD.CommandType=CommandType.StoredProcedure
DimsampParmAsSqlParameter=sampleCMD.Parameters.Add("RETURN_VALUE",SqlDbType.Int)
sampParm.Direction=ParameterDirection.ReturnValue
sampParm=sampleCMD.Parameters.Add("@InputParm",SqlDbType.NVarChar,12)
sampParm.Value="SampleValue"
sampParm=sampleCMD.Parameters.Add("@OutputParm",SqlDbType.NVarChar,28)
sampParm.Direction=ParameterDirection.Output
nwindConn.Open()
DimsampReaderAsSqlDataReader=sampleCMD.ExecuteReader()
Console.WriteLine("{0},{1}",sampReader.GetName(0),sampReader.GetName(1))
DoWhilesampReader.Read()
Console.WriteLine("{0},{1}",sampReader.GetInt32(0),sampReader.GetString(1))
Loop
sampReader.Close()
nwindConn.Close()
Console.WriteLine("@OutputParm:{0}",sampleCMD.Parameters("@OutputParm").Value)
Console.WriteLine("RETURN_VALUE:{0}",sampleCMD.Parameters("RETURN_VALUE").Value)
[C#]
SqlCommandsampleCMD=newSqlCommand("SampleProc",nwindConn);
sampleCMD.CommandType=CommandType.StoredProcedure;
SqlParametersampParm=sampleCMD.Parameters.Add("RETURN_VALUE",SqlDbType.Int);
sampParm.Direction=ParameterDirection.ReturnValue;
sampParm=sampleCMD.Parameters.Add("@InputParm",SqlDbType.NVarChar,12);
sampParm.Value="SampleValue";
sampParm=sampleCMD.Parameters.Add("@OutputParm",SqlDbType.NVarChar,28);
sampParm.Direction=ParameterDirection.Output;
nwindConn.Open();
SqlDataReadersampReader=sampleCMD.ExecuteReader();
Console.WriteLine("{0},{1}",sampReader.GetName(0),sampReader.GetName(1));
while(sampReader.Read())
{
Console.WriteLine("{0},{1}",sampReader.GetInt32(0),sampReader.GetString(1));
}
sampReader.Close();
nwindConn.Close();
Console.WriteLine("@OutputParm:{0}",sampleCMD.Parameters["@OutputParm"].Value);
Console.WriteLine("RETURN_VALUE:{0}",sampleCMD.Parameters["RETURN_VALUE"].Value);

OleDb

[VisualBasic]
DimsampleCMDAsOleDbCommand=NewOleDbCommand("SampleProc",nwindConn)
sampleCMD.CommandType=CommandType.StoredProcedure
DimsampParmAsOleDbParameter=sampleCMD.Parameters.Add("RETURN_VALUE",OleDbType.Integer)
sampParm.Direction=ParameterDirection.ReturnValue
sampParm=sampleCMD.Parameters.Add("@InputParm",OleDbType.VarChar,12)
sampParm.Value="SampleValue"
sampParm=sampleCMD.Parameters.Add("@OutputParm",OleDbType.VarChar,28)
sampParm.Direction=ParameterDirection.Output
nwindConn.Open()
DimsampReaderAsOleDbDataReader=sampleCMD.ExecuteReader()
Console.WriteLine("{0},{1}",sampReader.GetName(0),sampReader.GetName(1))
DoWhilesampReader.Read()
Console.WriteLine("{0},{1}",sampReader.GetInt32(0),sampReader.GetString(1))
Loop
sampReader.Close()
nwindConn.Close()
Console.WriteLine("@OutputParm:{0}",sampleCMD.Parameters("@OutputParm").Value)
Console.WriteLine("RETURN_VALUE:{0}",sampleCMD.Parameters("RETURN_VALUE").Value)
[C#]
OleDbCommandsampleCMD=newOleDbCommand("SampleProc",nwindConn);
sampleCMD.CommandType=CommandType.StoredProcedure;
OleDbParametersampParm=sampleCMD.Parameters.Add("RETURN_VALUE",OleDbType.Integer);
sampParm.Direction=ParameterDirection.ReturnValue;
sampParm=sampleCMD.Parameters.Add("@InputParm",OleDbType.VarChar,12);
sampParm.Value="SampleValue";
sampParm=sampleCMD.Parameters.Add("@OutputParm",OleDbType.VarChar,28);
sampParm.Direction=ParameterDirection.Output;
nwindConn.Open();
OleDbDataReadersampReader=sampleCMD.ExecuteReader();
Console.WriteLine("{0},{1}",sampReader.GetName(0),sampReader.GetName(1));
while(sampReader.Read())
{
Console.WriteLine("{0},{1}",sampReader.GetInt32(0),sampReader.GetString(1));
}
sampReader.Close();
nwindConn.Close();
Console.WriteLine("@OutputParm:{0}",sampleCMD.Parameters["@OutputParm"].Value);
Console.WriteLine("RETURN_VALUE:{0}",sampleCMD.Parameters["RETURN_VALUE"].Value);

Odbc

[VisualBasic]
DimsampleCMDAsOdbcCommand=NewOdbcCommand("{?=CALLSampleProc(?,?)}",nwindConn)
sampleCMD.CommandType=CommandType.StoredProcedure
DimsampParmAsOdbcParameter=sampleCMD.Parameters.Add("RETURN_VALUE",OdbcType.Int)
sampParm.Direction=ParameterDirection.ReturnValue
sampParm=sampleCMD.Parameters.Add("@InputParm",OdbcType.VarChar,12)
sampParm.Value="SampleValue"
sampParm=sampleCMD.Parameters.Add("@OutputParm",OdbcType.VarChar,28)
sampParm.Direction=ParameterDirection.Output
nwindConn.Open()
DimsampReaderAsOdbcDataReader=sampleCMD.ExecuteReader()
Console.WriteLine("{0},{1}",sampReader.GetName(0),sampReader.GetName(1))
DoWhilesampReader.Read()
Console.WriteLine("{0},{1}",sampReader.GetInt32(0),sampReader.GetString(1))
Loop
sampReader.Close()
nwindConn.Close()
Console.WriteLine("@OutputParm:{0}",sampleCMD.Parameters("@OutputParm").Value)
Console.WriteLine("RETURN_VALUE:{0}",sampleCMD.Parameters("RETURN_VALUE").Value)
[C#]
OdbcCommandsampleCMD=newOdbcCommand("{?=CALLSampleProc(?,?)}",nwindConn);
sampleCMD.CommandType=CommandType.StoredProcedure;
OdbcParametersampParm=sampleCMD.Parameters.Add("RETURN_VALUE",OdbcType.Int);
sampParm.Direction=ParameterDirection.ReturnValue;
sampParm=sampleCMD.Parameters.Add("@InputParm",OdbcType.VarChar,12);
sampParm.Value="SampleValue";
sampParm=sampleCMD.Parameters.Add("@OutputParm",OdbcType.VarChar,28);
sampParm.Direction=ParameterDirection.Output;
nwindConn.Open();
OdbcDataReadersampReader=sampleCMD.ExecuteReader();
Console.WriteLine("{0},{1}",sampReader.GetName(0),sampReader.GetName(1));
while(sampReader.Read())
{
Console.WriteLine("{0},{1}",sampReader.GetInt32(0),sampReader.GetString(1));
}
sampReader.Close();
nwindConn.Close();
Console.WriteLine("@OutputParm:{0}",sampleCMD.Parameters["@OutputParm"].Value);
Console.WriteLine("RETURN_VALUE:{0}",sampleCMD.Parameters["RETURN_VALUE"].Value);

在SqlCommand中使用参数

SqlCommand中使用参数时,参数的名字必须和存储过程中相应参数的名字匹配。SQLSERVER的.NETFrameworkDataProvider将存储过程中的参数视为命名参数并且搜索与之匹配的参数标记。

SQLSERVER的.NETFrameworkDataProvider不支持使用问号标记(?)作为占位符来向SQL语句或者存储过程传递参数。既然如此,你必须命名参数,就下面一样:
SELECT*FROMCustomersWHERECustomerID=@CustomerID

在OleDbCommand和OdbcCommand中使用参数

OleDbCommand或者OdbcCommand中使用参数时,参数添加到Parameters集合中的顺序必须和存储过程中参数定义的顺序匹配。OLEDB和ODBC的.NETFramework数据供应程序将存储过程的参数视为占位符,按照顺序来给参数赋值。另外,返回参数必须是第一个被加入到Parameters集合中的参数。

OLEDB和ODBC的.NETFramework数据供应程序不提供使用命名参数来向SQL语句或存储过程传递参数。为此,你必须使用问号(?)占位符,就像下面一样:
SELECT*FROMCustomersWHERECustomerID=?

因此,向Parameters集合添加Parameter对象的顺序必须直接对应于该参数的问号占位符的位置。

导出参数信息

参数也可以使用CommandBuilder类从存储过程导出。SqlCommandBuilderOleDbCommandBuilder类都提供了静态方法DeriveParameters,该静态方法将自动使用存储过程中的参数信息填充Command对象的Parameters集合。请注意,DeriveParameters将改写Command的任何现有参数信息。

导出参数信息时需要经历一个到数据源的附加行程,以获取参数信息。如果参数信息在设计时是已知的,则可以通过显式设置参数来提高应用程序的性能。

以下代码示例显示如何使用CommandBuilder.DeriveParameters来填充Command对象的Parameters集合。
[VisualBasic]
DimnwindConnAsSqlConnection=NewSqlConnection("DataSource=localhost;InitialCatalog=Northwind;IntegratedSecurity=SSPI;")
DimsalesCMDAsSqlCommand=NewSqlCommand("SalesByYear",nwindConn)
salesCMD.CommandType=CommandType.StoredProcedure
nwindConn.Open()
SqlCommandBuilder.DeriveParameters(salesCMD)
nwindConn.Close()
[C#]
SqlConnectionnwindConn=newSqlConnection("DataSource=localhost;InitialCatalog=Northwind;IntegratedSecurity=SSPI;");
SqlCommandsalesCMD=newSqlCommand("SalesByYear",nwindConn);
salesCMD.CommandType=CommandType.StoredProcedure;
nwindConn.Open();
SqlCommandBuilder.DeriveParameters(salesCMD);
nwindConn.Close();

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐