如何确定DataTable是否为null,而不是初始化

时间:2017-03-31 10:30:22

标签: c# datatable null

我有一个方法可以对DataTable做一些工作,例如

private void MyMethod(DataTable table)
{
    if(table.Rows.Count > 0)
    {
       //  do some work
    }
 }

但是,如果方法从它所服务的应用程序接收到空数据表,我会得到一个未设置为对象实例的' Object引用。错误。

我也试过了。 。

if(table.IsInitialized) { }

if(table != null) {  }

但是我收到了同样的错误消息。

我如何测试是否实例化传入的数据表而不是null?

DataTable来自WinForms应用程序中的数据网格的转换,即

DataTable table = (DataTable)datagridview.DataSource;

因此,如果原始datagridview为空,则会出现问题。

4 个答案:

答案 0 :(得分:4)

你得到"引用未设置为对象的实例"如果您遇到这样的情况会例外:

object someObject = null;
//Throws an exception. You try to call a instance function without specify the instance
someObject.ToString();

因此,无论是表为null还是行返回null。 在C#6.0之前,你必须采取艰难的方式:

if(table != null && table.Rows != null && table.Rows.Count > 0)

我认为计数不是可以为空的整数。如果是的话,你当然也必须检查它是否为空。

至少对于调试而言,您可能希望使用"每行一次操作来编写更详细的代码"规则。 这将帮助您找到确切返回null的操作。而且,无论如何,JiT很可能会在调试运行之外删除临时变量。

//If table is null, exception here
var Row = table.Row;
//If Row is null, Exception here.
var Count = Row.Count;
//Nothing is null. Continue.
if(Count > 0);

使用C#6.0,您可以使用新的Null条件运算符将其写得更短: https://msdn.microsoft.com/en-us/library/dn986595.aspx 但是,它仍然是相同的代码。

答案 1 :(得分:2)

table != null应该有用。

以下是一个例子:

using System;
using System.Data;

public class Program
{
    public static void Main()
    {
        DataTable table = null;

        Test(table);

        table = new DataTable();

        Test(table);
    }

    public static void Test(DataTable table)
    {
        if(table == null)
        {
            Console.WriteLine("table is null");
            return;
        }

        if(table.IsInitialized == false)
        {
            Console.WriteLine("table is not initalised.");
            return;
        }

        Console.WriteLine("table row count: " + table.Rows.Count);
    }
}

输出:

table is null
table row count: 0

https://dotnetfiddle.net/0s2Jp8

答案 2 :(得分:0)

  

如何测试是否实例化传入的数据表   请问?

从技术上讲,这应该有效,如果下面的代码没有检测到table是否被实例化,那么除了手头的问题之外还有另一个问题。

if(table != null && table.Rows != null && table.Rows.Count > 0)

答案 3 :(得分:0)

我知道这是一个已有两年历史的问题,但是现在在C#中有一种简单的方法可以解决此问题,如下所示:

if ((dataTableName?.Rows?.Count ?? 0) > 0)