【问题标题】:Index (zero based) must be greater than or equal to zero?索引(从零开始)必须大于或等于零?
【发布时间】:2016-07-02 12:01:05
【问题描述】:

这是我得到的错误:

索引(从零开始)必须大于或等于零且小于参数列表的大小

这是代码:

<%@ Page Language="C#"%>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>


<!DOCTYPE html>

<script runat="server">



public void Page_Load()
{
    string a, c;
    a = Request.Form["username"];

    string connstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath("SQL/Site_Database.accdb");
    string sqlstring = string.Format("select * from iUsers_Table where (iusername='{0}')", a);
    OleDbDataAdapter da = new OleDbDataAdapter(sqlstring, connstring);
    DataSet ds = new DataSet();
    da.Fill(ds);


    c = Request.Form["mail"];

    string connstring1 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath("SQL/Site_Database.accdb");
    string sqlstring1 = string.Format("select * from iUsers_Table where (imail='{0}')", c);
    OleDbDataAdapter da1 = new OleDbDataAdapter(sqlstring1, connstring1);
    DataSet ds1 = new DataSet();
    da1.Fill(ds1);

    if ((ds.Tables[0].Rows.Count == 0) || (ds1.Tables[0].Rows.Count == 0))
    {

        string b, d, e, f, g, h;

        b = Request.Form["password"];
        d = Request.Form["gender"];
        e = Request.Form["age"];
        f = Request.Form["prob"];
        g = Request.Form["prob_val"];
        h = Request.Form["fitness"];

        sqlstring = string.Format("insert into iUsers_Table (iusername,ipassword,imail,igender,iage,iproblem,iproblem_value,ifitness) values('{0}','{1}','{2}','{3}',{4},'{5}',{6},'{7}')", a, b, c, d, e, f, g, h);
        OleDbConnection conn = new OleDbConnection(connstring);
        OleDbCommand cmd = new OleDbCommand(sqlstring, conn);
        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();

        Session["connect_status"] = "connected";
        Response.Redirect("My_Plan.aspx");

    }

    else

    {
        if ((ds.Tables[0].Rows.Count) > 0)
        {
            Session["subscribed"] = "exist";

            if ((ds1.Tables[0].Rows.Count) > 0)
            {
                Session["mail"] = "exist";
                Response.Redirect("index.aspx");
            }

            Response.Redirect("index.aspx");
        }
    }
}
</script>

我创建了一个注册表单,此代码用于将数据插入数据库并检查现有的相同邮件和用户名值。

有人知道为什么会这样吗?

谢谢!

【问题讨论】:

  • 在哪里你得到那个错误?您发布了 73 行代码,让我们猜测问题出在哪里。理想情况下,将其减少到 minimal reproducible example
  • 另外,您应该立即阅读参数化 SQL,以避免您的代码当前(在多个位置)存在 SQL 注入漏洞。
  • 您确定ds.Tablesds1.Tables 至少有一个值吗?
  • 尝试在if ((ds.Tables[0].Rows.Count == 0) || ...之前添加if (ds.Tables.Count &gt; 0 &amp;&amp; ds1.Tables.Count &gt; 0)
  • @CommandoMan - Jon Skeet 的第一个问题仍然是最重要的。您的代码中的哪一行引发了该错误?

标签: c# sql asp.net


【解决方案1】:

string sqlstring1 = string.Format("select * from iUsers_Table where (imail='{2}')", c);

{2} 不存在,因为 string.Format() 中只有一个参数。 请注意,我用谷歌搜索了它,这导致我找到了here(提示提示)。

所以改成这样: string sqlstring1 = string.Format("select * from iUsers_Table where (imail='{0}')", c);

然后再试一次。

【讨论】:

  • 你说得对,我实际上改变了它,但它仍然没有工作 - 好像它跳过了验证。
【解决方案2】:

正如其他人回答的那样,问题出在您的 string.Format 上。但我还想指出,Interpolated Strings 是在 C# 6 中添加的,可以让您更改

string sqlstring1 = string.Format("select * from iUsers_Table where (imail='{0}')", c);

string sqlstring1 = $"select * from iUsers_Table where (imail='{c}')"

这是一种更简洁、更易读的字符串格式化方式,应该有助于避免以后容易犯的错误。

编辑: 鉴于这并没有解决您的异常,请确保 ds.Tables.Length 大于 0,如果 ds.Tables 为空,您拥有 ds.Tables[0] 的任何地方都会抛出异常.

我还注意到您在

中遗漏了一些引号
sqlstring = string.Format("insert into iUsers_Table (iusername,ipassword,imail,igender,iage,iproblem,iproblem_value,ifitness) values('{0}','{1}','{2}','{3}',{4},'{5}',{6},'{7}')", a, b, c, d, e, f, g, h);

{6} 附近,尽管我不确定这会导致您遇到异常。告诉我们异常发生在哪里会有很大帮助。

【讨论】:

  • 实际上,现在它似乎由于某种奇怪的原因而被修复了。虽然我现在没有收到错误,但我的验证似乎不起作用——无论它们是否存在,它都会将值输入到数据库中。我也无法使用您显示的内插字符串,并且在使用时出现错误。
【解决方案3】:

鉴于您尚未确定发生错误的行,我将假设问题出在这行代码上,因为它是错误的:

string sqlstring1 = string.Format("select * from iUsers_Table where (imail='{2}')", c);

{2} 应该是 {0},因为它是从零开始的索引,并且您只告诉 string.Format 期待一个参数。

【讨论】:

  • 这可能不是引发异常的地方,尽管它可能有助于它。
  • 你说得对,我实际上改变了它,但它仍然没有工作 - 就好像它跳过了验证
  • 好的,那么您能告诉我们异常发生在哪一行吗?
  • 实际上,现在它似乎因为一些奇怪的原因而被修复了。虽然我现在没有收到错误,但我的验证似乎不起作用 - 无论它们是否存在,它都会将值输入到数据库中。
【解决方案4】:

解决了。这是另一个页面上的问题。

感谢大家的评论。 :)

【讨论】:

    猜你喜欢
    • 2011-07-16
    • 2018-05-24
    • 2012-12-29
    • 2011-12-19
    • 2011-04-18
    • 2013-09-26
    • 2016-07-03
    • 2023-04-11
    相关资源
    最近更新 更多