2011-08-18 46 views
4

我正在重寫一個MS Access數據庫到SQL服務器的過程中,並發現了一個奇怪的問題,我希望有人可以幫助。MS Access是否可以抑制插入上的主鍵衝突?

我有一個表讓我們把它稱爲'主',並在索引的帳戶上使用主鍵,但不允許重複。似乎很簡單,但是當數據被插入時我的問題正在發生。

我的INSERT查詢(場的數量被限制爲簡潔起見)

INSERT INTO Main (Account, SentDate, Amount) 
SELECT C.Account, C.SentDate, C.Amount 
FROM 
    (CALLS C LEFT JOIN Bals B ON C.Account = B.ACCT_ID) 
LEFT JOIN AggAnt A ON C.Account = A.Account 

的問題是這樣的,如果我跑我查詢的SELECT部分我得到2365條記錄,但是當我運行INSERT我得到2364條記錄。所以我做了一些檢查,我發現一個帳戶是重複的記錄之間的差異是SentDate和金額。但是Access只插入其中一條記錄,並且不會拋出任何類型的錯誤信息或任何東西。沒有什麼該說,選擇最近的日期查詢等

樣本數據:

Account SentDate Amount 
12345678 8/1/2011 123.00 
23456789 8/1/2011 45678.00 
34567890 8/1/2011 7850.00 
45678912 8/1/2011 635.00 
45678912 5/1/2011 982.00 
56789123 8/1/2011 2639.00 

在樣品我有一個重複的45678912當我跑我的INSERT一個賬號,我沒有得到任何錯誤和我從2011年8月1日獲得記錄。

爲什麼Access在違反桌面PK時不會拋出錯誤? Access中有沒有選擇一個記錄而只是跳過另一個記錄?

我完全被這個問題困住,所以任何幫助都會很棒。

回答

2

HansUp指出我在檢查SetWarnings = false的方向後。我發現它被埋在我的代碼中,這就是爲什麼沒有關於由於主鍵違規而未插入記錄的警告消息。

謹慎的一句話是確保你想要這些消息被抑制。

+1

在Access中執行SQL的唯一可靠方法是使用'.Execute strSQL,dbFailOnError'。 DoCmd.OpenQuery和DoCmd.RunSQL都是應該避免的,因爲當您關閉SetWarnings時,您不知道哪些錯誤對您隱藏。我寫了一個函數,SQLRun(),作爲我多次發佈的DoCmd.RunSQL的替代品。它只是'.Execute,strSQL,dbFailOnError'的一個包裝,所以你不必每次都寫錯誤處理程序。在SO上搜索並嘗試一下。 –

+0

感謝您指點我的功能。我會看看未來的用途。我目前的應用程序正在重寫,我不會對已經非常不穩定的應用程序進行任何代碼更改。 – Taryn

+0

@ David-W-Fenton:「在Access中執行SQL的唯一可靠方法...」...使用DAO時。 – onedaywhen

4

你如何運行查詢?如果您使用的是DoCmd.RunSQL,請切換到使用DAO數據庫對象的.Execute方法,並使用dbFailOnError

Dim db As DAO.Database 
Dim strInsert As String 
strInsert = "your insert statement" 
Set db = CurrentDb 
db.Execute strInsert, dbFailOnError 
Set db = Nothing 

編輯:如果主要是一個ODBC連接到SQL Server表,我會研究Errors Collection (DAO)db.Execute strInsert, dbFailOnError

+0

我目前使用DoCmd.OpenQuery「queryname」,acViewNormal,acEdit運行我的查詢並且沒有得到任何錯誤,但它也通過雙擊運行查詢我仍然沒有錯誤並且它成功運行。 – Taryn

+0

請求您確認時顯示哪個號碼? – HansUp

+0

它不顯示任何奇怪的部分。 – Taryn

2

有一些怪癖在訪問[更新]一個記錄和公正跳過 其他?

是的,您可以在引擎級別(如果使用OLE DB在記錄集級別)控制此行爲。

對於OLE DB(例如ADO)的設置是Jet OLEDB:Global Partial Bulk Ops

確定何時SQL DML散裝 操作失敗Jet數據庫引擎的行爲。設置爲允許批量操作的部分完成時,可能會發生不一致的更改,因爲某些 記錄上的操作可能成功,而其他操作可能會失敗。當設置爲不允許 批量操作的部分完成時,如果發生單個錯誤 ,所有更改將回滾。該噴氣OLEDB:全局部分批量行動 屬性設置可以以每個記錄基礎上,通過 覆蓋設置噴氣OLEDB:部分批量行動財產在 屬性集合記錄對象。

請注意,缺省值是不允許部分完成批量操作。

+0

但是,這是Jet的默認行爲,當不具體告訴訪問IGNORE錯誤(這是您使用OpenQuery或RunSQL與SetWarnings關閉時正在做什麼)。 –