银河

SKYIV STUDIO

  博客园 :: 首页 :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::
  268 随笔 :: 2 文章 :: 2616 评论 :: 140万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

 

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

 

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

 

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

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 了。我们写个程序来验证一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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   银河  阅读(2283)  评论(15编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2009-12-23 也谈在 .NET 平台上使用 Scala 语言(下)
点击右上角即可分享
微信分享提示