2013-01-07 2 views
1

저는 프로그래밍에 익숙하지 않고 SQL Server Compact을 사용하고 있습니다.이 개인 프로젝트를 배우기 때문에 어떤 도움도 크게 받으실 수 있습니다.로그인하는 사람에 따라 기본 양식의 단추를 숨기려면 어떻게합니까?

성공적으로 로깅하는 사용자 유형 계정에 따라 Main Formbutton을 숨기려고합니다.

내 데이터베이스에는 username, passwordtype - (this is what I am trying to access for this project) 인 3 개의 열이 있습니다. 나는 오류가 발견되지 않았다 코드를 내장

private void Main_Load(object sender, EventArgs e) 
    { 
     admincontrolbtn.Visible = false; 
     conn = new SqlCeConnection("Data Source=Users.sdf; Persist Security Info = False"); 
     comm = new SqlCeCommand("Select * from [user]", conn); 
     reader = comm.ExecuteReader(); 
     while (reader.Read()) 
     { 
      try 
      { 
       conn.Open(); 
       if (reader.GetString(2) == "Administrator") 
       { 
        admincontrolbtn.Visible = true; 
       } 
       else 
       { 
        admincontrolbtn.Visible = false; 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
      finally 
      { 
       conn.Close(); 
      } 
     } 
    } 

:

나는이 코드를 배치 어디 그래서 이것이 내가이 Main_load 처리해야 원하는 효과를 얻을 것을 생각. 나는 내가 옳은 길에 있다고 생각했다. 그러나 User" type의 자격증 명을 사용하여 로그인하면 button이 계속 표시됩니다. 나는 이미 Main_load에 중단 권리를 넣어서 코드를 디버깅하려고 시도했지만, 실행하고 로그인하면 Main_load를 무시하고 Main 페이지를 표시합니다.

나는 또한 심지어 자격 증명의 관리자 유형을 사용하여 메인 페이지를로드 할 속성 거짓하지만 경우에 button의 가시성을 설정하는 시도는 button가 숨겨진 상태로 유지됩니다.

코드 구문이 잘못 되었습니까? 그리고/또는 아마도 Main_load이 내 목표가 잘못되었다고 생각하는 내 방식일까요?

답변

0

일반적으로 사용자가 로그인하면 해당 사용자에 대한 모든 관련 정보가 들어있는 사용자 개체가 만들어집니다. 그러면 나중에 사용자에 대해 알기를 원할 때마다 데이터베이스에 액세스 할 필요가 없습니다.

class User 
{ 
    string role; 
    //.. other user attributes. 
} 

당신의 명령을 사용하면 하나의 사용자에 대한 정보를 원하는 다른 있어야한다 :

comm = new SqlCeCommand("Select * from [user] where user_id=1", conn); 
+0

감사합니다. –

0

나는 이미 Main_load 자체를 마우스 오른쪽 버튼으로 휴식을 바꾸어 코드를 디버깅하기 위해 시도했지만 내가 그것을 실행하고 로그인하면 Main_load를 무시하고 메인 페이지를 표시합니다.

이는 일반적으로 Main_Load 메서드가 Load 이벤트에 바인딩되어 있지 않음을 의미합니다. 양식 Load (처리하는 경우)을 처리하는 방법을 확인하고 문제를 해결하십시오.

희망이 도움이됩니다.

+0

감사합니다. 나는 폼을 다시 두 번 클릭하여 새로운 Load 이벤트를 만들었습니다. 그러면 Mr.Fox가 말한 것을 수행했습니다. (비록 내가 그 일을했지만 처음에는 내가 그 일을하지 않았다.) –

0

나는 어떻게 이것이 SqlException을 던질 수 없었는지 알지 못합니다. 두 가지 이유 :

  1. 당신이 바로 보이지 않는다 쓴 SQL 및

  2. 이 옳았다 경우는 while (reader.Read()) { ... } 의지 루프를 사용하여이 경우, (* 사용) 대해 여러 개의 restults을 기다리고있을 것 같다 그에 따라 로직을 설정합니다.따라서 첫 번째 사용자가 USER이고 두 번째가 Administrator 인 경우 버튼 사용 상태는 마지막으로 액세스 한 값에 따라 설정되며 사용자가 원하는 것은 아닙니다.

대신 SQL 쿼리에 도움이되는 정적 유틸리티 클래스를 설정하십시오. 따라서이 메소드는 단일 텍스트 결과를 반환 할 것으로 예상되는 것과 같은 것이 있습니다.

public static calss Utilities 
{ 
    public static bool SQLResult(SqlConnection conn, string strSQL) 
    { 
     try 
     { 
      SqlCommand cmd = new SqlCommand(); 
      cmd.Connection = conn; 
      cmd.CommandText = strSQL; 
      strResult = cmd.ExecuteScalar().ToString(); 
     } 
     catch (Exception e) 
     { 
      // Return error or display. 
      return false; 
     } 
     return true; 
    } 
} 

지금 사용하려는 SQL은

SELECT SYSTEM_USER; 
GO 

이 현재 로그인 한 사용자를 반환 할 것이다; 쿼리를 실행하는 사용자 나를 위해 그것은 'ServerName \ Administrator'를 반환합니다. 그래서 귀하의 논리는 수

string sql = "SELECT SYSTEM_USER;"; 
string result = Utilities.SQLResult(someValidConnection, sql); 
if (result.Contains("Administrator")) 
    // Do stuff. 

희망이 도움이되기를 바랍니다.

참고. 위의 내용은 SQL 주입 공격이나 기타 보안 문제를 고려하지 않았습니다. 대부분의 기본 WinForm 응용 프로그램 (비 웹 기반)의 경우 이러한 보안 문제는 IMO가 걱정할 가치가 없습니다.

+0

Mr.Fox와 Tigran 덕분에 일을 해줘서 고맙습니다.하지만 저는 귀하의 게시물을 읽음으로써 배웠으며 지금 귀하의 접근 방식을 시도 할 것입니다. –

관련 문제