2013-04-23 57 views
0

好吧,我正在爲VB.net II的最終項目工作。我爲酒店住宿情況創建了一個項目,並且我的一切都很完美。然而,我需要幫助,添加一些東西。如何將某些值(包括從其他表中拉出的客戶ID)插入到單獨的表中

我已經把它交給了你的新客人/客戶或者回來的地方。如果您的新用戶在提交表單時將客戶信息添加到數據庫中。我的Access數據庫有兩個表格:客戶客戶住所

現在,它們中的主鍵都是一個字段,名爲:CustomerID並且它們在數據庫本身中有一個關係。

Customer表領域包括:客戶ID客戶名稱CustomerAddressCustomerZipcode,並CustomerTagNumber

CustomerStays表領域包括:客戶IDCustomerDateInCustomerDateOut,並TotalDays

這裏是我的主要形式的圖像:Main Form

當他們點擊逗留總,在這裏是通過與它

Private Sub TotalForStayBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TotalForStayBtn.Click 

    ErrorChecking() 'Sub routine that checks for errors 

    If YourGood = True Then 'Only good if you pass the error check 

     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
     ''''''''''''''''ADDING CUSTOMER INFORMATION TO THE DATABASE'''''''''''''''' 
     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 

     If ExistingCustomer = False Then 

      Try 

       myconnection.Open() 

       Dim str As String 

       str = "SELECT * FROM Customer WHERE CustomerTagNumber='" & CustomerTagNumbertxt.Text & "'" 

       Dim cmd As OleDbCommand = New OleDbCommand(str, myconnection) 

       dr = cmd.ExecuteReader 

       If dr.Read Then 

        If MsgBox("That license plate tag number already exists. Are you an existing customer?", MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then 

         ReturningCustomerLookup.Show() 
         Me.Close() 

        ElseIf MsgBoxResult.No Then 

         MessageBox.Show("Please re-enter your own license plate tag number and verify that it is entered correctly.") 

        End If 

       Else 

        str = "INSERT INTO Customer (CustomerName, CustomerAddress, CustomerZip, CustomerTagNumber)" _ 
         & " VALUES ('" & CustomerNametxt.Text & "','" _ 
         & CustomerAddresstxt.Text & "','" _ 
         & CustomerZipCodetxt.Text & "','" _ 
         & CustomerTagNumbertxt.Text & "')" 

        cmd = New OleDbCommand(str, myconnection) 
        cmd.ExecuteNonQuery() 
        MessageBox.Show("Your information has been successfully added to the database", "Successful") 

        '''''''CALCULATING THE TOTAL''''''' 
        CalculateTotal() 
        '''''END CALCULATING THE TOTAL''''' 

        '''''''ADDING DATES INFO TO DATABASE''''''' 
        **CustomerStaysInsertion()** 
        '''''END ADDING DATES INFO TO DATABASE''''' 

       End If 

      Catch ex As Exception 
       MessageBox.Show("There was an error inserting your information into the database" _ 
           & vbCrLf & vbCrLf & "Original Error: " & ex.ToString, _ 
           "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      Finally 
       myconnection.Close() 
      End Try 

      ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
      ''''''''''''''END ADDING CUSTOMER INFORMATION TO THE DATABASE'''''''''''''' 
      ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 

     Else 

      '''''''CALCULATING THE TOTAL''''''' 
      CalculateTotal() 
      '''''END CALCULATING THE TOTAL''''' 

     End If 

    End If 

End Sub 

進入現在的代碼我的問題是CustomerStays信息。它運行子程序和我想要它做的是使用客戶的信息搶客戶ID客戶表,並將作爲客戶IDCustomerStays與他們檢查日期進行表入住和退房以及入住天數。

基本上,我需要它將所有這些信息與屬於當前入住酒店的客戶的CustomerID一起插入。

附加信息:

名稱對於某些控件:

日期在 - DateInPicker

日期出來 - DateOutPicker

總天數 - TotalDayslbl

+0

是的,兩個表中的主鍵稱爲CustomerID。他們隨時待命,他們的客戶ID保持不變,因爲如果他們輸入相同的信息,程序就會將其作爲回頭客。他們的CustomerStays表用於跟蹤客人單獨入住酒店。同一位客人可以多次逗留,因此他們的每位客人的客戶ID都必須屬於一位客人。 – 2013-04-23 16:14:25

+0

在這種情況下CustomerStays中的CustomerID稱爲[ForeignKey](http://en.wikipedia.org/wiki/Foreign_key)不是PrimaryKey – Steve 2013-04-23 16:24:54

+0

在任何情況下,我需要從Customer表中獲取customerid以將其插入到其他信息中進入customerstays表的customerid。我怎麼做? – 2013-04-23 16:36:32

回答

1

首先,如果不是已設置,您需要將Customer表上的CustomerID設置爲Autonumber,所以它的值是爲你自動生成的。

然後,假設你沒有併發插入你的客戶表,你可以抓住最後插入自動編號執行以下OleDbCommand的,只是將新客戶爲ExecuteNonQuery後,

cmd.ExecuteNonQuery() 
    cmd.CommandText = "SELECT @@IDENTITY" 
    Dim result = Convert.ToInt32(cmd.ExecuteScalar()) 

然後變量result應該在Customer表的CustomerID列中具有最後插入的值。

說,請採納建議來改變你發出你的sql命令到數據庫的方式。 字符串連接實際上是一種不好的做法,應該不惜一切代價避免。
僅舉例來說,如果客戶被稱爲John O'Hara,您的代碼會發生什麼?注意單引號?當您在文本框中連接字符串時,查詢文本將導致不正確的sql語句。但是,這僅僅是一個語法錯誤,最差的是Sql Injection scenario described here

這是怎麼寫的插入查詢的例子(但它適用於每一個地方,你需要使用你的malicious用戶鍵入的文本查詢)

str = "INSERT INTO Customer (CustomerName, CustomerAddress, CustomerZip, CustomerTagNumber)" _ 
        & " VALUES (?,?,?,?)" 
cmd = New OleDbCommand(str, myconnection) 
cmd.Parameters.AddWithValue("@p1", CustomerNametxt.Text) 
cmd.Parameters.AddWithValue("@p2", CustomerAddresstxt.Text) 
cmd.Parameters.AddWithValue("@p3", CustomerZipCodetxt.Text) 
cmd.Parameters.AddWithValue("@p4", CustomerTagNumbertxt.Text) 
cmd.ExecuteNonQuery() 

以這種方式,單引號的問題由框架代碼解決,這也避免了Sql注入混亂。

編輯
對於CustomerStays字段(日期時間),而不是使用這個

 Dim str As String 
     str = "INSERT INTO CustomerStays (CustomerID, CustomerDateIn, CustomerDateOut, TotalDays)" _ 
         & " VALUES (?,?,?,?)" 

     Dim cmd As OleDbCommand = New OleDbCommand(str, myconnection) 
     cmd.Parameters.AddWithValue("@p1", result) 
     cmd.Parameters.AddWithValue("@p2", Convert.ToDateTime(DateInPicker.Value) 
     cmd.Parameters.AddWithValue("@p3", Convert.ToDateTime(DateOutPicker.Value) 
     cmd.Parameters.AddWithValue("@p4", TotalDayslbl.Text) 
     cmd.ExecuteNonQuery() 

如果TotalDays是數字Convert.ToInt32(TotalDayslbl.Text).....

+0

好吧,現在我已經使用了參數添加值,它的效果很好。現在我遇到了一個小數據不匹配問題,我很樂意獲得幫助。這是直到** CustomerStays **表的問題的原始部分。我遇到數據不匹配錯誤,我相信它與日期本身有關。 在數據庫中的CustomerDateIn和CustomerDateOut是日期/時間類型的(我使用的訪問只是作爲一個提醒) 以下是一個子程序代碼的副本: http://pastebin.com/fJmGJywz 我也試過沒有「#」的附加值的第二部分。 – 2013-04-24 14:50:04

+0

是的,如果您嘗試在非文本字段中插入值,則需要傳遞正確數據類型的參數。實際上,罪魁禍首就是AddWithValue的簡單性,它決定數據類型通過查看值的數據類型。在你的情況下,你傳遞字符串(#是VBA/VB6的工件),這不是數據庫期望的。我將添加到回答所需的語法 – Steve 2013-04-24 14:58:07

+0

仍然數據類型不匹配:(我不知道爲什麼! http://i584.photobucket.com/albums/ss289/Firstgamefreak/customerstays.jpg http:// i584。的photobucket。com/albums/ss289/Firstgamefreak/Error.jpg – 2013-04-24 15:07:47