我有一个像这样的功能
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;
造成例外
格式不正确
有没有办法解决这个问题并检查数据表是否为空
答案 0 :(得分:4)
尝试
'select NVL(MAX(CUT_ID), 0) from CUTORDER_MASTER'
如果表中没有数据,此查询将返回0
。我不太擅长甲骨文,但经过快速研究后,我认为这将有效
答案 1 :(得分:3)
使用ExecuteReader()
方法代替ExecuteScalar()
,并将结果存储在变量中。然后使用此变量进行null检查。您正在检查数据表实例。实际上您不需要在此方案中使用数据表。
如果要检查数据表,请使用datatable.rows.count() method
检查数据表中填充的行数。
答案 2 :(得分: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;
}
}
}
还有更多。
答案 3 :(得分:1)
select count(*) from CUTORDER_MASTER
如果表中没有数据,这也将返回0;)
答案 4 :(得分: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
返回查询返回的结果集中第一行的第一列