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

私のコードは、テーブルに格納されている ID に関連付けられている対応する FileImage を見つけるために、GridView から SQL ステートメントに ID を渡すことによって機能します。最近、間違った ID を手動で入力すると、サイトがクラッシュし、「位置 0 に行がありません」という例外がスローされることに気付きました。これは、基本的に取得するデータがないことを意味することがわかりました (明らかに、偽の ID を入力したためです)。

私の質問は、このエラーをどのように処理できますか? 今までエラーハンドリングについて深く考えたことはありませんでしたが、読んだ内容から、if ステートメントなどを実行すると思いますか? 基本的に、例外がない場合は続行しますが、例外がある場合は、ページの TextBox のテキストをエラーメッセージに変更して、ユーザーに「警告! IDが無効です」?

助けてくれてありがとう!

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 に答える