2016-03-16 5 views
0

Это ошибка, я получаю:Индекс (на основе нуля) должен быть больше или равен нулю?

Index (с нуля) должен быть больше или равен нулю и меньше размера списка аргументов

Это код:

<%@ 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> 

Я создал форму для регистрации, и этот код используется для вставки данных в базу данных и проверки также на наличие одинаковых имен почты и имени пользователя.

Кто-нибудь знает, почему это происходит?

Спасибо!

+5

* Где * вы получаете эту ошибку? Вы разместили 73 строки кода и оставили нам догадываться, где проблема. В идеале, уменьшите его до [mcve]. –

+5

Кроме того, вы должны сразу прочитать параметризованный SQL ** **, чтобы избежать уязвимости SQL-инъекции, которую ваш код имеет в настоящее время (в нескольких местах). –

+1

Вы уверены, что 'ds.Tables' и' ds1.Tables' имеют хотя бы одно значение? –

ответ

3

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

{2} не существует, поскольку есть только один аргумент в string.Format(). Обратите внимание, что я googled это привело меня к here (подсказка подсказка).

Так изменить его к этому: string sqlstring1 = string.Format("select * from iUsers_Table where (imail='{0}')", c);

и повторите попытку.

+0

your'e right Я действительно изменил это, и он все еще не работал, так как он пропустил проверку. – CommandoMan

0

Учитывая, что вы не определили линию ошибки возникающую, я буду считать, что проблема с этой строки кода, потому что это не так:

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

{2} должен быть {0}, потому что это индекс на основе нуля, и вы только сказали string.Format ожидать один параметр.

+0

Это, вероятно, не где исключение выбрасывается, хотя оно может вносить свой вклад. – Casey

+0

your'e right Я действительно изменил это, и он все еще не работал - это было так, как если бы он пропустил проверку – CommandoMan

+0

Хорошо, в этом случае вы можете рассказать нам, линии происходит исключение, p сдавать в аренду? – Crwydryn

0

Как и другие, проблема заключается в вашей строке. Форма. Но я хотел бы также отметить, что 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}')"

Это гораздо чище и более удобным для чтения способом форматирование строк и должно помочь избежать того, что можно легко ошибиться в будущем.

Edit: Видя, как это не исправить исключение, убедитесь, что ds.Tables.Length больше 0, где-нибудь у вас есть ds.Tables[0] сгенерирует исключение, если ds.Tables пуст.

Я также заметил, что вы пропустили некоторые цитаты в

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} хотя я не уверен, что может вызвать исключение вы получаете. Рассказывать нам, где произошло исключение, очень помогло бы.

+0

Собственно, теперь это кажется исправленным по какой-то нечетной причине. Хотя я не получаю сообщение об ошибке, моя проверка не работает, она вводит значения в базу данных независимо от того, существуют они или нет. Я также не мог использовать интерполированную строку, которую вы показали, и я получил ошибку, когда использовал ее. – CommandoMan

0

Решено. Это была проблема на другой странице.

Спасибо всем за комментарий.:)

Смежные вопросы

 Смежные вопросы