0

我正在写一个小的 ASP.net C# 网页,它一直给我一个错误说明:位置 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 没有行的错误。它只填充一次然后出错。

编辑:在已经访问了一行之后,我正在尝试访问数据库返回的第二行。例如: Rows[0] 可以正常访问,但是当我尝试读取 Rows[1] 时它会出错并说它在位置 1 没有行。我可以修改代码以返回 Rows[1] 并且它可以工作但是当我尝试访问 Rows[0] 时它会中断。这就是为什么我将变量 (p) 传递给 fillData 以便它只能显示 Rows 值。谢谢!

编辑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 回答