2016-09-14 90 views
-2

我有數據庫表需要使用表單進行更新。 但是,表格中的所有字段都不必強制填寫。 我正在寫下面的VB代碼插入然而,我得到一個錯誤,說明在語句中有語法錯誤。據我所知,這是因爲變量中的空值。我知道我需要爲所有的空值使用DBNull.Value。 這裏的事情是有太多的字段來檢查值是否爲空。 任何機構都建議是否有辦法對輸入值爲空的值進行批量檢查?如何在插入查詢中忽略訪問中的空值

VBCode:

Dim StrSQL As String 
Dim StrSQL1 As String 
Dim tktID As Variant 
Dim Assi As Variant 
Dim reopened As Variant 
Dim valid As Variant 
Dim Reopenreason As Variant 
Dim ReassignmentAG As Variant 
Dim RBSCollab As Variant 
Dim SMEconf As Variant 
Dim Cloabag As Variant 
Dim smeName As Variant 
Dim Updat As Variant 
Dim Closed As Variant 
Dim iss As Variant 
Dim ana As Variant 
Dim res As Variant 
Dim rVariant As Variant 

' Assigining values 

tktID = Ticket_number.Value 
reopened = Ticket_Reopened.Value 
valid = Valid_Reopen.Value 
Assi = Assiginee.Value 
Reopenreason = Reopen_reason.Value 
ReassignmentAG = Reassignment_AG.Value 
RBSCollab = RBS_Collab.Value 
SMEconf = CkBxSMEConfirmation.Value 
Cloabag = Collabarated_AG.Value 
smeName = SME_Name.Value 
Updat = Update.Value 
Closed = Issue_Closed.Value 
iss = Issue.Value 
ana = Analysis.Value 
res = Resolution.Value 
rdate = Resolve_date.Value 

'Insert values into the tables 

StrSQL = "INSERT INTO Updates (TicketID,Assiginee,ReassignmentAG,RBSCollab,CollabAG,SMEconfirmation,SMEName,Update,IssueClosed,Issue,Analysis,Resolution,ResolveDate,TicketReopened,ValidReopen,ReopenReason) VALUES ('" & tktID & "','" & Assi & "','" & ReassignmentAG & "','" & RBSCollab & "','" & Cloabag & "','" & SMEconf & "','" & smeName & "','" & Updat & "','" & Closed & "','" & iss & "','" & ana & "','" & res & "','" & rdate & "','" & reopened & "','" & valid & "','" & Reopenreason & "') " 
DoCmd.RunSQL StrSQL 

在此先感謝您的幫助

+1

最好學會使用參數來避免sql注入和格式化問題。 – LarsTech

+0

我有很多字段,你可以。我不使用參數將有助於 – shravya

+0

你誤解了你會使用參數的原因。考慮一下'foo'的'Reopenreason'會發生什麼) DROP TABLE更新; - '。 – Comintern

回答

0

一個簡單的解決這個問題,可以使用插圖查詢,如果之前只檢查元素的值元素的值高於設定未定義與null。 將此值傳遞給查詢中的數據庫。

+0

正如你所見,這是我的問題我如何做這個質量檢查? – shravya

0

這樣做對每個字段:

tktID = IIF(ISNULL(Ticket_number.Value),"Null","'" & Ticket_number.Value & "'") 

然後,而不是這樣的:

VALUES ('" & tktID & "',... 

做這個

VALUES (" & tktID & ",... 

或者,如果你不介意與空字符串代替空:

tktID = Nz(Ticket_number.Value) 

會做到這一點。

當然,你至少應該確保沒有單引號是在蜇傷,所以甚至更好:

tktID = IIF(ISNULL(Ticket_number.Value),"Null","'" & Replace(Ticket_number.Value,"'","''") & "'") 
2

我也一樣,使用大量未綁定的控件和SQL語句的用於移動安裝我的第一個訪問數據庫周圍的數據。但這不是使用Access的方式。您應該使用綁定表單,其中控件根據綁定的表/列自動知道約束條件。

這意味着您編寫(和維護)的代碼要少得多,未來的開發人員可以查看您的Access應用程序並知道發生了什麼,因爲它將在Access範例中完成,並且如果您將盡可能多的邏輯放入表/關係如果有人出現並鏈接到您的ACCDB或打開後端,他們可能會輸入數據,而不輸入錯誤的數據。

所以最終這是一個XY問題。擺脫所有這些代碼(尤其是DoCmd.RunSQL)並創建一個綁定表單。將驗證邏輯放在表中的外鍵,驗證規則和/或數據宏中。

+0

我正在使用綁定窗體它自己並沒有任何問題添加它映射到的表中的詳細信息但是,當該窗體中的值被選中時我希望這些詳細信息被插入到另一個表中 – shravya

+0

@shravya我看到在這種情況下,請考慮進行查詢以插入這些值。那種在你運行時會提示你輸入的東西。然後通過'CurrentDb'QueryDefs'集合使用該查詢來執行插入操作。返回的QueryDef對象有一個'Parameters'集合。你可以添加你的空值到那個/ unsanitized輸入。如果我有一些時間,我可以更新/寫另一個答案。 – Brad

+0

或者,您可以使用具有某種巧妙綁定的子表單。 – Brad