2013-11-22 44 views
1

我們有一個可以訪問SQL Server數據庫(2008 R2)的傳統FoxPro(版本9)應用程序。我們正在開發一個新版本的系統(不使用FoxPro),它需要對數據模型進行更改,但需要提供與原始應用程序的向後兼容性。不幸的是,有很多FoxPro代碼,並且對其進行更改並不是一個非常有吸引力的選項。還有一些情況,這樣的處理空值,我不知道可以在FoxPro中完成。FoxPro和SQL Server而不是觸發器

爲了提供與遺留代碼的兼容性,我的第一個想法是使用視圖和替代觸發器在數據庫中創建一個接口。視圖將被命名爲與舊錶相同的名稱,並在選擇數據時執行任何必要的轉換或映射。我還會創建一系列將來自FoxPro的DML語句映射到新數據庫結構的替代觸發器。這樣FoxPro就會認爲它正在查詢相同的數據庫結構,而新的應用程序代碼將直接訪問新的數據庫表。

我創建了幾個視圖和相關的觸發器,一切正常使用直接的SQL。 SQL Server Management Studio中運行的語句以及在FoxPro中使用「execsql」命令執行的語句按預期工作。但是,FoxPro使用的遊標適配器中似乎存在一些問題。從我可以確定的光標適配器基本上是ADO對象的包裝,但我對此不積極。

我遇到了兩個問題。第一個看起來是由於遊標適配器確定它正在查詢視圖並試圖獲取底層表。如果視圖是一個簡單的「select * from some_table」,那麼視圖的任何更新都直接在基礎表上執行。這會導致它繞過視圖上的任何觸發器,並且不會發生所需的任何數據轉換(如0到null)。

第二個問題發生在視圖更復雜時,或者是由於數據的連接或某些操作。遊標適配器仍然能夠讀取數據而沒有問題,但是任何插入或更新都會導致有用的錯誤消息「Microsoft Cursor Engine:多步操作生成錯誤」。

我猜這是一個相當獨特的情況,很可能是一個無法解決的情況。但我想我會在這裏發佈它,以防萬一以前遇到過這類問題。

感謝您的任何信息,指針或建議。

編輯
更多挖後我來的結論是,一個遊標適配器是一個前端到一個更新的ADO記錄集。它生成的一些錯誤消息涉及到OLE DB,我還發現了一個old article,它討論了ADO如何獲取查詢的基表和列並將其用於更新。這與我所看到的行爲相符。

鑑於上述我不相信有任何解決此行爲的方法(作者稱之爲「優雅」,但我會用一個非常不同的術語)。但是,如果有人對ADO的內部工作有更多的瞭解,可能會在這個問題上提供更多的信息,我很樂意聽到它。

再次感謝。

回答

0

是的,這是傳統ADO API中的一種可惡的做法。我能想到的它周圍的一個可行的辦法,但是,我從來沒有機會嘗試在ADO,所以我不知道該怎麼好它可能工作:

關閉View元:

的能力查看錶源(例如View)的內部結構是SQL Server的權限,它實際上是讀取和寫入數據庫所需的實際權限。它通常默認授予,但您也可以刪除此權限。

如果這樣做,這會破壞ADO或使其按照應有的方式行事,因爲它不再知道是「基礎表」。