【问题标题】:No row at position 0 Error Handing位置 0 处没有行错误处理
【发布时间】:2013-10-31 15:22:34
【问题描述】:

我有以下代码:

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 的文本更改为错误消息,告诉用户“警告! ID 无效?

感谢您的帮助!

【问题讨论】:

  • 旁注:将try/catch/finally 替换为using 块。 (msdn.microsoft.com/en-us/library/yh598w02.aspx)。另外,不要重新抛出新异常,只需使用throw; (stackoverflow.com/questions/178456/…)。
  • if(ds.Tables[0].Rows.Count == 0)不要操作
  • 另一个旁注:您不需要打开或关闭与DataAdapter.Fill 的连接。如果你不打开它,连接将被打开并隐式关闭。
  • 感谢大家的帮助,在我选择答案之前先尝试一下这些解决方案

标签: c# asp.net arrays error-handling


【解决方案1】:

您可能在这里遇到错误:

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

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

您只需要使用Count 属性进行检查:

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

}

如果没有返回行,则表也是空的。 Tables 属性也有一个 Count 属性。

if(ds.Tables.Count > 0)
{

}

【讨论】:

  • 如果ds没有表怎么办?
  • @BasBrekelmans:好点。Tables 属性也有 Count 属性。编辑了我的答案。
【解决方案2】:

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

替换:

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
}

【讨论】:

  • 我得到:'项目在当前上下文中不存在。'
【解决方案3】:

您不必在 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;
    }

【讨论】:

    【解决方案4】:

    你可以的

        try
        {
           // your code....           
    
        }
        catch (Exception ex)
        {
            MessageBox.Show("My method failed, see inner excpetion",ex);
        }
        finally
        {
            connection.Close();
        }
        return numArray;
    }
    

    【讨论】:

    • 奇怪.. 尝试使用 Message.Show 总是给我一个错误:'System.Web.UI.WebControls.TextBox' 不包含'Show' 的定义并且没有扩展方法'Show'可以找到接受“System.Web.UI.WebControls.TextBox”类型的第一个参数(您是否缺少 using 指令或程序集引用?)
    【解决方案5】:

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

    if (ds.Tables[0].Rows.Any())
    {
       // Has rows.
    }
    

    【讨论】:

      【解决方案6】:

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

      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;
      }
      

      【讨论】:

      • 如果没有表格,这可能会中断。
      • 即使返回零行,仍然会有一个表。尝试创建一个返回 0 条记录的 SQL 调用,然后进行检查。作为参考,请参阅此处接受的答案:stackoverflow.com/questions/16985502/…
      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多