银河

SKYIV STUDIO

  博客园 :: 首页 :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::

我用 C# 编写的一个 WinForm 程序,在业务部门的机器上运行出现“SqlDbType 枚举值 31 无效”错误,如下图所示:

 

而这个程序在我自己的机器上运行很正常:

 

于是我就到业务部门的机器上打开该程序的 debug 模式(在程序命令行后跟 /debug 参数,下面这个屏幕截图是在我自己的机器上截取的):

 

再次运行这个程序,得到更详细的错误信息:

 

可以看出,是 Skyiv.Ben.Icbc.Mis.Mgr.Data 命名空间中的 AccBalance 类的 GetValues 方法在调用 System.Data.SqlClient 命名空间中的 SqlParameter 类的构造函数时出错了。AccBalance 类的 GetValues 方法如下所示:

namespace Skyiv.Ben.Icbc.Mis.Mgr.Data
{
  sealed class AccBalance : DbObject
  {
    public AccBalance(string newConnectionString) : base(newConnectionString) { }

    public SqlDataReader GetValues(DateTime dateBegin, DateTime dateEnd)
    {
      SqlParameter[] p = 
      {
        new SqlParameter("@DateBegin", SqlDbType.Date),
        new SqlParameter("@DateEnd", SqlDbType.Date)
      };
      p[0].Value = dateBegin;
      p[1].Value = dateEnd;
      return RunReader("prMgr_GetAccBalanceByDateRange", p);
    }
  }
}

 

看来 SqlDbType.Date 枚举值就是 31 了。我们写个程序来验证一下:

using System;
using System.Data;

namespace Skyiv.Tester
{
  sealed class SqlDbTypeTester
  {
    static void Main()
    {
      try
      {
        Console.WriteLine(" OS Version: " + Environment.OSVersion);
        Console.WriteLine("CLR Version: " + Environment.Version);
        Console.WriteLine();
        ListEnumMembers(typeof(SqlDbType));
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex);
      }  
    }
    
    static void ListEnumMembers(Type type)
    {
      Console.WriteLine("{0} Members:", type);
      foreach (var value in Enum.GetValues(type))
        Console.WriteLine("{0,3} {1}", (int)value, value);
    }
  }
}

 

在我自己的机器上编译和运行:

E:\CS\HZB\SqlDbType> csc SqlDbTypeTester.cs
适用于 Microsoft(R) .NET Framework 3.5 版的 Microsoft(R) Visual C# 2008 编译器 3.5.21022.8 版
版权所有 (C) Microsoft Corporation。保留所有权利

E:\CS\HZB\SqlDbType> SqlDbTypeTester
 OS Version: Microsoft Windows NT 5.1.2600 Service Pack 3
CLR Version: 2.0.50727.1882

System.Data.SqlDbType Members:
  0 BigInt
  1 Binary
  2 Bit
  3 Char
  4 DateTime
  5 Decimal
  6 Float
  7 Image
  8 Int
  9 Money
 10 NChar
 11 NText
 12 NVarChar
 13 Real
 14 UniqueIdentifier
 15 SmallDateTime
 16 SmallInt
 17 SmallMoney
 18 Text
 19 Timestamp
 20 TinyInt
 21 VarBinary
 22 VarChar
 23 Variant
 25 Xml
 29 Udt
 30 Structured
 31 Date
 32 Time
 33 DateTime2
 34 DateTimeOffset

E:\CS\HZB\SqlDbType>

果然如此。然后再把这个 SqlDbTypeTester.exe 程序拷贝到业务部门的机器运行一下:

D:\SqlDbType> SqlDbTypeTester
 OS Version: Microsoft Windows NT 5.1.2600 Service Pack 3
CLR Version: 2.0.50727.832

System.Data.SqlDbType Members:
  0 BigInt
  1 Binary
  2 Bit
  3 Char
  4 DateTime
  5 Decimal
  6 Float
  7 Image
  8 Int
  9 Money
 10 NChar
 11 NText
 12 NVarChar
 13 Real
 14 UniqueIdentifier
 15 SmallDateTime
 16 SmallInt
 17 SmallMoney
 18 Text
 19 Timestamp
 20 TinyInt
 21 VarBinary
 22 VarChar
 23 Variant
 25 Xml
 29 Udt

