2016-09-29 6 views
0

私はVisual Studioでサインアップフォームを作成しようとしていますが、動作していないようです。 Button1を押すと、Textbox1とTextbox2の値がデータベースに格納されます。SQL Visual Studioにデータを挿入

Public Class SignUp 
Dim mysqlConn As Data.SqlClient.SqlConnection 
Dim command As Data.SqlClient.SqlCommand 
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    mysqlConn = New Data.SqlClient.SqlConnection 
    mysqlConn.ConnectionString = ("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\NewFolder1\Members.mdf;Integrated Security=True") 
    Dim reader As Data.SqlClient.SqlDataReader 
    Try 
     mysqlConn.Open() 
     Dim query As String 
     query = "Insert into [User] ('username', 'password') VALUES (" & TextBox1.Text & " AND " & TextBox2.Text & ")" 'virker ikke 
     command = New SqlClient.SqlCommand(query, mysqlConn) 
     reader = command.ExecuteReader 
     mysqlConn.Close() 

     MessageBox.Show("Data Saved") 
    Catch ex As Exception 
     MessageBox.Show(ex.Message) 
    Finally 
     mysqlConn.Dispose() 

    End Try 

これは、列が間違っているというエラーが表示されます。

+0

例外が発生していますか?正確に何が起こっていますか? – Gaspa79

+0

クエリを実行するためにデータエリアを使用しています。接続オブジェクトでExecuteNonQueryメソッドを使用してみてください。 – Jeremy

+0

また、ユーザ名とパスワードの値パラメータを作成するか、一重引用符で囲む必要があります – soohoonigan

答えて

0

これはあなたのコードを動作させるはずです。それは全然良いプログラミングの練習ではありませんが、それはあなたが求めているものです。

Public Class Form1 
    Dim mysqlConn As Data.SqlClient.SqlConnection 
    Dim command As Data.SqlClient.SqlCommand 


    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 
     mysqlConn = New Data.SqlClient.SqlConnection 
     mysqlConn.ConnectionString = ("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\NewFolder1\Members.mdf;Integrated Security=True") 
     Dim RowsAffected As Integer 
     Try 
      mysqlConn.Open() 
      Dim query As String = "INSERT INTO [User] (username, password) VALUES (@Username, @Password)" 
      command = New SqlClient.SqlCommand(query, mysqlConn) 
         Dim paramUsername As New SqlClient.SqlParameter() With {.ParameterName = "@Username", .Value = TextBox1.Text, .Size = 50, .SqlDbType = SqlDbType.VarChar} 
         Dim paramPassword As New SqlClient.SqlParameter() With {.ParameterName = "@Password", .Value = TextBox2.Text, .Size = 50, .SqlDbType = SqlDbType.VarChar} 

      command.Parameters.Add(paramUsername) 
      command.Parameters.Add(paramPassword) 
      RowsAffected = command.ExecuteNonQuery 
      mysqlConn.Close() 
      If RowsAffected > 0 Then MessageBox.Show("Data Saved") 
     Catch ex As Exception 
      MessageBox.Show(ex.Message) 
     Finally 
      mysqlConn.Dispose() 
     End Try 
    End Sub 
End Class 

このバージョンでは、SQLインジェクションやO'Brianのような値から保護しなければならないSQLパラメータを使用しています。

他の人が言っているように(私たちもあなたに言った)、プレーンテキストでパスワードを保存することは本当に悪い考えです。私は知っている、あなたはそのアドバイスを求めていないが、何か公共の顔にこのコードを使用している場合は、あなたのパスワードをハッシュし、ハッシュ文字列を格納する必要があります。

-E

+0

整数に、より正確にはテキストボックスに変換することができます。助けて..? – Drax

+0

私のおかげで、SQLのパラメータコンストラクタが間違っていました。私は今それらを修正しました。 –

1

あなたのコードは次のようになります。

Option Infer On 
Option Strict On 

Imports System.Data.SqlClient 

Public Class Signup 

    Private Sub bnSignup_Click(sender As Object, e As EventArgs) Handles bnSignup.Click 
     Dim connStr = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\NewFolder1\Members.mdf;Integrated Security=True" 
     Dim query = "INSERT INTO [User] ([username], [password]) VALUES (@username, @password)" 

     'TODO: Hash the password to save it in the database. 

     Try 
      Using sqlConn As New SqlConnection(connStr) 
       Using command As New Sqlcommand(query, sqlConn) 
        command.Parameters.Add(New SqlParameter With {.ParameterName = "@username", .SqlDbType = SqlDbType.NVarChar, .Value = tbUsername.Text}) 
        command.Parameters.Add(New SqlParameter With {.ParameterName = "@password", .SqlDbType = SqlDbType.NVarChar, .Value = tbPassword.Text}) 

        sqlConn.Open() 
        command.ExecuteNonQuery() 
        sqlConn.Close() 

       End Using 
      End Using 

      MessageBox.Show("Data Saved") 

     Catch ex As Exception 
      MessageBox.Show(ex.Message) 
     End Try 

    End Sub 

    ' Other code... 

End Class 

Using構築物は、例外が発生した場合でも、あなたのためのアンマネージリソースを廃棄するの世話をします。

SqlParametersを使用すると、SQLインジェクション攻撃を防止し、アポストロフィなどの文字を問題なくSQL Serverに渡すことができます。

コントロールに意味のある名前を付けることをお勧めします。

パスワードを安全に保存する方法については、Salted Password Hashing - Doing it Rightをお読みください。

+0

このコードブロックは、私のデータベースの何かを変更していないようです..? – Drax

+0

データベースの内容はどうやって調べていますか? [SSMS](https://msdn.microsoft.com/en-us/library/mt238290.aspx)を使用して、キャッシュされたデータに問題がないようにするか、プログラムの中で何か不具合が生じないようにすることをお勧めします。 –

+0

そのローカルデータベースですが、悪いtry ssms – Drax

関連する問題