中さんからtwitterで
@masaru_b_cl web.config拝見しましたが、参照設定がされてませんね
http://twitter.com/#!/nakawankuma/status/30183277180489729
と指摘されたので、いろいろと見直して、コンパイルエラーが解消し、実行時エラーとなるところまで持って行けたのでメモ。
プロジェクトの構成
次のような形になります。

ポイント:
- App_DataフォルダにSQL Server Compact DBファイル(*.sdf)を配置する。
- Binフォルダの配下に、SQL Server Compact 4.0のインストールフォルダのPrivateフォルダ(%ProgramFiles%\Microsoft SQL Server Compact Edition\v4.0\Private)にある、以下のファイルをコピーする。
- System.Data.SqlServerCe.dll
- JA\System.Data.SqlServerCe.resources.dll(※エラーメッセージなどの日本語化のため。無理していれなくてもいい)
- x86フォルダの中身全部
- SQL Server Compact 4.0のランタイム?
Web構成ファイル(Web.config)の設定
次にweb.configに次のように記述します。
<?xml version="1.0"?>
<configuration>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.4.0"/>
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe"/>
</DbProviderFactories>
</system.data>
<system.web>
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Data.SqlServerCe"/>
</assemblies>
</compilation>
<customErrors mode="Off" />
</system.web>
</configuration>
ポイント:
- system.web ? compilation ? assemblies要素の中に、add要素でSQL Server Compact 4.0のアセンブリ名を追加する。
- Version, Culture, PublicKeyTokenを指定すると、GACを探しに行ってしまうのか、どうもうまくいかなかったので、アセンブリ名のみとしています。
- DbProviderFactoriesのtypeNameには、上記addで指定したアセンブリ名と同じ名前を指定する。
Webページ
Default.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>
</body>
</html>
Default.aspx.vb
Imports System.Data
Imports System.Data.Common
Imports System.Data.SqlServerCe
Partial Class _Default
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Dim factory = DbProviderFactories.GetFactory("System.Data.SqlServerCe.4.0")
Using conn = factory.CreateConnection()
conn.ConnectionString = "Data Source=|DataDirectory|\Database.sdf"
Using da = factory.CreateDataAdapter()
Using cmd = factory.CreateCommand()
cmd.Connection = conn
cmd.CommandText = "select 1"
da.SelectCommand = cmd
Dim dt As New DataTable()
da.Fill(dt)
GridView1.DataSource = dt
End Using
End Using
End Using
Page.DataBind()
End Sub
End Class
ポイント:
- Imports句で、「System.Data.SqlServerCe」名前空間をインポートする。
- DbProviderFactoryのコンストラクタで、web.configで記述した”System.Data.SqlServerCe.4.0”を指定する。
- ConnectionStringは"Data Source=|DataDirectory|\Database.sdf"
- |DataDirectory|はApp_Dataフォルダのこと
実行
ローカルIISに配置したら問題なく動作して、次のような画面が表示されました。

うまくいったので、わんくまサイトにFTPでコピーして動作させてみたところ、次のような実行時エラーとなりました。

「Access to the database file is not allowed.」なので、アクセス権の問題かなーと思うんですが、FTPの属性変更では変更できないようで、ここで行き詰まってしまいました。
とりあえず、大分前進した感じですが、どげすんべやといったところです。