2012-12-02 3 views
0

저는 ASP.net을 처음 접했고 현재 사이트에 등록 페이지를 만들려고합니다. 데이터베이스에 사용자를 성공적으로 추가했지만 코드에 다른 기능을 추가하여 사용 가능한 userID를 확인했습니다. 예를 들어 사용자가 자신의 계정을 삭제 한 경우 사용자 ID가 다시 사용할 수있게됩니다. 최소 값과 최대 값을 찾고 min 또는 max에 따라 1을 더하거나 뺍니다. 오류없이 작성한 코드를 실행할 수는 있지만 사용자는 데이터베이스에 추가되지 않습니다. 아무도 내가이 일을 내 코드에서 빠진 알아낼 수 있습니까?데이터베이스에 사용자 추가가 작동하지 않습니다.

EDIT >>>>> 코드는 데이터베이스에 사용자를 추가하지만 대신 -1에 새 사용자를 추가합니다. 문제가 어디에 있는지를 알 수없는 것 같습니다.

If (aDataReader2.Read() = False) Then 
    aConnection1 = New OleDbConnection(aConnectionString) 
    aConnection1.Open() 
    aQuery = "Insert Into UserDetails " 
    aQuery = aQuery & "Values ('" & userID & "','" & userFName & "','" & userLName & "','" & userEmail & "','" & userUsername & "','" & userPassword & "')" 
    aCommand = New OleDbCommand(aQuery, aConnection1) 
    aCommand.ExecuteNonQuery() 
    aConnection1.Close() 
ElseIf (min = 1) Then 
    aConnection2 = New OleDbConnection(aConnectionString) 
    aConnection2.Open() 
    aCommand = New OleDbCommand(aQuery3, aConnection2) 
    aDataReader2 = aCommand.ExecuteReader() 
    userID = max + 1 
    aQuery = "Insert Into UserDetails " 
    aQuery = aQuery & "Values ('" & userID & "','" & userFName & "','" & userLName & "','" & userEmail & "','" & userUsername & "','" & userPassword & "')" 
    aCommand = New OleDbCommand(aQuery, aConnection2) 
    aCommand.ExecuteNonQuery() 
    aConnection2.Close() 
Else 
    aConnection3 = New OleDbConnection(aConnectionString) 
    aConnection3.Open() 
    aCommand = New OleDbCommand(aQuery2, aConnection3) 
    aDataReader2 = aCommand.ExecuteReader 
    userID = min - 1 
    aQuery = "Insert Into UserDetails " 
    aQuery = aQuery & "Values ('" & userID & "','" & userFName & "','" & userLName & "','" & userEmail & "','" & userUsername & "','" & userPassword & "')" 
    aCommand = New OleDbCommand(aQuery, aConnection3) 
    aCommand.ExecuteNonQuery() 
    aConnection3.Close() 
    lblResults.Text = "User Account successfully created" 
    btnCreateUser.Enabled = False 
End If 

다음은 데이터베이스에서 최대 값과 최소값을 얻는 데 사용한 코드입니다. 내가 그들 모두 0의 값을 받고 있어요 - 분 1이어야하며시 최대 5

Dim minID As Integer 
Dim maxID As Integer 
aQuery2 = "Select Min(UserID) AS '" & [minID] & "' From UserDetails" 
aQuery3 = "Select Max(UserID) AS ' " & [maxID] & "' From UserDetails" 
+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야한다"는 것을 참조하십시오. –

+2

이전 ID를 다시 사용하는 것은 좋지 않습니다. – adripanico

+0

감사합니다. Adripanico 나는 그렇게 생각하지도 않았지만 강사가 A 학년을 수강하기 위해 수업에 추천 한 내용입니다 – user1850189

답변

1

이 있어야 할 우리가 그것의 일부만 볼 수 있기 때문에 그것은 정확하게 문제 t 무엇 말하기 어렵다 . 분과 최대는 어디에서 왔습니까?

그러나 해결책을 줄 수는 없지만 코드 구조를 개선하는 것이 좋습니다. 중복 된 코드가 많이 있습니다 (!). 따라서 코드를 읽고 이해하고 변경하고 테스트하기가 어렵습니다.

사용자 데이터를 클래스에 넣습니다. 이렇게하면 많은 개별 변수보다 처리하기가 더 쉽습니다. 서브 루틴에

Public Class User 
    Public Property ID As Integer 
    Public Property FirstName As String 
    Public Property LastName As String 
    Public Property EMail As String 
    Public Property Username As String 
    Public Property Password As String 
End Class 

추출 중복 코드는

Private Sub CreateUser(ByVal u As User) 
    Const InsertQuery As String = _ 
     "INSERT INTO UserDetails VALUES ({0},'{1}','{2}','{3}','{4}','{5}')" 

    Dim query As String = String.Format(InsertQuery, u.ID, u.FirstName, u.LastName, _ 
                u.Email, u.Username, u.Password) 
    Using conn As New OleDbConnection(aConnectionString) 
     conn.Open() 
     Dim cmd As New OleDbCommand(query, conn) 
     cmd.ExecuteNonQuery() 
    End Using 
End Sub 

코드는 다음이 훨씬 낫 네요이

If Not aDataReader2.Read() Then 
    CreateUser(user) 
ElseIf min = 1 Then 
    ... 
    user.userID = max + 1 
    CreateUser(user) 
Else 
    ... 
    user.userID = min - 1 
    CreateUser(user) 
    lblResults.Text = "User Account successfully created" 
    btnCreateUser.Enabled = False 
End If 

과 같이된다.

(내 코드가 당신에게 아이디어를주고 그냥, 테스트되지 않은 상태입니다.) 당신은이 같은 최소 및 최대 값을 읽을 수 없습니다


UPDATE. 이 같은 것을 시도하십시오

Dim min, max As Integer 

Using conn As New OleDbConnection(aConnectionString) 
    Dim cmd As OleDbCommand = _ 
     New OleDbCommand("SELECT MIN(UserID), MAX(UserID) FROM UserDetails", conn) 
    conn.Open() 
    Using reader As OleDbDataReader = cmd.ExecuteReader() 
     reader.Read() 
     If reader.IsDBNull(0) Then 
      ' The table is empty 
      min = 1 
      max = 1 
     Else 
      min = reader.GetInt32(0) 
      max = reader.GetInt32(1) 
     End If 
    End Using 
End Using 
+0

감사합니다. 올리버. 나는 문자 그대로 단지 4 주 전에 ASP를 배우기 시작했고 우리는 코드 작성법을 보여주지 않았다. – user1850189

+0

고맙습니다. 올리버 :) 나는 당신이 제안한 것에서 일하고 있어요. – user1850189

+0

-1 (아무런 투표도하지 않고 코멘트를 통해) SQL 주입 취약한 코드. –

관련 문제