zoukankan      html  css  js  c++  java
  • 发现 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;
      }
     }
    */

  • 相关阅读:
    【C语言天天练(三)】typedef具体解释
    操作系统之基本分页存储管理方式
    线索二叉树创建及删除
    SVN:This client is too old to work with working copy…解决的方法
    android4.2 telephone应用层分析
    JPA学习笔记(3)——JPA注解
    Android研发中对String的思考(源代码分析)
    《Effective Modern C++》翻译--条款2: 理解auto自己主动类型推导
    “2014年CityEngine三维建模与设计精英培训班”——全国巡回举办
    Git命令总结
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/2485743.html
Copyright © 2011-2022 走看看