0

我有以下代码:

try
{
    connection.Open();     

    da.Fill(ds);
    DataRow item = ds.Tables[0].Rows[0];
    byte[] item1 = (byte[])item["FileImage"];
    ds.Tables.Clear();
    numArray = item1;   
}
catch (Exception ex)
{
    throw ex;
}
finally
{
    connection.Close();
}
return numArray;
}

我的代码通过将 GridView 中的 ID 传递到 SQL 语句中来工作,以便找到与存储在表中的 ID 关联的相应 FileImage。我最近注意到,如果我手动输入了错误的 ID,网站会崩溃并抛出异常“位置 0 处没有行”,我发现这基本上意味着没有数据要获取(显然是因为我输入了假 ID)。

我的问题是如何处理这个错误?我以前从未真正考虑过错误处理,但我想从我读到的内容中我会做一些诸如 if 语句之类的事情?基本上,如果没有异常,则继续,但如果有异常,则可能会将我页面上的 TextBox 的文本更改为一条错误消息,告诉用户“警告!身份证无效”?

谢谢你的帮助!

4

6 回答 6

3

您可能在这里遇到错误:

DataRow item = ds.Tables[0].Rows[0];

因为该索引处没有行,因此表中根本没有行。

您只需要检查该Count属性:

if(ds.Tables[0].Rows.Count > 0)
{

}

如果没有返回行,则表也是空的。该Tables物业也有Count物业。

if(ds.Tables.Count > 0)
{

}
于 2013-10-31T15:27:31.020 回答
1

您需要在检索数据之前验证是否有数据。

代替:

DataRow item = ds.Tables[0].Rows[0];
byte[] item1 = (byte[])row["FileImage"];

byte[] item1 = null;
if (ds.Tables.Count > 0)
{
   var table = ds.Tables[0];
   if (table.Rows.Count > 0)
   { 
      var row = table.Rows[0];
      if (row.Columns.Contains("FileImage")) 
      {
         item1 = (byte[])row["FileImage"];
      }
   }
}
if (item1 == null) 
{
    //handle error
}
于 2013-10-31T15:29:56.170 回答
0

您不必在 catch 块中抛出异常(从我在您发布的代码中看到的)。

您可以像这样简单地显示出现问题的消息:

try
        {
            connection.Open();



            da.Fill(ds);
            DataRow item = ds.Tables[0].Rows[0];
            byte[] item1 = (byte[])item["FileImage"];
            ds.Tables.Clear();
            numArray = item1;


        }
        catch (Exception ex)
        {
            MessageBox.Show("My error description");
// or write the message to a textBox.
        }
        finally
        {
            connection.Close();
        }
        return numArray;
    }
于 2013-10-31T15:27:35.300 回答
0

你可以做

    try
    {
       // your code....           

    }
    catch (Exception ex)
    {
        MessageBox.Show("My method failed, see inner excpetion",ex);
    }
    finally
    {
        connection.Close();
    }
    return numArray;
}
于 2013-10-31T15:28:00.730 回答
0

您需要查看是否.Rows包含元素。

if (ds.Tables[0].Rows.Any())
{
   // Has rows.
}
于 2013-10-31T15:28:31.117 回答
-1

您应该检查是否有行可以使用。像这样的东西:

try
    {
        connection.Open();



        da.Fill(ds);
        if (ds.Tables[0].Rows.Count > 0)
        {
           DataRow item = ds.Tables[0].Rows[0];
           byte[] item1 = (byte[])item["FileImage"];
           ds.Tables.Clear();
           numArray = item1;
        }

    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        connection.Close();
    }
    return numArray;
}
于 2013-10-31T15:30:16.373 回答