索引(从零开始)必须大于或等于零?
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.Tables
和ds1.Tables
至少有一个值吗?
尝试在if ((ds.Tables[0].Rows.Count == 0) || ...
之前添加if (ds.Tables.Count > 0 && ds1.Tables.Count > 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】:解决了。这是另一个页面上的问题。
感谢大家的评论。 :)
【讨论】:
以上是关于索引(从零开始)必须大于或等于零?的主要内容,如果未能解决你的问题,请参考以下文章
插入时出错...索引(从零开始)必须大于或等于零且小于参数列表的大小
插入数组列表时,索引(从零开始)必须大于或等于零且小于参数列表的大小
索引(从零开始)必须大于或等于零且小于参数列表的大小。 - 字符串.格式