2011-09-29 8 views
0

에 안녕과 C# 1 로그인 어레이 오차의 범위 밖에 있었다 내가 서버 문자열 연결 및 로그인 버튼을 누를 때 실행 로그인있다. 사용자와 암호가 데이터베이스에 저장되어 있지 않지만 데이터베이스에있는 경우 "배열 경계에 있지 않습니다"오류가 발생하면 잘못된 오류를 반환합니다. 어떻게 내가 이걸 고칠 수 있을까 ?? 덕분에 내 연결 문자열이 내 appconfig가 파일에 있습니다 인덱스 SQL

, 문제가 될 수 있을까?

는 PROGRAM.CS 파일 #######
private void btnOK_Click(object sender, EventArgs e) 
{ 
SqlConnection con = Program.GetConnection; 
SqlDataReader dr = null; 
try 
    { 
      SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE UserName='" + 
      txtName.Text + "'AND Password='" + textpassword.Text + "'", con); 
      dr = cmd.ExecuteReader(); 
      if (dr.Read()) 
      { 
       Program.UserLoginName = dr.GetString(3); 
       this.Close(); 
      } 
      else 

       MessageBox.Show("Invalid Username & Password!"); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
Using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 
using System.Data.SqlClient; 
using System.Configuration; 

namespace FrontEndV1 
{ 
static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Login()); 
    } 
    public static SqlConnection GetConnection 
    { 
     get 
     { 
      string ConnectionString = ConfigurationManager.ConnectionStrings["FrontEndV1Connection"].ConnectionString; 
      SqlConnection con = new SqlConnection(ConnectionString); 
      con.Open(); 
      return con; 
     } 
    } 
    public static string UserLoginName { get; set; } 
} 

}

+0

-1 응답하지 않습니다. ** Users ** 테이블에 몇 개의 열이 있습니까? – adatapost

+3

@AVD : 나는 이것이 그런 상황에서 사용자를 downvote하는 것이 옳지 않다고 생각한다. 그것은 SO stat에 따라 "18 분 전"으로 보였다. 나는 질문을 올렸을 때와 같은 상황에있을 수 있다고 생각한다. 이것은 downvote의 이유가되지 않습니다 – sll

답변

1

내가 그런 실수는 여기 낳는 생각 : dr.GetString(3); 세는이 배열에서 0부터 시작 3 2로 변경하려고합니다.

1

이 당신의 문제 ########## FORM WINDOWS 로그인 버튼을 클릭하면 :

Program.UserLoginName = dr.GetString(3); 

색인이 반환 된 입력란 수보다 큰 필드가 표시됩니다.
0과 dr.FieldCount-1 사이의 인덱스를 사용해야합니다.

또는 dr.GetString(dr.GetOrdinal(desired_field_name))을 사용할 수도 있습니다. 기능을 상실하지 않고 반환 명령을 바꿀 수 있기 때문에 (더 많은 지침이 필요한 경우에도) 쿼리를 변경해야 할 수도 있습니다.

+0

그리고 문제는 ....... ..... 그리고 솔루션은 ........ – Johan

+0

@ 조한 : 당신은 지금 그것이 더 좋다고 생각하니? :) 고마워요 – Marco

+0

@stefan : 내 편집 게시물 좀 봐 – Marco

0

난 당신이 단지 세 개의 열을 가지고 생각합니다. 3 열의 인덱스는 2이고, 그래서

Program.UserLoginName = dr.GetString(2);이 줄을

Program.UserLoginName = dr.GetString(3);

변경.

1

당신은이 오류가 발생 를 말을하지 않습니다,하지만 난이 줄을 의심 : 쿼리가 4 열보다 적은 반환하는 경우

Program.UserLoginName = dr.GetString(3); 

오류를 슬로우합니다.

또한 이것은 SQL 인젝션에 취약하다. 저장된 proc 또는 매개 변수화 된 쿼리를 사용하십시오.

+0

또는 LINQ2SQL 사용 –

0

당신은 응용 프로그램을 디버깅 할 수 있습니까? 그렇게 할 수 있다면 예외가 던져지는 곳을 찾으십시오. dr.GetString(3)을 실행할 때 예외가 발생하면 Marco와 다른 사용자가 제안한 것처럼 문제가 있습니다. 올바른 열 서수를 사용하거나 SELECT Column1, Column2, ..., ColumnN FROM Table을 사용하여 정확히 어떤 서 수를 지정해야하는지 알 수 있습니다.

0

나쁜 코딩 :

  1. select *를 사용하여, 당신은 행의 값을 검색 할 인덱스를 사용하여 열
  2. 의 이름을 사용해야합니다, 당신은 실제 열 이름

을 반환 사용해야합니다 위의 내용을 적용하면 문제가 없습니다.