ADO.NET使用方法和技巧

来源:网络时间:2011-06-23

  使用存储过程输出参数来检索单个行

  1.

  创建一个 SqlCommand 对象并将其与一个 SqlConnection 对象相关联。

  2.

  通过调用 SqlCommand 的 Parameters 集合的 Add 方法来设置存储过程参数。默认情况下,参数都被假设为输入参数,因此必须显式设置任何输出参数的方向。

  注 一种良好的习惯做法是显式设置所有参数(包括输入参数)的方向。

  3.

  打开连接。

  4.

  调用 SqlCommand 对象的 ExecuteNonQuery 方法。这将填充输出参数(并可能填充返回值)。

  5.

  通过使用 Value 属性,从适当的 SqlParameter 对象中检索输出参数。

  6.

  关闭连接。

  上述代码片段调用了以下存储过程。

  CREATE PROCEDURE DATGetProductDetailsSPOutput

  @ProductID int,

  @ProductName nvarchar(40) OUTPUT,

  @UnitPrice money OUTPUT

  AS

  SELECT @ProductName = ProductName,

  @UnitPrice = UnitPrice

  FROM Products

  WHERE ProductID = @ProductID

  GO

  如何使用 SqlDataReader 来检索单个行

  可以使用 SqlDataReader 对象来检索单个行,尤其是可以从返回的数据流中检索需要的列值。以下代码片段对此进行了说明。

  void GetProductDetailsUsingReader( int ProductID,

  out string ProductName, out decimal UnitPrice )

  {

  using( SqlConnection conn = new SqlConnection(

  "server=(local);Integrated Security=SSPI;database=Northwind") )

  {

  // Set up the command object used to execute the stored proc

  SqlCommand cmd = new SqlCommand( "DATGetProductDetailsReader", conn );

  cmd.CommandType = CommandType.StoredProcedure;

  // Establish stored proc parameters.

  // @ProductID int INPUT

  SqlParameter paramProdID = cmd.Parameters.Add( "@ProductID", ProductID );

  paramProdID.Direction = ParameterDirection.Input;

  conn.Open();

  using( SqlDataReader reader = cmd.ExecuteReader() )

  {

  if( reader.Read() ) // Advance to the one and only row

  {

  // Return output parameters from returned data stream

  ProductName = reader.GetString(0);

  UnitPrice = reader.GetDecimal(1);

  }

  }

  }

  }

  使用 SqlDataReader 对象来返回单个行

  1.

  建立 SqlCommand 对象。

  2.

  打开连接。

  3.

  调用 SqlDataReader 对象的 ExecuteReader 方法。

  4.

  通过 SqlDataReader 对象的类型化访问器方法(在这里,为 GetString 和 GetDecimal)来检索输出参数。

  上述代码片段调用了以下存储过程。

  CREATE PROCEDURE DATGetProductDetailsReader

  @ProductID int

  AS

  SELECT ProductName, UnitPrice FROM Products

  WHERE ProductID = @ProductID

  GO

  如何使用 ExecuteScalar 来检索单个项

  ExecuteScalar 方法专门适用于仅返回单个值的查询。如果查询返回多个列和/或行,ExecuteScalar 将只返回第一行的第一列。

  以下代码说明了如何查找与特定产品 ID 相对应的产品名称:

  void GetProductNameExecuteScalar( int ProductID, out string ProductName )

  {

  using( SqlConnection conn = new SqlConnection(

  "server=(local);Integrated Security=SSPI;database=northwind") )

  {

  SqlCommand cmd = new SqlCommand("LookupProductNameScalar", conn );

  cmd.CommandType = CommandType.StoredProcedure;

  cmd.Parameters.Add("@ProductID", ProductID );

  conn.Open();

  ProductName = (string)cmd.ExecuteScalar();

  }

  }

  使用 ExecuteScalar 来检索单个项

  1.

  建立一个 SqlCommand 对象来调用存储过程。

  2.

  打开连接。

  3.

  调用 ExecuteScalar 方法。注意,该方法返回一个对象类型。它包含检索到的第一列的值,并且必须转化为适当的类型。

  4.

  关闭连接。

  上述代码使用了以下存储过程:

  CREATE PROCEDURE LookupProductNameScalar

  @ProductID int

  AS

  SELECT TOP 1 ProductName

  FROM Products

  WHERE ProductID = @ProductID

  GO

  如何使用存储过程输出或返回参数来检索单个项

  可以使用存储过程输出或返回参数来查找单个值。以下代码阐明了输出参数的用法:

  void GetProductNameUsingSPOutput( int ProductID, out string ProductName )

  {

  using( SqlConnection conn = new SqlConnection(

  "server=(local);Integrated Security=SSPI;database=northwind") )

  {

  SqlCommand cmd = new SqlCommand("LookupProductNameSPOutput", conn );

  cmd.CommandType = CommandType.StoredProcedure;

  SqlParameter paramProdID = cmd.Parameters.Add("@ProductID", ProductID );

  ParamProdID.Direction = ParameterDirection.Input;

  SqlParameter paramPN =

  cmd.Parameters.Add("@ProductName", SqlDbType.VarChar, 40 );

  paramPN.Direction = ParameterDirection.Output;

  conn.Open();

  cmd.ExecuteNonQuery();

  ProductName = paramPN.Value.ToString();

  }

  }

  使用存储过程输出参数来检索单个值

  1.

  建立一个 SqlCommand 对象来调用存储过程。

  2.

  通过将 SqlParameters 添加到 SqlCommand 的 Parameters 集合中,设置任何输入参数和单个输出参数。

  3.

  打开连接。

  4.

  调用 SqlCommand 对象的 ExecuteNonQuery 方法。

  5.

  关闭连接。

  6.

  通过使用输出 SqlParameter 的 Value 属性来检索输出值。

  上述代码使用了以下存储过程。

  CREATE PROCEDURE LookupProductNameSPOutput

  @ProductID int,

  @ProductName nvarchar(40) OUTPUT

  AS

  SELECT @ProductName = ProductName

  FROM Products

  WHERE ProductID = @ProductID

  GO

  以下代码阐明了如何使用返回值来指明是否存在特定行。从编码角度来看,这类似于使用存储过程输出参数,不同之处在于必须将 SqlParameter 方向显式设置为 ParameterDirection.ReturnValue。

  bool CheckProduct( int ProductID )

  {

  using( SqlConnection conn = new SqlConnection(

  "server=(local);Integrated Security=SSPI;database=northwind") )

  {

  SqlCommand cmd = new SqlCommand("CheckProductSP", conn );

  cmd.CommandType = CommandType.StoredProcedure;

  cmd.Parameters.Add("@ProductID", ProductID );

  SqlParameter paramRet =

  cmd.Parameters.Add("@ProductExists", SqlDbType.Int );

  paramRet.Direction = ParameterDirection.ReturnValue;

  conn.Open();

  cmd.ExecuteNonQuery();

  }

  return (int)paramRet.Value == 1;

  }

  通过使用存储过程返回值来检查是否存在特定行

  1.

  建立一个 SqlCommand 对象来调用存储过程。

  2.

  设置一个输入参数,该参数含有要访问的行的主键值。

  3.

  设置单个返回值参数。将一个 SqlParameter 对象添加到 SqlCommand 的 Parameters 集合中,并将其方向设置为 ParameterDirection.ReturnValue。

  4.

  打开连接。

  5.

  调用 SqlCommand 对象的 ExecuteNonQuery 方法。

  6.

  关闭连接。

  7.

  通过使用返回值 SqlParameter 的 Value 属性来检索返回值。

  上述代码使用了以下存储过程。

  CREATE PROCEDURE CheckProductSP

  @ProductID int

  AS

  IF EXISTS( SELECT ProductID

  FROM Products

  WHERE ProductID = @ProductID )

  return 1

  ELSE

  return 0

  GO

  如何使用 SqlDataReader 来检索单个项

  可以使用 SqlDataReader 对象并通过调用命令对象的 ExecuteReader 方法来获取单个输出值。这要求编写稍微多一点的代码,因为必须调用 SqlDataReader Read 方法,然后通过该读取器的访问器方法之一来检索需要的值。以下代码阐明了 SqlDataReader 对象的用法。

意见反馈
发表评论

最新评论(共0条)