Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DBNull替换为null_C#_Sql_Sql Server_Dbnull - Fatal编程技术网

C# 将DBNull替换为null

C# 将DBNull替换为null,c#,sql,sql-server,dbnull,C#,Sql,Sql Server,Dbnull,我目前正在从事一个使用MS SQL Server的C#WPF项目 由于使用DBNull值有点烦人,我想知道是否有可能以某种方式将这些值转换为常规的c#null值 我编写了一个小包装器来连接数据库,执行SELECT语句并将结果作为DataTable返回: public static DataTable getResultTable(string select, params DbParameter[] parameters) { using (OleDbConnection connect

我目前正在从事一个使用MS SQL Server的C#WPF项目

由于使用DBNull值有点烦人,我想知道是否有可能以某种方式将这些值转换为常规的c#null值

我编写了一个小包装器来连接数据库,执行SELECT语句并将结果作为DataTable返回:

public static DataTable getResultTable(string select, params DbParameter[] parameters) {
    using (OleDbConnection connection = new OleDbConnection(_connectionString)) {
        connection.Open();
        try {
            using (OleDbCommand cmd = new OleDbCommand(select, connection)) {
                for (int i = 0; i < parameters.Length; i++) {
                    cmd.Parameters.Add("?", parameters[i].type).Value = parameters[i].value;
                }
                using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd)) {
                    using (DataTable dt = new DataTable()) {
                        adapter.Fill(dt);

                        //Here my DataTable dt is filled with the required data
                        //I´d like to replace all DBNull Values with regular null values now

                        return dt;
                    }
                }
            }
        } finally {
            connection.Close();
        }
    }
}
公共静态数据表getResultTable(字符串选择,参数DbParameter[]参数){ 使用(OLEDB连接=新OLEDB连接(_connectionString)){ connection.Open(); 试一试{ 使用(OleDbCommand cmd=新OleDbCommand(选择,连接)){ 对于(int i=0;i 我当然可以在DataTable的每个字段上循环,并在DBNull的情况下替换该值,但我想知道是否有更好的方法

编辑:

对于任何遇到这个问题的人。使用@Sergiu Muresan的答案,我创建了两种完全符合我需要的扩展方法:

public static class ExtensionMethods {
    public static T? GetValue<T>(this DataRow row, string columnName) where T : struct {
        if (row[columnName] is T)
            return (T)row[columnName];
        return null;
    }

    public static T GetValue<T>(this DataRow row, string columnName, T defaultValue) {
        return (row[columnName] is T) ? (T)row[columnName] : defaultValue;
    }
}
公共静态类扩展方法{
公共静态T?GetValue(此DataRow行,字符串columnName),其中T:struct{
如果(行[columnName]为T)
返回(T)行[列名称];
返回null;
}
公共静态T GetValue(此DataRow行、字符串columnName、T defaultValue){
返回(行[columnName]为T)?(T)行[columnName]:默认值;
}
}
  • 第一种方法仅将T参数限制为
    struct
    ,这 这意味着您在这里只能使用值类型(int、bool、double等),但是 没有对象类型(字符串、自定义对象等)

    然后它将返回给定类型的
    Nullable
    版本(例如
    int?
    对于
    int
    ),如果值为
    DBNull
    ,则将为
    null

  • 第二种方法可用于值类型和对象类型。 这里您还必须给出一个默认值,该值将被返回
    当vlaue为
    DBNull
    时。 此方法还可用于将
    DBNull
    更改为
    null
    ,但仅适用于对象类型,因为这些类型始终可以设置为
    null
    ,并且 不需要特殊的
    可为空的

扩展方法使您能够向现有类型添加方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但它们被调用时就好像它们是扩展类型上的实例方法一样

public static class ExtensionMethods
{
    public static T GetValue<T>(this DataRow row, string columnName, T defaultValue = default(T))
    {
        var obj = row[columnName];

        // if obj is DbNull it will skip this and return the default value
        if (obj is T)
        {
            return (T)obj;
        }

        return defaultValue;
    }
}
公共静态类扩展方法
{
公共静态T GetValue(此DataRow行,字符串columnName,T defaultValue=default(T))
{
var obj=行[列名称];
//如果obj为DbNull,它将跳过此操作并返回默认值
if(obj是T)
{
返回(T)obj;
}
返回默认值;
}
}
你可以这样使用它

var dt = getResultTable(...);

var value1 = dt.Rows[0].GetValue<int>("ColumnName");

var value2 = dt.Rows[0].GetValue<int>("ColumnName", 10); // you can also specify a different default value if needed
var dt=getresultable(…);
var value1=dt.Rows[0].GetValue(“ColumnName”);
var value2=dt.Rows[0]。GetValue(“ColumnName”,10);//如果需要,还可以指定不同的默认值

扩展方法使您能够向现有类型添加方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但它们被调用时就好像它们是扩展类型上的实例方法一样

public static class ExtensionMethods
{
    public static T GetValue<T>(this DataRow row, string columnName, T defaultValue = default(T))
    {
        var obj = row[columnName];

        // if obj is DbNull it will skip this and return the default value
        if (obj is T)
        {
            return (T)obj;
        }

        return defaultValue;
    }
}
公共静态类扩展方法
{
公共静态T GetValue(此DataRow行,字符串columnName,T defaultValue=default(T))
{
var obj=行[列名称];
//如果obj为DbNull,它将跳过此操作并返回默认值
if(obj是T)
{
返回(T)obj;
}
返回默认值;
}
}
你可以这样使用它

var dt = getResultTable(...);

var value1 = dt.Rows[0].GetValue<int>("ColumnName");

var value2 = dt.Rows[0].GetValue<int>("ColumnName", 10); // you can also specify a different default value if needed
var dt=getresultable(…);
var value1=dt.Rows[0].GetValue(“ColumnName”);
var value2=dt.Rows[0]。GetValue(“ColumnName”,10);//如果需要,还可以指定不同的默认值

您真的需要更换吗?更好的方法是不替换。@jdweng不,我不需要替换,但是使用null更舒服,因为你可以使用像
这样的操作符。你为什么要替换它?只需使用
DBNull
而不是
您会使用
==DBNull吗?null:value
我很好奇为什么要使用OleDb与SQL Server对话,而不是System.Data.SqlClient;后者更为有效。考虑迁移到更现代的数据访问机制(如Dappor或实体框架)。如果您不再使用直接的System.Data,那么DbNull问题将基本上消失。另外,由于您使用的是
连接,因此不需要try/finally/close-使用
Dispose
调用将关闭连接。您真的需要替换吗?更好的方法是不替换。@jdweng不,我不需要替换,但是使用null更舒服,因为你可以使用像
这样的操作符。你为什么要替换它?只需使用
DBNull
而不是
您会使用
==DBNull吗?null:value
我很好奇为什么要使用OleDb与SQL Server对话,而不是System.Data.SqlClient;拉特