如何在 ASP.NET 專案中使用 SQL Server Compact 資料庫

  分享到噗浪!

最近在研究 SQL Server Compact ( 或稱 SQL CE ) 資料庫,也順帶研究如何才能讓 SQL CE 資料庫可以在 ASP.NET 環境中正常使用,由於 SQL CE 資料庫在定位上是比較屬於嵌入式資料庫( Embeded Database ),雖然在桌面環境也能使用,不過也僅建議用在「單人操作」的系統中,像對於 ASP.NET 這種多人同時使用的 Web 環境預設就不支援了。

如果你硬要將 SQL CE 資料庫 ( *.sdf ) 加入到 Visual Studio 專案中,其實也是可以正常開發,不過在執行的時候就會出現以下錯誤:

SQL Server Compact is not intended for ASP.NET development.

如果你一定要用的話,可以在 HttpApplication 的 Application_Start 事件 ( 在 Global.asax 中 ) 加入以下程式碼,即可讓 ASP.NET 支援 SQL Server Compact 資料庫運作:

AppDomain.CurrentDomain.SetData("SQLServerCompactEditionUnderWebHosting", true);

另外,因為 ASP.NET 預設不支援 SQL Server Compact 資料庫,所以當然在 Visual Studio 中也無法透過 Add New Item 的方式加入 "Local Database" 到專案中 ( 加入到 App_Data 目錄 ),我這次也是花了好幾個小時透過 Process Monitor 找出修改 Visual Studio 的方法,讓 Visual Studio 在 App_Data 目錄使用 Add New Item 的方式加入專案項目時,可以看見 "Local Database" 這個 Project Item,而 "Local Database" 就是 SQL Server Compact 資料庫在 Visual Studio 中的專案項目名稱。

如果修改成功,你就可以看到以下畫面:

Visual Studio 在 App_Data 目錄使用 Add New Item 的方式加入專案項目時,看見 "Local Database" 這個 Project Item

修改的步驟如下 (我是用 Visual Studio 2008 英文版,不過中文版的改法應該是一樣的):

  1. 先開啟 regedit 並找到以下機碼 ( 建議先匯出備份此機碼,否則要是不小心改壞或誤刪就麻煩了 )
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Packages\{349C5850-65DF-11DA-9384-00065B846F21}\AddNewItemFilters
  2. 接著找到該機碼下的一個 ExcludedTemplates 子機碼,找到 EmptyDatabase2.vstemplate 這一項,並按下 F2 改名成 EmptyDatabase2.vstemplate-bak 即可。
    找到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Packages\{349C5850-65DF-11DA-9384-00065B846F21}\AddNewItemFilters\ExcludedTemplates 機碼,找到 EmptyDatabase2.vstemplate 這一項,並按下 F2 改名成 EmptyDatabase2.vstemplate-bak
  3. 然後再找到 App_Data 這個子機碼,並新增一個 DWORD  (32-位元) 值 並命名為 EmptyDatabase2.vstemplate 即可。
    image

相關連結


此文章由 will 發表於 2009/2/15 上午 08:39:54

永久連結 | 評論 (6) | 此文章的RSSRSS comment feed |

分類: SQL Server | ASP.NET

標籤: ,

評論

二月 15. 2009 10:18

sholfen

Embeded Database個人覺得SQLite是一個不錯的選擇,目前已經有provider可以下載了。上次在codeproject網站上看到有人用SQLite實作.NET的membership,真的是很猛。

sholfen Taiwan

二月 15. 2009 19:33

will

SQLite for ADO.NET 2.0 的官網在此:

System.Data.SQLite
http://sqlite.phxsoftware.com/

不止你說的 Membership provider 已經有了,連 Entity Framework 的 Provider 也都支援了,而且與 Visual Studio 的整合也挺不錯的,可以直接在 Visual Studio 中進行資料庫的建立、修改、與對資料的 CRUD 操作都可以。

will Taiwan

二月 16. 2009 06:03

demo

打廣告~~我也有寫一篇有關於SQLCE 使用在ASP.NET以及如何使用LINQ TO SQL(CE)的文章。
http://demo.tc/view.aspx?id=488

demo Taiwan

六月 11. 2010 03:51

edwina

想請教保哥,SQL Compact的加密機制會讓資料表中的資料經過加密嗎?
或者只是資料庫本身的加密?

edwina Taiwan

六月 11. 2010 04:14

Will 保哥

edwina: SQL Compact 的加密機制是將整個資料庫檔案進行加密。你可參考以下網址:

SQL Server Compact 3.5 Service Pack 1 Books Online - Encrypting a Database
msdn.microsoft.com/en-us/library/ms172901.aspx

Securing Databases (SQL Server Compact)
msdn.microsoft.com/en-us/library/ms171955.aspx

Will 保哥 Taiwan

七月 6. 2010 19:00

duke lee

我在VS2008平台中, 開發win的桌面專案程式, 採用sql server compact 3.5資料庫
在搜尋資料庫記錄時可找到並顯示, 但卻無法新增.
按下新增時 label1.text 會顯示 1 , 回到資料庫Part.sdf中的aa 資料表卻沒新增
為何? 請指導!


Imports System.Data
Imports System.Data.SqlServerCe

Public Class Form1


    '搜尋
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim objCon As SqlCeConnection
        Dim strDbCon As String = "Data Source=|DataDirectory|\All.sdf"
        objCon = New SqlCeConnection(strDbCon)
        objCon.Open()

        Dim objCmd As SqlCeCommand
        Dim strSql As String = "select a1,a2 from aa"
        objCmd = New SqlCeCommand(strSql, objCon)

        Dim objDR As SqlCeDataReader = objCmd.ExecuteReader()
        While objDR.Read()
            TextBox1.Text = objDR.Item(0)
            TextBox2.Text = objDR.Item(1)
        End While

        objDR.Close()

        objCon.Close()

    End Sub



    '新增
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim objCon As SqlCeConnection
        Dim strDbCon As String = "Data Source=|DataDirectory|\All.sdf"
        objCon = New SqlCeConnection(strDbCon)
        objCon.Open()

        Dim strSql As String = "insert into aa (a1,a2) values ('2', '22')"
        Dim objCmd As New SqlCeCommand(strSql, objCon)
        Label1.Text = objCmd.ExecuteNonQuery()

        objCon.Close()

    End Sub

End Class

duke lee Taiwan

新增評論


( 您輸入的Email不會顯示於網站上 )

  Country flag

biuquote
  • 評論
  • 線上預覽
Loading