1

データセットとストアド プロシージャを使用して SQL テーブルからデータを取得しようとしています。プロシージャの実行後、データセットには値が 1 つだけ含まれている必要があります (ID 番号を取得しています。ID 番号は Costumers テーブルの主キーであるため、それぞれ 1 つだけ存在する必要があります)。IsCostumerIDTaken ストアド プロシージャは、パラメーターとして受け取る ID を返すだけです。見つかった場合は、それを返します。そうでない場合はどうなるかわかりません。おそらく0を返します。

 public static bool IsCostumerIDTaken(string id)
    {
        SqlConnection conObj = GetConnection();
        SqlCommand cmdObj = new SqlCommand("IsCostumerIDTaken", conObj);
        cmdObj.CommandType = CommandType.StoredProcedure;
        cmdObj.Parameters.Add("@ID", SqlDbType.NVarChar).Value = id;        
        SqlDataAdapter da = new SqlDataAdapter(cmdObj);
        DataSet ds = new DataSet();
        da.Fill(ds);
        if (ds.Tables[0].Rows[0][0].ToString() != id)
            return false;
        return true;       
    }

私のページの1つでこのコマンドを実行した後

Label1.Text = DAL.IsCostumerIDTaken(TextBox1.Text).ToString();

次のエラーが表示されます。

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.IndexOutOfRangeException: 位置 0 に行がありません。

Source Error:  
Line 73:         DataSet ds = new DataSet();
Line 74:         da.Fill(ds);
Line 75:         if (ds.Tables[0].Rows[0][0].ToString() != id)
Line 76:             return false;  
Line 77:         return true;   

ここでの問題は何ですか?データセットからデータを正しく引き出していませんか?

4

2 に答える 2

0

正しい。データを正しく引き出していません。私にはわかりませんが、ここのどこかに...

ds.Tables[0].Rows[0][0]

... null オブジェクトを取得しています。クエリが空を返すと予想されるため、最後[0]null.

十分なデータベース権限がある場合は、データベースで SQL Server プロファイラーを実行し、実行されている正確なパラメーターを使用して正確なクエリを確認できます。そこから、問題がストアド プロシージャにあるのか、C# コードにあるのかを判断できるはずです。

于 2012-11-28T16:59:00.223 に答える
0

データがない場合、行はありません。テストする必要がありますds.Tables[0].Rows.Count

この部分を交換

if (ds.Tables[0].Rows[0][0].ToString() != id)
            return false;
        return true;

これとともに:

return ds.Tables[0].Rows.Count > 0 && ds.Tables[0].Rows[0][0].ToString().Equals(id);
于 2012-11-28T16:56:19.867 に答える