2017-05-15 103 views
1

我能够创建注册,但我不确定如何检查数据库中是否存在电子邮件。我需要首先搜索数据库还是有一行代码可以使用?查看电子邮件是否存在

MyConn = New OleDbConnection 
MyConn.ConnectionString = connString 
MyConn.Open() 

Dim cmd1 As OleDbCommand = New OleDbCommand(str1, MyConn) 
str1 = "insert into UserData ([First Name], [Last Name], [Email], [Address], [Phone Number], [Username], [Password]) values (?, ?, ?, ?, ?, ?, ?)" 

cmd1.Parameters.Add(New OleDbParameter("First Name", CType(TxtFirstNameReg.Text, String))) 
cmd1.Parameters.Add(New OleDbParameter("Last Name", CType(TxtLastNameReg.Text, String))) 
cmd1.Parameters.Add(New OleDbParameter("Email", CType(TxtEmailReg.Text, String))) 

cmd1.Parameters.Add(New OleDbParameter("Address", CType(TxtAddress.Text, String))) 

cmd1.Parameters.Add(New OleDbParameter("Phone Number", CType(TxtPhoneNumReg.Text, String))) 
cmd1.Parameters.Add(New OleDbParameter("Username", CType(TxtUsernameReg.Text, String))) 

cmd1.Parameters.Add(New OleDbParameter("Password", CType(TxtPasswordReg.Text, String))) 

Try 

    cmd1.ExecuteNonQuery() 
    cmd1.Dispose() 

    MsgBox("Your account has been created") 

    Dim objOutlook As Object 
    Dim objOutlookMsg As Object 
    objOutlook = CreateObject("Outlook.Application") 
    objOutlookMsg = objOutlook.CreateItem(0) 
    With objOutlookMsg 
     .To = TxtEmailReg.Text 
     .Subject = "Registration Confirmation" 
     .Body = "Thank you for registering with Hotel Booking System, your login details for this account are as follows" & Environment.NewLine & Environment.NewLine & " Username: " & TxtUsernameReg.Text & Environment.NewLine & " Password: " & TxtPasswordReg.Text 
     .Send() 
    End With 
    objOutlookMsg = Nothing 
    objOutlook = Nothing 


Catch ex As Exception 
    'MsgBox(ex.Message) 
End Try 
MyConn.Close() 

回答

0

我会先检查数据库,查看电子邮件地址是否存在:

Using con As New OleDbConnection(connString), 
     cmd As New OleDbCommand("SELECT * FROM [UserData] WHERE [Email] = ?", con) 

cmd.Parameters.Add(New OleDbParameter("@Email", OleDbType.VarChar)).Value = TxtEmailReg.Text 

    con.Open() 

    If cmd.ExecuteReader().HasRows Then 
    'Record exists 
    End If 

End Using 

请注意,我已经实现Using

有时你的代码需要非托管资源,例如作为文件句柄,COM包装器或SQL连接。使用块可以保证在您的代码完成后处置一个或多个这样的资源。这使它们可供其他代码使用。

我还会在传递参数时指定数据类型。在你的情况下,它可能并不重要,但我仍然会考虑使用OleDbParameter Constructor (String, OleDbType)添加您的参数。在这一点上,值得注意的是,当使用OleDbParameter时,这个顺序非常重要,而不是名称。您已经有了正确的订单,但想要指出这一点以备将来参考。

您也不需要以您所使用的方式使用CType.Text属性已经是String类型,所以在这种情况下使用CType实际上并没有做任何事情。

请注意,ExecuteNonQuery会告诉您有多少行受到影响。这是值得检查的。

处理Outlook时,请考虑使用Microsoft.Office.Interop.Outlook命名空间直接使用对象。你将不得不下载这些,但它很简单。只需要一个Google。我还会考虑实施一些代码来帮助释放这些对象。这code基于Siddharth Rout答案:

Private Sub ReleaseObject(ByVal obj As Object) 
    Try 
     Dim intRel As Integer = 0 
     Do 
      intRel = System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) 
     Loop While intRel > 0 
     obj = Nothing 
    Catch ex As Exception 
     obj = Nothing 
    Finally 
     GC.Collect() 
    End Try 
End Sub 

我已经把一点点的示例代码,这将有望给你一个良好的开端:

Dim addressExists As Boolean = False 
Dim userAdded As Boolean = False 

Using con As New OleDbConnection(connString) 
    Using cmd As New OleDbCommand("SELECT * FROM [UserData] WHERE [Email] = ?", con) 

     cmd.Parameters.Add(New OleDbParameter("@Email", OleDbType.VarChar)).Value = TxtEmailReg.Text 

     con.Open() 

     If cmd.ExecuteReader().HasRows Then 
      addressExists = True 
     End If 

    End Using 

    If addressExists Then 
     MessageBox.Show("Email address already exists.", "Email Exists", MessageBoxButtons.OK, MessageBoxIcon.Error) 
    Else 
     Using cmd As New OleDbCommand("INSERT INTO [UserData] ([First Name], [Last Name], [Email], [Address], [Phone Number], [Username], [Password]) VALUES(?, ?, ?, ?, ?, ?, ?)", con) 

      cmd.Parameters.Add(New OleDbParameter("@FirstName", OleDbType.VarChar)).Value = TxtFirstNameReg.Text 
      cmd.Parameters.Add(New OleDbParameter("@LastName", OleDbType.VarChar)).Value = TxtLastNameReg.Text 
      cmd.Parameters.Add(New OleDbParameter("@Email", OleDbType.VarChar)).Value = TxtEmailReg.Text 
      cmd.Parameters.Add(New OleDbParameter("@Address", OleDbType.VarChar)).Value = TxtAddress.Text 
      cmd.Parameters.Add(New OleDbParameter("@PhoneNumber", OleDbType.VarChar)).Value = TxtPhoneNumReg.Text 
      cmd.Parameters.Add(New OleDbParameter("@Username", OleDbType.VarChar)).Value = TxtUsernameReg.Text 
      cmd.Parameters.Add(New OleDbParameter("@Password", OleDbType.VarChar)).Value = TxtPasswordReg.Text 

      If cmd.ExecuteNonQuery() = 1 Then 
       userAdded = True 
      End If 
     End Using 
    End If 
End Using 

If userAdded Then 

    MessageBox.Show("Your account has been created", "Account Created", MessageBoxButtons.OK, MessageBoxIcon.Information) 

    Dim oApp As New Outlook.Application 
    Dim oMessage As Outlook.MailItem = DirectCast(oApp.CreateItem(Outlook.OlItemType.olMailItem), Outlook.MailItem) 
    With oMessage 
     .To = TxtEmailReg.Text 
     .Subject = "Registration Confirmation" 
     .Body = .Body = "Thank you for registering with Hotel Booking System, your login details for this account are as follows" & Environment.NewLine & Environment.NewLine & " Username: " & TxtUsernameReg.Text & Environment.NewLine & " Password: " & TxtPasswordReg.Text 
     .Send() 
    End With 

    ReleaseObject(oMessage) 
    ReleaseObject(oApp) 

End If 

这是这个问题的范围之外,但我也会考虑加密密码。将它们存储为纯文本是不好的做法。看看这个SO问题; Best way to store password in database,这可能会给你一些关于如何最好地做到这一点的想法。

我希望这可以让你继续下去。

相关问题