2017-10-15 3 views
-2
Private Sub recruit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles recruit.Click 
    Dim query3 As String 
    Dim n As Integer 
    Dim query2 As String = "select max(stag) from agent" 
    con.ConnectionString = ("Data Source=DESKTOP-CTN5IJ3\SQLEXPRESS;Integrated Security=True") 
    Dim autono As New SqlCommand(query2, con) 
    con.Open() 
    If IsDBNull(autono.ExecuteScalar) Then 
     n = 7 
    Else 
     n = autono.ExecuteScalar + 5 
    End If 
    con.Close() 
    query3 = "insert into agent values(" + n + ",'" + ncrypt(txtssn.Text) + "','" + ncrypt(txtname.Text) + "','" + ncrypt(txtadd.Text) + "',0,0,'newbpwd')" 
    Dim save As New SqlCommand(query3, con) 
    con.Open() 
    save.ExecuteNonQuery() 
    con.Close() 
End Sub 

// requete3 = "insérer dans les valeurs d'agent (" + n + », » + ncrypt (txtssn.Text) + "'," "+ ncrypt (nomtxt.Text) +"', "" + ncrypt (txtadd.Text) + "', 0,0,' newbpwd ')" c'est là le problème est dit"Conversion de chaîne "insérer dans les valeurs d'agent (" taper 'Double' est pas valide." Dans vb.net

+0

double possible de [La différence entre + et & pour l'assemblage des chaînes en VB.NET] (https://stackoverflow.com/questions/734600/the-difference-between-and-for-joining-strings -in-vb-net) –

+1

Votre code est également vulnérable à l'injection SQL. Veuillez utiliser [** requêtes paramétrées **] (https://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/) à la place. –

+0

Re Injection SQL, voir: [Exploits d'une maman] (https://xkcd.com/327/) alias "Little Bobby Tables". – zaph

Répondre

1

en vb, vous utilisez « & » symbole plutôt que « + » pour concaténer des chaînes

3

Votre principal problème est que vous utilisez mauvais opérateur de concaténation de chaîne. utilisez & au lieu de +.

Une autre approche utilise l'interpolation de chaîne

Dim n As Integer = 101 
Dim query = $"INSERT INTO table VALUES ({n})" 

Mais si vous avez du début en utilisant correctement SqlParameters pour passer des valeurs à la requête SQL - vous aurez pas besoin de concaténer des chaînes du tout.
En utilisant SqlParameter, vous garderez votre coffre-fort de Sql Injection possible avec votre code actuel.

Private Sub recruit_Click(sender As Object, e As EventArgs) Handles recruit.Click 
    Dim connectionString = _ 
     "Data Source=DESKTOP-CTN5IJ3\SQLEXPRESS;Integrated Security=True" 
    Dim newId As Integer = 7 

    Using connection As New SqlConnection(connectionString) 
     Dim query As String = "select max(stag) from agent" 
     Using command As New SqlCommand(query, connection) 
      connection.Open() 
      Dim result = command.ExecuteScalar() 
      If result IsNot DbNull.Value Then 
       newId = DirectCast(result, Integer) + 5 
      End If 
     End Using 
    End Using 


    Using connection As New SqlConnection(connectionString) 
     Dim query As String = _ 
      "insert into agent values (@Id, @SSN, @Name, @Add, 0, 0, 'newbpwd')" 
     Using command As New SqlCommand(query, connection) 
      Dim parameters As New List(Of SqlParameter) From 
      { 
       New SqlParameter With { .ParameterName = "@Id", .SqlDbType = SqlDbType.Int, .Value = newId }, 
       New SqlParameter With { .ParameterName = "@SSN", .SqlDbType = SqlDbType.VarChar, .Value = ncrypt(txtssn.Text)}, 
       New SqlParameter With { .ParameterName = "@Name", .SqlDbType = SqlDbType.VarChar, .Value = ncrypt(txtname.Text)}, 
       New SqlParameter With { .ParameterName = "@Add", .SqlDbType = SqlDbType.VarChar, .Value = ncrypt(txtadd.Text)}, 
      } 
      command.Parameters.AddRange(parameters) 

      connection.Open() 
      command.ExecuteNonQuery() 
     End Using 
    End Using 
End Sub 
+0

les fichiers d'en-tête que je dois utiliser? –

+0

Qu'est-ce que vous entendez par "en-tête" des fichiers? – Fabio

+0

System.Data.SqlClient est le fichier d'en-tête que j'ai importé dans mon programme. –