发现 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;
}
}
*/