2013-11-16 7 views
0

Привет, люди stackoverflow! Я недавно разработал простую программу vb.net, которая подключается к базе данных mysql для регистрации и входа в систему с указанными учетными данными. Я использовал этот код для регистрации своих пользователей, но я получаю и ошибка (под кодом)Почему я продолжаю получать эту ошибку mysql?

Dim insertUser As String = "INSERT INTO users(ID, username, password, email, verif)" _ 
     & " VALUES('','" & Username.Text & "','" & Password.Text & "','" & Email.Text & "','" & currentRandString & "');" 
     Dim checkUsername As String = "SELECT * FROM users WHERE username='" & Username.Text & "'" 
     MysqlConn = New MySqlConnection() 
     MysqlConn.ConnectionString = mysqlconntxt4reg 
     MysqlConn.Open() 

     Dim myCommand As New MySqlCommand 
     myCommand.Connection = MysqlConn 
     myCommand.CommandText = checkUsername 

     myAdapter.SelectCommand = myCommand 
     Dim myData As MySqlDataReader 
     myData = myCommand.ExecuteReader 

     If myData.HasRows > 0 Then 
      MsgBox("Username Already In Use...", MsgBoxStyle.Critical, "Error") 
      myData.Close() 
     Else 
      myData.Close() 
      Dim myCommand2 As New MySqlCommand 
      myCommand2.Connection = MysqlConn 
      myCommand2.CommandText = insertUser 

      myAdapter.SelectCommand = myCommand2 
      Dim myData2 As MySqlDataReader 
      myData2 = myCommand2.ExecuteReader 
      Mail(Email.Text, currentRandString) 
      Me.Close() 
      myData2.Close() 
     End If 
    Catch myerror As MySqlException 
     MsgBox("Error While Connecting To Database:" & vbNewLine & vbNewLine & myerror.ToString, MsgBoxStyle.Critical, "Error") 
    Finally 
     MysqlConn.Dispose() 
    End Try 

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

Ошибка: enter image description here

Link to Error Image

Я был бы признателен за любую помощь по этой теме! Thanks Rodit

+1

Возможно, потому, что уже существует открытый DataReader, связанный с этим соединением. –

+0

Ваш код открыт для [SQL Injection] (http://en.wikipedia.org/wiki/SQL_injection) - никогда не объединяйте SQL таким образом. Вместо этого используйте параметризованные запросы. – Oded

ответ

0

Я бы использовал инструкцию using вокруг всех одноразовых объектов, чтобы быть уверенными, что они выпускают все ссылки на соединение, когда они больше не нужны, но, глядя на ваш код, я думаю, вам не нужно на всех DataReaders, потому что вы могли бы решить проблему только с помощью команд

Dim insertUser As String = "INSERT INTO users(username, password, email, verif)" _ 
          & " VALUES(@p1, @p2,@p3,@p4)" 
Dim checkUsername As String = "SELECT COUNT(*) FROM users WHERE [email protected]" 

Using MysqlConn = New MySqlConnection(mysqlconntxt4reg) 
Using myCommand = New MySqlCommand(checkUsername, MysqlConn) 
    MysqlConn.Open() 
    myCommand.Parameters.AddWithValue("@p1", Username.Text) 
    Dim result = myCommand.ExecuteScalar() 
    if result IsNot Nothing AndAlso Convert.ToInt32(result) > 0 Then 
     MsgBox("Username Already In Use...", MsgBoxStyle.Critical, "Error") 
    Else 
     Using myCommand2 = New MySqlCommand(insertUser, MysqlConn) 
       mycommand2.Parameters.AddWithValue("@p1",Username.Text) 
       mycommand2.Parameters.AddWithValue("@p2",Password.Text) 
       mycommand2.Parameters.AddWithValue("@p3",Email.Text) 
       mycommand2.Parameters.AddWithValue("@p4",currentRandString) 
       myCommand2.ExecuteNonQuery() 
       Mail(Email.Text, currentRandString) 
     End Using  
    End If 
End Using 
End Using 

конечно я заменил свою строки конкатенацию с параметризованными запросами. Это очень важно сделать, чтобы избежать Sql Injection

Я заменил запрос, который проверяет существование пользователя с помощью скалярной операции, которая может использоваться с командой ExecuteScalar. Кроме того, в первом запросе кажется, что вы пытаетесь вставить идентификатор поля с пустой строкой. Я думаю, что первое поле (ID) является полем автонабора, и в этом случае вы не добавляете его в запрос вставки и не пропускаете какое-либо значение, потому что база данных будет вычислять это поле для вас.

+0

спасибо большое! Я попробую это как можно скорее –

+0

Я получаю эту ошибку: –

+0

в этой строке Использование (MysqlConn = New MySqlConnection (mysqlconntxt4reg)) Я получаю эту ошибку: Operator '=' не определен для типов 'MySql.Data.MySqlClient.MySqlConnection' и 'MySql.Data.MySqlClient.MySqlConnection' –

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