0

ASP.net C# の小さな Web ページを作成していますが、「0 の位置に行がありません」というエラーが表示され続けます。

私はおそらく間違っていますが、ここに私のコードの一部があります:

string SqlQuery = "SELECT * ";
    SqlQuery += " FROM main_list";
    SqlQuery += " WHERE ID = @FindID";

    SqlConnection conn = new SqlConnection("server=???;database=contacts;User          
    ID=???;Password=???;");
    conn.Open();

SqlCommand SqlCmd = new SqlCommand(SqlQuery, conn);
SqlCmd.Parameters.Add("@FindID",searchID);

SqlDataAdapter da = new SqlDataAdapter(SqlCmd);

    try {
         da.Fill(dt);

         fillData(p);
    }
    catch {
         txtId.Text = "ERROR"; 
    }

FillData は次のとおりです。

protected void fillData(int pos) {

    txtId.Text = dt.Rows[pos]["ID"].ToString();
    txtCompany.Text = dt.Rows[pos]["Company"].ToString();
    txtFirstName.Text = dt.Rows[pos]["First_Name"].ToString();
    txtLastName.Text = dt.Rows[pos]["Last_Name"].ToString();
    txtAddress1.Text = dt.Rows[pos]["Address1"].ToString();
    txtAddress2.Text = dt.Rows[pos]["Address2"].ToString();
    txtCity.Text = dt.Rows[pos]["City"].ToString();
    txtState.Text = dt.Rows[pos]["State"].ToString();
    txtZipCode.Text = dt.Rows[pos]["ZipCode"].ToString();
    txtPhoneNum1.Text = dt.Rows[pos]["Phone_Num"].ToString();
    txtPhoneNum2.Text = dt.Rows[pos]["Phone_Num2"].ToString();
    txtFax.Text = dt.Rows[pos]["Fax_Num"].ToString();
    txtEmail.Text = dt.Rows[pos]["Email"].ToString();
    txtNotes.Text = dt.Rows[pos]["Notes"].ToString();
    txtCategory.Text = dt.Rows[pos]["Category"].ToString();
    txtSubCategory.Text = dt.Rows[pos]["SubCategory"].ToString();
    txtDateAdded.Text = dt.Rows[pos]["DateAdded"].ToString();
    txtDateModified.Text = dt.Rows[0]["DateModified"].ToString();

}

エラーが発生する呼び出しは次のとおりです。

protected void btnPrev_Click(object sender, EventArgs e) {
    p--;
    lblPage.Text = p.ToString();
    fillData(p-1);

}
protected void btnNext_Click(object sender, EventArgs e) {
    p++;
    lblPage.Text = p.ToString();
    fillData(p-1);
}

Rows[0] から Rows[1] まで循環しようとしていますが、位置 0 または位置 1 に行がないというエラーが表示されます。

編集:既に1行にアクセスした後、データベースから返された2番目の行にアクセスしようとしています。例: Rows[0] は問題なくアクセスできますが、Rows[1] を読み込もうとすると、エラーが発生し、位置 1 に行がないと表示されます。Rows[1] を返すようにコードを修正すると、動作します。しかし、Rows[0] にアクセスしようとすると壊れてしまいます。これが、変数 (p) を fillData に渡して、その Rows 値のみを表示できるようにする理由です。ありがとう!

EDIT 2:データベースによって取得された値を消去するポストバックがあるためだと思います。ポストバック後もデータベース エントリを保持する方法はありますか? そうでない場合は、毎回データベースにクエリを実行する必要があると思います。

4

6 に答える 6

3

エラー メッセージは、SQL によって返される行がないことを示しています。返されるデータがあると確信していますか。

于 2012-12-04T15:21:34.707 に答える
1

使用するときdt.Rows[0]は、「戻ってきた最初の行を取得し、そこから値を取得する」と効果的に言っています。DataTableに行がない場合(つまり、SQLクエリが一致を返さない場合)、「これはリンゴを含まないプレートです。最初のリンゴを取り、それが何色か教えてください」と言っているようなものです。意味がありません。

あなたがすべきことは、それらを読み込もうとする前に、行があるかどうかを確認することです...

if(dt.Rows.Count > 0)
{
    // do stuff here.
}
于 2012-12-04T15:23:23.063 に答える
0

Linqとストアドプロシージャを使用すると、はるかに優れています

datacontext context = new datacontext();

var result = context.MyStoredProc(searchID).FirstOrDefault();
于 2012-12-04T15:23:40.017 に答える
0

変更してみる

    SqlCmd.Parameters.Add("@FindID",searchID);

    SqlCmd.Parameters.AddWithValue("@FindID",searchID);
于 2012-12-04T15:24:57.683 に答える
0

データベースでクエリを確認し、実際に行が返されていることを確認してください。また、特にパラメーターを使用する場合は、クエリをそのようにコードに直接配置することはお勧めできません。次のようなことを試してみてください。

private Int32 CallStoredProcedure(Int32 FindId)
{
    using (var dt = new DataTable())
    {
        using (var conn = new SqlConnection(ConnectionString))
        {
            using (var sqlCmd = new SqlCommand("SEL_StoredProcedure", conn))
            {
                using (var sda = new SqlDataAdapter(sqlCmd))
                {
                    sqlCmd.CommandType = System.Data.CommandType.StoredProcedure;
                    sqlCmd.Parameters.AddWithValue("@FindId", FindId);
                    sqlCmd.Connection.Open();

                    sda.Fill(dt);
                }
            }
        }

        if (dt.Rows.Count == 1)
            return Convert.ToInt32(dt.Rows[0]["ID"]);
        else if (dt.Rows.Count > 1)
            throw new Exception("Multiple records were found with supplied ID; ID = " + studentId.ToString());
    }
    return 0;
}

ストアド プロシージャを設定するには、データベースで次を実行します。

CREATE  procedure [dbo].[SEL_StoredProcedure]

@FindId int = null  
as
SELECT * FROM main_list where ID = @FindId
于 2012-12-04T15:25:55.650 に答える
-2

コードからインデックス識別子を削除するだけです。

例えば

txtId.Text = dt.Rows["ID"].ToString();
于 2012-12-04T15:20:26.787 に答える