索引(从零开始)必须大于或等于零?

Posted

技术标签:

【中文标题】索引(从零开始)必须大于或等于零?【英文标题】: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 的第一个问题仍然是最重要的。您的代码中的哪一行引发了该错误? 【参考方案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】:

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

感谢大家的评论。 :)

【讨论】:

以上是关于索引(从零开始)必须大于或等于零?的主要内容,如果未能解决你的问题,请参考以下文章

插入时出错...索引(从零开始)必须大于或等于零且小于参数列表的大小

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

索引(从零开始)必须大于或等于零且小于参数列表的大小。 - 字符串.格式

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

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

从零开始认识堆排序