The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

如何在 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

相關連結

評論 (6) -

  • sholfen

    2009/2/15 上午 10:18:01 |

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

  • will

    2009/2/15 下午 07:33:30 |

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

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

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

  • edwina

    2010/6/11 上午 03:51:02 |

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

  • duke lee

    2010/7/6 下午 07:00:23 |

    我在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

blog comments powered by Disqus