使用Microsoft VBA中的腳本處理大型平面數據庫並在大約20個不同的表之間進行拆分。該腳本主要包括打開一個表格,檢查平面數據庫中的每一行以確保它不是重複的,然後添加必要的字段。對每個表重複。訪問VBA,未轉義的單引號,替換()和null
我第一次運行它,一切進展順利,直到我試圖處理名稱O'Malley
。我認爲很明顯哪裏出了問題。 Google上的快速搜索出現了this related StackOverflow post。我接受了他們的建議,並在將每個字段輸入新表之前添加了Replace(str, "'", "''")
。現在我遇到了一個新問題,而Google的幫助不大。
Replace(null, "'", "''")
會導致運行時錯誤,並且平面數據庫只會填充空值。我可以添加額外的線之上每Replace()
調用查看IsNull()
,如果這樣就把null
到數據庫中,而不是Replace(str, "'", "''")
,但我更希望可以放入一個單一的線,如果可能的解決方案。有沒有更好的方法來解決這個難題,或者我需要在我的代碼中使用216 If
?
編輯 -
另一個原因是我在尋找一個更好的解決方案是我的重複檢查代碼。目前,我有類似如下:
'Check for duplicates
'Assume student is duplicate if it shares:
' (StudentName and School) or SSN
Set rstDuplicate = CurrentDb.OpenRecordset("select * from Student where (StudentName = '" & Replace(rstFrom("Student").Value, "'", "''") & "' AND School = '" & Replace(rstFrom("School").Value, "'", "''") & "') OR SSN = '" & Replace(rstFrom("Social").Value, "'", "''") & "'")
If rstDuplicate.RecordCount = 0 Then
'Duplicate was not found
rstTo.AddNew
' Add fields to the new table
rstTo.Update
End If
由於Replace()
電話是內嵌的重複檢查,如果我改用If
語句來檢查null
那麼我將不得不要麼保存結果一個字符串或更新到平面數據庫。返回Replace(str, "'", "''")
或null
而不需要額外變量的函數將是理想的。
如果你必須改變216次,你做錯了。你有沒有想過重構檢查功能? – Jacob
另請參見:使用[參數化查詢](http://stackoverflow.com/questions/95277/how-do-you-create-a-parameterized-query-in-ms-access-2003-and-use-other-query -f)來逃避你的數據。 – Jacob
從閱讀你的第一段看來,你正在將你的數據分成20個相同結構的表,這幾乎肯定是一個壞主意。如果您碰到Access的2GB文件大小限制,唯一的原因是很有意義的。當然,在這種情況下,你應該考慮一個不同的數據庫後端。 – mwolfe02