Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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# 使用字符串转换防止空失败的最佳方法_C#_Sql_String_Parsing_Null - Fatal编程技术网

C# 使用字符串转换防止空失败的最佳方法

C# 使用字符串转换防止空失败的最佳方法,c#,sql,string,parsing,null,C#,Sql,String,Parsing,Null,我正在尝试处理调用ToString的对象为NULL的可能性。 我将把上面的语句与几个变量一起使用,我不想对每个变量进行单独的尝试/捕获。。。对字符串执行空检查的最佳方法是什么 其他数据类型我一直在这样做: _callReportCode = reader["Call Report Code"].ToString(); 在这段代码中,“reader”指的是SqlDataReader,但这对这个问题并不重要。您可以使用String.IsNullOrEmpty()执行检查,以确保它不会为null,或

我正在尝试处理调用ToString的对象为NULL的可能性。 我将把上面的语句与几个变量一起使用,我不想对每个变量进行单独的尝试/捕获。。。对字符串执行空检查的最佳方法是什么

其他数据类型我一直在这样做:

_callReportCode = reader["Call Report Code"].ToString();

在这段代码中,“reader”指的是SqlDataReader,但这对这个问题并不重要。

您可以使用
String.IsNullOrEmpty()
执行检查,以确保它不会为null,或者,您可以编写一个扩展方法来执行某些操作(如果不为null),如果为null,则执行另一个/无操作。

使用:
??

int.TryParse(reader["Account Number"].ToString(), out _accountNumber);

如果字段中的数据是
DBNull.Value
(而不是
null
),这仍然有效,因为
DBNull.Value
不是
null
,所以
将不被使用,
DBNull.Value.ToString()
,这是您想要的。

\u callReportCode=Convert.ToString(阅读器)[“调用报告代码”])应确保不存在空值。

您可以创建一个方法,以便在进行检查时调用该方法。 这样,您只需键入一次try-catch。。。
或者您可以为string类创建一个扩展方法来执行此操作

如果您的字符串可为null,则需要对照
DBNull.value检查从
SqlDataReader
返回的值

callReportCode = (reader["Call Report Code"] ?? "").ToString();
如果
读卡器[“调用报告代码”]
返回的对象不是
字符串
,它是
DBNull.Value
,因此
as
强制转换也将
\u callReportCode
的值设置为
null

如果在缺少数据库值的情况下必须将字符串设置为非null,请添加
??
,如下所示:

_callReportCode = reader["Call Report Code"] as string;

使用以下代码行:

_callReportCode = (reader["Call Report Code"] as string) ?? string.Empty;
而不是以下行:

如果值为空,它将返回
string.Empty

资料来源:

更新:我刚刚验证过,它也适用于
DBNull

更新2:我决定在这里带来一个更完整的测试,以确保:

_callReportCode = reader["Call Report Code"].ToString();

我的建议是,当数据不是字符串时,千万不要将
转换为字符串,如果数据已经是字符串,那么调用
ToString
是多余的,只需要一个强制转换

我假设数据库中的数据类型是整数,在这种情况下,可以使用可为null的int

Convert.ToString(reader["Call Report Code"]);
我已经做了一个扩展方法来做这件事

DBNull dbNull = null;
DBNull dbNullEmpty = DBNull.Value;
string stringNull = null;
string stringEmpty = string.Empty;

var outcome1 = Convert.ToString(dbNull);//Empty string
var outcome2 = Convert.ToString(dbNullEmpty);//Empty string
var outcome3 = Convert.ToString(stringNull);//NULL
var outcome4 = Convert.ToString(stringEmpty);//Empty string
公共静态类SqlDataReaderExtensions
{
公共静态T字段(此SqlDataReader,字符串列名)
{
object obj=读卡器[columnName];
if(obj==null)
{
抛出新的IndexOutOfRangeException(
字符串格式(
“读取器不包含列:{0}”,
列名
)
);
}
if(obj为DBNull)
{
obj=null;
}
返回(T)obj;
}
}
用法

int?accountType=reader.Field(“账号”);//将返回NULL或账号。

我找到的最简单的方法是

public static class SqlDataReaderExtensions
{
    public static T Field<T>(this SqlDataReader reader, string columnName)
    {
        object obj = reader[columnName];

        if (obj == null)
        {
            throw new IndexOutOfRangeException(
                string.Format(
                    "reader does not contain column: {0}",
                    columnName
                )
            );
        }

        if (obj is DBNull)
        {
            obj = null;
        }

        return (T)obj;
    }
}

我有一些最简单和常用的方法

int? accountType = reader.Field<int?>("Account Number"); // will return NULL or the account number.
在C中使用#


我喜欢使用和的组合:

基本上和这个一样

string item = null;
string value = item.ToNULLString();

但是更短。

Try/Catch不是合适的机制,如果你想单独测试-在调用
.ToString()
之前,你应该检查
reader['blah']
是否为
Null
。异常永远不应该是你正常执行流程的一部分,它们很昂贵,而且不是设计用来这样使用的(如如果你不仔细思考,很容易抓住错误的东西)不相关,但我很好奇什么帐号应该是整数。尽管我同意投票最多的答案,但我相信你应该编写一个扩展方法,以便在任何地方重用你的代码。我真的不喜欢重复使用代码。如果数据是
DBNull
,你就不能使用null合并运算符。@Matthew-当然可以。
DBNull.Value.ToString()
返回
(DBNull.Value??).ToString()
甚至不编译如果读取器为该列名返回null,则表示该列本身不存在,如果返回DBNull,则表示数据库返回null值。这是两个截然不同的问题,一个是应用程序问题(您请求的列不存在),另一个不是(列值可以为null)[DBNull])。不必道歉,我是犯了这个错误的人。您以后会如何处理该值?比如,如果我要将其传递给构造函数?我是否必须将该构造函数更改为可为null的int?这取决于您的应用程序,当
账号
为null时,对您的应用程序意味着什么?它仍然会引发异常w当我尝试这个…\u callReportCode=Convert.ToString(reader[“Call Report Code”]),关键是要把它放进去variable@John您可以共享异常的详细信息吗?它似乎不像msdn所说的那样工作,可以通过Convert.ToString(null).EndsWith(“”)检查;vs-string.empty.EndsWith(“”);stmt Convert.ToString(null).EndsWith(“”)“)将抛出对象引用异常。@AnilKumar是的,但这是意料之中的。
Convert.ToString(null)
返回null,然后您尝试从中调用方法
.EndsWith(”)
。它不会返回字符串。如果值为null,则返回null。请简要解释您的答案。
int? accountType = reader.Field<int?>("Account Number"); // will return NULL or the account number.
_callReportCode = reader["Call Report Code"] + "";
 public static string ToNULLString(this string Values)
        {
            if (string.IsNullOrEmpty(Values))
            {
                return "";
            }
            else
            {
                return Values.ToString();
            }
        }
string item = null;
string value = item.ToNULLString();
string nn = MyObject.myNullableVar?.ToString() ?? "";
string ss = (MyObject.MyNullableVar == null) ? "" : MyObject.MyNullableVar.ToString();