E:\CS\HZB\SqlDbType>

咦,枚举值为 31 的 SqlDbType.Date 不见了。难怪业务部门机器上运行上述 WinForm 程序时会出现“SqlDbType 枚举值 31 无效”错误。我的机器上的 CLR 版本是 2.0.50727.1882,而业务部门机器上的 CLR 版本是 2.0.50727.832,也就是 2.0 RTM 版本。看来这个错误是 .NET CLR 版本太低造成的。在业务部门的机器上安装 .NET Framework 2.0 SP2 后就解决了这个问题。请参见“Microsoft .NET Framework 的版本”。

 

在 Ubuntu 10.10 操作系统的 mono 2.6.7 环境下编译和运行:

ben@ben-m4000t:~/work/SqlDbType$ gmcs --version
Mono C# compiler version 2.6.7.0
ben@ben-m4000t:~/work/SqlDbType$ gmcs SqlDbTypeTester.cs -r:System.Data.dll
ben@ben-m4000t:~/work/SqlDbType$ ./SqlDbTypeTester.exe
 OS Version: Unix 2.6.35.24
CLR Version: 2.0.50727.1433

System.Data.SqlDbType Members:
  0 BigInt
  1 Binary
  2 Bit
  3 Char
  4 DateTime
  5 Decimal
  6 Float
  7 Image
  8 Int
  9 Money
 10 NChar
 11 NText
 12 NVarChar
 13 Real
 14 UniqueIdentifier
 15 SmallDateTime
 16 SmallInt
 17 SmallMoney
 18 Text
 19 Timestamp
 20 TinyInt
 21 VarBinary
 22 VarChar
 23 Variant
 25 Xml
 29 Udt
 31 Date
 32 Time
ben@ben-m4000t:~/work/SqlDbType$ 

 

在 Ubuntu 10.10 操作系统的 mono 2.8.1 环境下编译和运行:

ben@ben-m4000t:~/work/SqlDbType$ /opt/mono-2.8.1/bin/dmcs --version
Mono C# compiler version 2.8.1.0
ben@ben-m4000t:~/work/SqlDbType$ /opt/mono-2.8.1/bin/dmcs SqlDbTypeTester.cs -r:System.Data.dll
ben@ben-m4000t:~/work/SqlDbType$ /opt/mono-2.8.1/bin/mono SqlDbTypeTester.exe
 OS Version: Unix 2.6.35.24
CLR Version: 4.0.30319.1

System.Data.SqlDbType Members:
  0 BigInt
  1 Binary
  2 Bit
  3 Char
  4 DateTime
  5 Decimal
  6 Float
  7 Image
  8 Int
  9 Money
 10 NChar
 11 NText
 12 NVarChar
 13 Real
 14 UniqueIdentifier
 15 SmallDateTime
 16 SmallInt
 17 SmallMoney
 18 Text
 19 Timestamp
 20 TinyInt
 21 VarBinary
 22 VarChar
 23 Variant
 25 Xml
 29 Udt
 31 Date
 32 Time
ben@ben-m4000t:~/work/SqlDbType$ 

 

在 Ubuntu 10.10 操作系统的 mono 2.6.7 环境的 CLR 1.1 版本中运行:

ben@ben-m4000t:~/work/SqlDbType$ ./SqlDbTypeTester.exe
WARNING: The runtime version supported by this application is unavailable.
Using default runtime: v1.1.4322
 OS Version: Unix 2.6.35.24
CLR Version: 1.1.4322.2032

System.Data.SqlDbType Members:
  0 BigInt
  1 Binary
  2 Bit
  3 Char
  4 DateTime
  5 Decimal
  6 Float
  7 Image
  8 Int
  9 Money
 10 NChar
 11 NText
 12 NVarChar
 13 Real
 14 UniqueIdentifier
 15 SmallDateTime
 16 SmallInt
 17 SmallMoney
 18 Text
 19 Timestamp
 20 TinyInt
 21 VarBinary
 22 VarChar
 23 Variant
ben@ben-m4000t:~/work/SqlDbType$ 
posted on 2010-12-23 20:45  银河  阅读(2279)  评论(15编辑  收藏  举报