話說,我有個現場設備拆回來維修,我打算把資料庫備份出來後,遷移到現場替代機上。
大部分情況,我會使用 Access ,但是這個現場資料庫用 SQL Server Express 2014 ,超過 255 欄,所以需要尋找替代方案。
首先我想起 SQL Server Compact Edition (SQL CE) ,因為幾年前在用 SQL Server Express 2008 R2 時,內建支援 Compact ,而且在 Visual Studio 2010 也可以用,也可以內建支援。
一測試才發現,大糗。
SQL Server 2012 / Visual Studio 2012 以後版本預設都沒支援。 Visual Studio 2010 使用 SQL CE 的說明文件:
https://msdn.microsoft.com/zh-tw/library/gg606540.aspx
而且最慘的是 SQL CE 沒出現在 oledb providers (提供者) 清單中,根本不知道怎樣玩下去。
這是 「SQL Server 2014 匯入和匯出資料 (64 位元)」 找不到 SQL CE 的畫面:
SQL Server 2014 匯入和匯出資料 (64 位元)
這是 Visual Studio 2015 IDE 找不到 SQL CE 的畫面:
Visual Studio 2015 IDE
這是開新的 udl 找不到 SQL CE 的畫面:
開新的 udl
當然,這邊先說一下,為啥用 oledb 的原因,就是使用 oledb 不綁 .Net framework 版本。SQL CE 有 2005/3.0/3.5/4.0 不同版本,各版本還有出 Service Pack ,但是使用不同版本相對的 .Net framework 也要對應相對版本,2005 就對應到 .Net framework 2.0 ,所以還是採用 oledb 彈性較大。
引用 MSDN 相關說明:「除非您使用 OLEDB 資料提供者,否則需要 Microsoft.NET Framework 4 或更新版本才能安裝 SQL Server Compact 4.0。」
https://technet.microsoft.com/zh-tw/library/bb190958%28v=sql.110%29.aspx
首先,先用 .Net framework 內建的 OleDbEnumerator 列舉 oledb 的提供者,沒找到 SQL CE:
https://msdn.microsoft.com/zh-tw/library/system.data.oledb.oledbenumerator.aspx
OleDbEnumerator 列舉下拉式選單
註:圖中下拉式選單是用 OleDbEnumerator 傳回的 SOURCES_NAME – SOURCES_DESCRIPTION 格式顯示
由於找不到 SQL CE ,我在這個網站下載了 x86/x64 的工具來查看看:
http://www.sqledit.com/odbc/oledb-provlist.html
x86 的畫面
x86 的畫面
x64 的畫面
x64 的畫面
在 google 上翻找了兩天,最後是我以前在 2010 曾經存了一個 oledb.reg 在 SQL CE 3.5 SP2 目錄下,裡面有 OLE DB Provider ,從這關鍵字再回頭 google 。
先找到 Connect 上有人回報的問題,微軟簡單說明說,因為 SQL CE 在 oledb 支援不完整,所以後來沒列在 oledb 提供者清單上:
https://connect.microsoft.com/SQLServer/feedback/details/546133/sql-server-compact-edition-3-5-oledb-driver-not-listed
在找到相關討論,列出比較重要的兩篇:
http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.database.ado/2008-02/msg00080.html
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/cc6db680-1d33-4c9b-8b67-9334b3383904
在開發機測試一下,分別做了兩個註冊資訊檔案匯入:
oledbSqlCe35.reg for SQL CE 3.5 SP2
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{F49C559D-E9E5-467C-8C18-3326AAE4EBCC}\OLE DB Provider]
@="Microsoft SQL Server Compact OLE DB Provider 3.5"
oledbSqlCe40.reg for SQL CE 4.0 SP1
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{2006C53A-C915-41EA-BAA9-9EAB3A1FBF97}]
@="Microsoft.SQLSERVER.CE.OLEDB.4.0"
[HKEY_CLASSES_ROOT\CLSID\{2006C53A-C915-41EA-BAA9-9EAB3A1FBF97}\OLE DB Provider]
@="Microsoft SQL Server Compact OLE DB Provider 4.0"
為避免兩個版本混淆,建議 OLE DB Provider 下面字串明確列出版本,例如上面的 3.5 或是 4.0 。
另外 SQL CE 4.0 在原始預設註冊資訊為:
[HKEY_CLASSES_ROOT\CLSID\{2006C53A-C915-41EA-BAA9-9EAB3A1FBF97}]
@="Microsoft SQL Server Compact OLE DB Provider for Windows"
這邊建議依照我提供的修改,因為大部分軟體都會從這抓 oledb 的名稱,若是這邊不改,很多軟體連線字串不會組成 Microsoft.SQLSERVER.CE.OLEDB.4.0 ,就變成不能用。
在 x64 的電腦上,除了上面註冊資訊檔修改外,另外需要針對 x86 再修改,否則 x86 程式在 x64 作業系統上仍然會撈不到 oledb 提供者。
SQL CE 3.5
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{F49C559D-E9E5-467C-8C18-3326AAE4EBCC}\OLE DB Provider]
@="Microsoft SQL Server Compact OLE DB Provider 3.5"
SQL CE 4.0
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{2006C53A-C915-41EA-BAA9-9EAB3A1FBF97}]
@="Microsoft.SQLSERVER.CE.OLEDB.4.0"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{2006C53A-C915-41EA-BAA9-9EAB3A1FBF97}\OLE DB Provider]
@="Microsoft SQL Server Compact OLE DB Provider 4.0"
匯入完成後,就可以正確找到 oledb 並進行操作了:
這是 「SQL Server 2014 匯入和匯出資料 (32 位元)」 找到 SQL CE 的畫面:
SQL Server 2014 匯入和匯出資料 (32 位元)
這是 「SQL Server 2014 匯入和匯出資料 (64 位元)」 找到 SQL CE 的畫面:
SQL Server 2014 匯入和匯出資料 (64 位元)
這是 Visual Studio 2015 IDE 找到 SQL CE 並開啟載入的畫面:
Visual Studio 2015 IDE
這是開新的 udl 找到 SQL CE 的畫面:
開新的 udl
最後回頭用下載的工具來測,也可以正常找到 SQL CE 了:
x86 的畫面
x86 的畫面
x64 的畫面
x64 的畫面
註:我在有安裝 SQL Server 2014 / Visual Studio 2015 @Win81 x64/Win2012r2 x64 下,已有 SQL CE 4.0 ,不確定是安裝 MSSQL / VS 自己加進來還是 Win81/2012r2 內建,因為在控制台新增移除程式清單上沒看到。
[2016/10/03 補充]
VS2015 的 SSDT 更新,把 「SQL Server 2016 匯入和匯出資料 (32 位元)」也掛進來了,測了一下也可以正常抓到 SQLCE35/SQLCE40 的 oledb 清單,不過繁中做一半,上半部介面繁中,下半部按鈕全部英文~
SQL Server 2016 匯入和匯出資料 (32 位元)
SQL Server 2016 匯入和匯出資料 (32 位元)