1

我有这样的功能

con.Open();
int k = 1;
OleDbCommand cmd1 = new OleDbCommand("select MAX (CUT_ID) from CUTORDER_MASTER ", con);
OleDbDataReader rdr = cmd1.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(rdr);
if (dt != null)
{
    if (int.Parse(dt.Rows[0][0].ToString()) != 0)
    {
        k = int.Parse(dt.Rows[0][0].ToString()) + 1;
    }

}

我的问题是,如果查询没有检索到任何值,则数据表将返回一个没有任何值的单元格 max(cutid)。因此它跳过空检查,如果 O 检查和代码达到 k = int.Parse(dt.Rows[0][0].ToString()) + 1;
导致异常格式不正确

有没有办法解决这个问题并检查数据表是否为空

4

5 回答 5

4

尝试

'select NVL(MAX(CUT_ID), 0) from CUTORDER_MASTER'

0如果表中没有数据,则此查询将返回。我不太擅长甲骨文,但经过快速研究,我认为这会奏效

于 2013-08-15T06:42:22.360 回答
3

代替ExecuteReader(),使用ExecuteScalar()方法并将结果存储在变量中。然后用这个变量做空检查。您正在检查数据表实例。实际上,在这种情况下您不需要使用数据表。

如果要检查数据表,请datatable.rows.count() method用于检查数据表中填充了多少行。

于 2013-08-15T06:52:04.313 回答
2

首先我的问题是:为什么要使用数据表来检索单个值。如果您不熟悉ExecuteScalar然后阅读有关此内容的信息,它将在将来对您有所帮助。好的,现在来到您使用的场景:

有很多方法可以做到这一点:

如果您希望结果将包含0而不是空值:

1)您可以从数据库中获取它,如下所示:

select IsNull(MAX(CUT_ID), 0) from CUTORDER_MASTER

2)使用代码:

if (dt != null)
{
    if (int.Parse(dt.Rows[0][0].ToString()) != null && 
        int.Parse(dt.Rows[0][0].ToString()) != "")
    {
        k = int.Parse(dt.Rows[0][0].ToString()) + 1;
    }
}

3)使用代码:

if (dt != null)
{
    if(dt.Rows.Count > 0)
    {
        if (int.Parse(dt.Rows[0][0].ToString()) != null && 
            int.Parse(dt.Rows[0][0].ToString()) != "")
        {
            k = int.Parse(dt.Rows[0][0].ToString()) + 1;
        }
    }
}

还有很多。

于 2013-08-15T06:59:38.687 回答
1
select count(*) from CUTORDER_MASTER    

如果表中没有数据,这也将返回 0 ;)

于 2013-08-15T06:44:55.667 回答
1

试试下面

OleDbCommand cmd1 = new OleDbCommand("select MAX (CUT_ID) from CUTORDER_MASTER ", con);
object result = = cmd1.ExecuteScalar();
int k = (result == null || result == DBNull.Value) ? 0: (int)result;

ExecuteScalar返回查询返回的结果集中第一行的第一列

于 2013-08-15T07:08:44.313 回答