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

我正在尝试处理我调用 ToString 的对象为 NULL 的可能性。我将使用带有多个变量的上述语句,并且我不想为每个变量进行单独的尝试/捕获……什么是对字符串进行空值检查的最佳方法。

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

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

在此代码中,“阅读器”指的是 SqlDataReader,但这对于这个问题并不重要。

4

11 回答 11

32

使用空合并运算符??

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

如果您的字段中的数据是DBNull.Value(而不是null),这仍然有效,因为DBNull.Valueis not null,所以??不会使用,并且DBNull.Value.ToString()is "",这是您想要的。

于 2013-04-05T13:39:10.357 回答
11
Convert.ToString(reader["Call Report Code"]);

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

来源:http: //msdn.microsoft.com/en-us/library/astxcyeh.aspx

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

更新 2:我决定在这里进行更完整的测试,以确保:

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
于 2013-04-05T13:41:37.053 回答
3

如果您的字符串可以为空,则需要检查从SqlDataReaderagainst返回的值DBNull.Value

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

如果返回的对象reader["Call Report Code"]不是astring它是DBNull.Value,所以as强制转换也将设置 to 的_callReportCodenull

如果您必须将字符串设置为非空值以防数据库值丢失,请添加??,如下所示:

_callReportCode = (reader["Call Report Code"] as string) ?? string.Empty;
于 2013-04-05T13:40:30.660 回答
3

ToString我的建议是当数据不是字符串时永远不要转换,如果数据已经是字符串,那么调用ToString是多余的,只需要一个转换。

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

int? accountNumber = reader["Account Number"] == DBNull.Value ? null : (int?)reader["Account Number"];

我已经做了一个扩展方法来做这件事。

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.
于 2013-04-05T13:42:39.067 回答
1

我发现的最简单的方法是

_callReportCode = reader["Call Report Code"] + "";
于 2014-05-15T07:21:34.473 回答
1

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

 public static string ToNULLString(this string Values)
        {
            if (string.IsNullOrEmpty(Values))
            {
                return "";
            }
            else
            {
                return Values.ToString();
            }
        }

在 C# 中使用

string item = null;
string value = item.ToNULLString();
于 2016-01-22T19:01:41.330 回答
0

_callReportCode = Convert.ToString(reader["Call Report Code"]) 应该确保那里没有空值。

于 2013-04-05T13:39:13.583 回答
0

您可以创建一个在要进行检查时调用的方法。这样,您只需键入一次 try catch ...或者您可以为字符串类创建一个扩展方法来执行此操作

于 2013-04-05T13:39:52.153 回答
0

使用以下代码行:

_callReportCode = String.IsNullorEmpty(reader["Call Report Code"]) ?
                  String.Empty :
                  reader["Call Report Code"].ToString();

而不是以下行:

_callReportCode = reader["Call Report Code"].ToString();
于 2013-04-05T13:40:53.130 回答
0

我喜欢结合使用空合并运算符空条件运算符

string nn = MyObject.myNullableVar?.ToString() ?? "";

和这个基本一样

string ss = (MyObject.MyNullableVar == null) ? "" : MyObject.MyNullableVar.ToString();

但更短。

于 2017-02-06T17:41:32.583 回答
-1

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

于 2013-04-05T13:37:51.397 回答