gpt4 book ai didi

c# - InvalidCastException 长到 ulong

转载 作者:太空狗 更新时间:2023-10-29 21:18:38 25 4
gpt4 key购买 nike

我有以下方法:

public static T ExecuteScalar<T>(
string query,
SqlConnection connection,
params SqlParameter[] parameters) where T : new()
{
// Create SqlCommand
SqlCommand command = CreateCommand(query, connection, parameters);

// Execute command using ExecuteScalar
object result = command.ExecuteScalar();

// Return value as expected type
if (result == null || result is DBNull) return default(T);
return (T)result;
}

我想将数据库的 MIN_ACTIVE_ROWVERSION 作为 ulong。奇怪的是..下面的第一个方法调用会产生错误,但第二个方法调用可以正常工作。

方法调用 1 生成错误:

ulong minActiveRowversion = 
SqlUtils.ExecuteScalar<ulong>(
"SELECT CAST(MIN_ACTIVE_ROWVERSION() AS BIGINT)"
, _connectionString);

错误:

System.InvalidCastException: Specified cast is not valid.

方法调用 2 工作正常:

ulong minActiveRowversion = 
(ulong)SqlUtils.ExecuteScalar<long>(
"SELECT CAST(MIN_ACTIVE_ROWVERSION() AS BIGINT)"
, _connectionString);

我不明白这怎么可能,因为 command.ExecuteScalar() 方法的结果是这样的:

object result       | 1955612
result.GetType() | {Name = "Int64" FullName = "System.Int64"}
  1. 有人能告诉我为什么第一种情况不可能而第二种情况可行吗?
  2. 有人可以告诉我如何解决它以便我可以使用方案 1。

最佳答案

为什么

您只能将值类型拆箱为其原始类型。在你的情况下, Actor 首先需要去 long来自 object然后然后ulong .

有关详细信息,请参阅此问题:

Why can't I unbox an int as a decimal?

它还链接了一个 blog post埃里克·利珀特 (Eric Lippert)。

如何

如您所知,一种方法是在转换为 T 之前转换为原始类型。 - 当然,除非原始类型 T .

如评论中所述,另一种方法是使用转换例程 ( Convert.ToUInt64 ) 而不是显式转换。

这可以通过使用 Func<object, T> 来实现:

public static T ExecuteScalar<T>(
Func<object, T> conversionFunctor,
string query,
SqlConnection connection,
params SqlParameter[] parameters) where T : new()
{
// Create SqlCommand
SqlCommand command = CreateCommand(query, connection, parameters);

// Execute command using ExecuteScalar
object result = command.ExecuteScalar();

// Return value as expected type
if (result == null || result is DBNull)
return default(T);

return conversionFunctor(result);
}

打电话:

ulong minActiveRowversion = 
SqlUtils.ExecuteScalar<ulong>(
Convert.ToUInt64,
"SELECT CAST(MIN_ACTIVE_ROWVERSION() AS BIGINT)"
, _connectionString);

关于c# - InvalidCastException 长到 ulong,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11226448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com