gpt4 book ai didi

c# - 如何(有效地)将 SqlDataReader 字段转换(强制转换?)为其相应的 c# 类型?

转载 作者:IT王子 更新时间:2023-10-29 04:13:54 25 4
gpt4 key购买 nike

首先,让我解释一下目前的情况:我正在从数据库中读取记录并将它们放入一个对象中以备后用;今天出现了一个关于数据库类型到 C# 类型转换(转换?)的问题。

让我们看一个例子:

namespace Test
{
using System;
using System.Data;
using System.Data.SqlClient;

public enum MyEnum
{
FirstValue = 1,
SecondValue = 2
}

public class MyObject
{
private String field_a;
private Byte field_b;
private MyEnum field_c;

public MyObject(Int32 object_id)
{
using (SqlConnection connection = new SqlConnection("connection_string"))
{
connection.Open();

using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "sql_query";

using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow))
{
reader.Read();

this.field_a = reader["field_a"];
this.field_b = reader["field_b"];
this.field_c = reader["field_c"];
}
}
}
}
}
}

这(显然)失败了,因为三个 this.field_x = reader["field_x"]; 调用抛出 Cannot implicitly convert type 'object' to 'xxx'。存在显式转换(是否缺少强制转换?)。 编译器错误。

要纠正这个问题,我目前知道两种方法(让我们使用 field_b 示例):第一个是 this.field_b = (Byte) reader["field_b"]; 第二个是 this.field_b = Convert.ToByte(reader["field_b"]);

第一个选项的问题是 DBNull 字段在转换失败时抛出异常(即使可空类型为 String),第二个问题是它不保留空值(Convert.ToString(DBNull) 产生一个 String.Empty),我也不能将它们与枚举一起使用。

因此,在互联网和 StackOverflow 上进行了几次查找之后,我想到的是:

public static class Utilities
{
public static T FromDatabase<T>(Object value) where T: IConvertible
{
if (typeof(T).IsEnum == false)
{
if (value == null || Convert.IsDBNull(value) == true)
{
return default(T);
}
else
{
return (T) Convert.ChangeType(value, typeof(T));
}
}
else
{
if (Enum.IsDefined(typeof(T), value) == false)
{
throw new ArgumentOutOfRangeException();
}

return (T) Enum.ToObject(typeof(T), value);
}
}
}

这样我应该处理每一个案例。

问题是:我错过了什么吗?我是否在做袋熊(浪费金钱、脑力和时间),因为有一种更快、更清洁的方法来做到这一点?都对吗?利润?

最佳答案

如果字段允许空值,请不要使用常规原始类型。使用 C# nullable typeas keyword .

int? field_a = reader["field_a"] as int?;
string field_b = reader["field_a"] as string;

向任何不可为空的 C# 类型添加 ? 使其成为“可空的”。使用 as 关键字将尝试将对象转换为指定类型。如果转换失败(就像类型为 DBNull 时那样),则运算符返回 null

注意使用as的另一个小好处是它是slightly faster比普通类型转换。由于它也可能有一些缺点,例如如果您尝试转换为错误的类型,则更难跟踪错误,因此不应将其视为始终使用 as 而不是传统转换的原因。常规类型转换已经是一种相当便宜的操作。

关于c# - 如何(有效地)将 SqlDataReader 字段转换(强制转换?)为其相应的 c# 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2141575/

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