2017-03-08 6 views
1

Ich habe diese DataTable Ich möchte Daten einfügen, aber ich bekomme einen Fehler jedes Mal, wenn ich diesen Code ausführen.Einfügen von Daten in MySQLTable mit Hilfe von Params

„Unbekannter Datentyp“

Ich habe eine Funktion auf einem Modul, das (so habe ich es nicht neu schreiben, und ich kann es von jeder Form nennen), um die MySQL-Verbindung zu öffnen.

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 

So nenne ich dies die Serverconnection-Funktion und speichern Sie die Verbindung zu einem öffentlichen var genannt MyConnection verwenden, die ich von jeder anderen Form nennen kann.

Die Sache ist, habe ich diesen Code ein Konto zu erstellen, die Daten in eine Tabelle einfügt: (tut mir Leid der spanischen einfach den Code überprüfen und die Sendmail-Funktion nichts dagegen.)

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 

Noch einmal, sorry über das Spanisch. Meine Konten Tabelle auf der titulo Datenbank sind folgende Datentypen id INT NOT NULL AUTO_INCREMENT,

accountName VARCHAR (10) NOT NULL,

accountPassword VARCHAR (16) NOT NULL,

accountMail VARCHAR (60) NOT NULL,

accountLogon VARCHAR (22) NOT NULL,

Ich werde jede Hilfe zu schätzen wissen, wenn sie zur Verfügung gestellt wird.

Antwort

1

MySql-Code sollte MySqlDbType Enumeration verwenden, um den Datentyp der Parameter zu definieren. Sie verwenden den SqlDbType.

Sie Dieser Code wird zeigen, dass die beiden

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

Ausgang ist den gleichen Wert haben nicht

SqlDbType.VarChar = 22 
MySqlDbType.VarChar = 253 

Unrelated auf Ihre eigentliche Problem, aber ich brauche Sie über eine große beraten Sicherheitsrisiko in Ihrem Code. Passwörter nicht im Klartext speichern. Verwenden Sie immer einen Hashalgorithmus und einen Salzenschlüssel, um irreversible Bytes des Benutzerkennworts zu speichern.

Best way to store password in database

+0

Vielen Dank für die Korrektur. Ich werde sicher sein, es zu versuchen, und mir ist das Passwort-Sicherheitsproblem bekannt, aber ich habe es noch nicht gesehen. Vielen Dank für die Antwort! – Reviyee

+0

In dem Fall, ich hasse mein Passwort, das in MySQL auf einem varchar (16) gespeichert ist, wenn das Ergebnis der Hash-Ausgaben, sagen wir, ein 30-stelliges Passwort, muss ich die Kapazität in der Passwort-Spalte erweitern, nicht wahr? – Reviyee

+0

Wenn ich nicht falsch liege, wird die Länge des resultierenden Hashes entsprechend dem verwendeten Algorithmus festgelegt. MD5 erzeugt einen 16-Byte-Hash, SHA1 geht für 20 Byte, SHA-256 gibt 32 zurück. Aber MD5 und SHA1 sind dafür bekannt, dass sie zerbrechlich sind. Gehen Sie also zu dem sichereren SHA-256/512 und vergrößern Sie Ihre Spalte. (Beachten Sie, dass wenn Sie den Hash in hexadezimale Zeichenfolge konvertieren dann wahrscheinlich müssen Sie diese Größen verdoppeln) – Steve