发现 SqlHelper v3.1 的一个关于 InputOutput 参数的 Bug? v2.1 老版没错!

/*
发现 SqlHelper v3.1 的一个关于 InputOutput 参数的 Bug? v2.1 老版没错!
Data Access Application Block 3.1
http://www.gotdotnet.com/workspaces/workspace.aspx?id=c20d12b0-af52-402b-9b7c-aaeb21d1f431
--创建如下存储过程
create proc sp_swap
 @x int out
,@y int out
as
--如果声明为 OutPut 的参数,同时用于 Input 的参数,
--SqlHelper v3.1 的 ExecuteXXXX 不能正确得到被 SP 重新赋值的输出参数

set @x = @x + @y
set @y = @x - @y
set @x = @x - @y
select id,@x,@y
from
(
select 1 as id
union all
select 2
union all
select 3
union all
select 4
union all
select 5
) T
*/

using System;
using System.Data;
using System.Xml;
using System.Data.SqlClient;
using System.Collections;
using Microsoft.ApplicationBlocks.Data;

public class Class1
{
 static void Main(string[] args)
 {
  System.Data.SqlClient.SqlConnection sc = new System.Data.SqlClient.SqlConnection("Server=devserver;Database=test;User ID = sa;Password=devdos");
  string spName = "sp_swap";
  SqlParameter [] spa = SqlHelperParameterCache.GetSpParameterSet(sc,spName);
  spa[0].Value = 3;
  //必须显式重新指定 spa[0].Direction 为 ParameterDirection.InputOutput 才可
  //或者修改 SqlHelper 的源程序
  //spa[0].Direction = ParameterDirection.InputOutput;
  spa[1].Value = 5;
  //spa[1].Direction = ParameterDirection.InputOutput;
  DataSet ds = SqlHelper.ExecuteDataset(sc,CommandType.StoredProcedure,spName,spa);
  PrintDataSet(ds);
  System.Console.WriteLine("Parameter X: {0}",spa[0].Value);
  System.Console.WriteLine("Parameter Y: {0}",spa[1].Value);
 }
 static void PrintDataSet(DataSet ds)
 {
  foreach (DataTable dt in ds.Tables)
  {
   System.Console.WriteLine(dt.TableName);
   foreach (DataColumn dc in dt.Columns)
   {
    System.Console.Write(dc.ColumnName + "/t");
   }
   System.Console.WriteLine();
   foreach (DataRow dr in dt.Rows )
   {
    foreach (DataColumn dc in dt.Columns)
    {
     System.Console.Write(dr[dc] + "/t");
    }
    System.Console.WriteLine();
   }
   //System.Console.ReadLine();
   //System.Console.WriteLine("/n===================================================");
  }
 }
}

/*
经调试发现是 GetParameterDirection 的问题,该方法在 namespace GotDotNet.ApplicationBlocks.Data :
SqlServer.cs ,由于该方法只用于 SQL Server 因此改此程序应无大碍

  /// <summary>
  /// Converts the OleDb parameter direction
  /// </summary>
  /// <param name="oledbDirection">The integer parameter direction</param>
  /// <returns>A ParameterDirection</returns>
  private static ParameterDirection GetParameterDirection(short oledbDirection)
  {
   ParameterDirection pd;
   switch (oledbDirection)
   {
    case 1:
     pd = ParameterDirection.Input;
     break;
    case 2: //或者干脆注释掉 case 2 的全部
     pd = ParameterDirection.Output; //是这里的问题
     goto default; //我加的这句话
     //break; //我注释掉的这句话

    case 4:
     pd = ParameterDirection.ReturnValue;
     break;
    default:
     pd = ParameterDirection.InputOutput;
     break;
   }
   return pd;
  }
 }
*/

posted @ 2005-02-04 10:02  于斯人也  阅读(201)  评论(0编辑  收藏  举报