Вставка данных в MySQLTable с помощью Params

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

"Неизвестный тип данных"

У меня есть функция в модуле, которая (так что мне не нужно ее переписывать, и я могу вызывать ее из любой формы), чтобы открыть соединение с MySQL.

Imports MySql.Data.MySqlClient
Imports System.Net.Mail

Module Module1
Public MyConnection As New MySqlConnection
Public lastLogon As String = Today.Day & "/" & Today.Month & "/" & Today.Year & TimeOfDay.Hour & ":" & TimeOfDay.Minute & ":" & TimeOfDay.Second
Function ServerConnection()
    Try
        MyConnection.ConnectionString = "server=127.0.0.1;user=root;password=password;database=titulo"
        MyConnection.Open()
        Return True
    Catch ex As Exception
        Return False
    End Function
    'Don't mind this
    + Function SendMail(SendTo As String, subject As String, message As String)
End Function
End Module

Поэтому я вызываю это с помощью функции ServerConnection и сохраняю соединение в публичной переменной с именем MyConnection, которую я могу вызывать из любой другой формы.

Дело в том, что у меня есть этот код для создания учетной записи, которая вставляет данные в таблицу: (извините за испанский. Просто проверьте код и не обращайте внимания на функцию SendMail)

 Private Sub btnDo_Click(sender As Object, e As EventArgs) Handles btnDo.Click
    If txtUsername.Text <> "" And txtPassword.Text <> "" And txtPassword2.Text <> "" And txtEmail.Text <> "" Then
        If mailUsed = False Then
            If userUsed = False Then
                If txtPassword.Text <> txtPassword2.Text Then
                    lblError.Text = "Revise sus contraseñas."
                Else
                    lblError.Text = ""
                    Try
                        ServerConnection()
                        Dim MyCommand As New MySqlCommand("INSERT INTO titulo.accounts(id, accountName, accountPassword, accountMail, accountLogon) VALUES(0, @username, @password, @email, @logon)", MyConnection)
                        MyCommand.Parameters.Add("@username", SqlDbType.VarChar, 10).Value = txtUsername.Text
                        MyCommand.Parameters.Add("@password", SqlDbType.VarChar, 16).Value = txtPassword.Text
                        MyCommand.Parameters.Add("@email", SqlDbType.VarChar, 60).Value = txtEmail.Text
                        MyCommand.Parameters.Add("@logon", SqlDbType.VarChar, 22).Value = "First Session."
                        MyCommand.ExecuteNonQuery()
                        Try
                            SendMail(txtEmail.Text, "Nueva cuenta en TITULO", txtUsername.Text & Environment.NewLine & " Se ha creado una cuenta a su nombre en " & My.Application.Info.AssemblyName & Environment.NewLine & "Nombre de cuenta: " & txtUsername.Text & Environment.NewLine & "Contraseña: " & txtPassword.Text)
                        Catch ex As Exception
                            MsgBox(ex.Message)
                        Finally
                            MsgBox("Cuenta creada. Correo enviado a: " & txtEmail.Text & ".")
                        End Try

                    Catch ex As Exception
                        MessageBox.Show("Error en la base de datos." & Environment.NewLine & ex.Message)
                    Finally
                        MyConnection.Close()
                    End Try

                    MsgBox("La cuenta " & txtUsername.Text & " ha sido creada." & Environment.NewLine & "Revise su correo " & txtEmail.Text & " para revisar sus datos.")
                End If
            Else
                lblError.Text = "Ya existe una cuenta con ese nombre."
            End If
        Else
            lblError.Text = "Ese correo ya esta en uso."
        End If
    Else
        lblError.Text = "Revise sus datos."
    End If
End Sub

Еще раз извините за испанский. Таблица моих учетных записей в базе данных titulo имеет следующие типы данных id INT NOT NULL AUTO_INCREMENT,

accountName VARCHAR(10) НЕ NULL,

accountPassword VARCHAR(16) НЕ NULL,

accountMail VARCHAR(60) НЕ NULL,

accountLogon VARCHAR(22) НЕ NULL,

Буду признателен за любую помощь, если она будет предоставлена.


person Reviyee    schedule 08.03.2017    source источник


Ответы (1)


Код MySql должен использовать перечисление MySqlDbType для определения типа данных параметров. Вы используете SqlDbType.

Этот код покажет вам, что они не имеют одинакового значения.

int x = (int)SqlDbType.VarChar;
int y = (int)MySqlDbType.VarChar;
Console.WriteLine("SqlDbType.VarChar = " + x);   
Console.WriteLine("MySqlDbType.VarChar = " + y);

Выход

SqlDbType.VarChar = 22 
MySqlDbType.VarChar = 253

Не имеет отношения к вашей реальной проблеме, но мне нужно сообщить вам о большой угрозе безопасности в вашем коде. Не храните пароли в виде простого текста. Всегда используйте алгоритм хеширования и сольный ключ для хранения необратимых байтов пароля пользователя.

Лучший способ сохранить пароль в базе данных

person Steve    schedule 08.03.2017
comment
Большое спасибо за исправление. Я обязательно попробую, и я знаю о проблеме с безопасностью пароля, но я еще не видел этого. Большое спасибо за ответ! - person Reviyee; 08.03.2017
comment
В случае, если я хеширую свой пароль, который хранится в MySQL в varchar(16), если результат хеширования выдает, скажем, 30-символьный пароль, я должен увеличить емкость в столбце пароля, верно? - person Reviyee; 08.03.2017
comment
Если я не ошибаюсь, длина результирующего хэша фиксируется согласно используемому алгоритму. MD5 создает 16-байтовый хэш, SHA1 — 20 байт, SHA-256 возвращает 32. Но хорошо известно, что MD5 и SHA1 могут быть взломаны, поэтому выберите более безопасный SHA-256/512 и расширьте свою колонку. (Обратите внимание, что если вы преобразуете хэш в шестнадцатеричную строку, возможно, вам нужно удвоить эти размеры) - person Steve; 08.03.2017
comment
Если я все сделал правильно, я думаю, что использовал Hash512, который создал пароль из 88 символов. Является ли хорошей практикой использование вводимого пользователем пароля в виде строки и имени пользователя в виде соли? Что я и сделал. - person Reviyee; 08.03.2017
comment
На самом деле не stackoverflow.com/ вопросы/536584/ - person Steve; 08.03.2017