web-dev-qa-db-ja.com

SQL Server Compact 3.5 / 4でASP .NET MVC 2を使用できない

Visual Studio 2008 Proを使用しています。

私はおそらくここで非常に明白な何かを見逃しているでしょうが、Sql Server Compact 4のCTPをasp.net mvcアプリケーションで機能させるように努めています。これを設定する方法や実際に動作するサンプルアプリケーションについての説明はほとんどありません。私の目標はプライベートインストールであるため、ドメインホスティングでSQLサーバーのセットアップを行う必要なく、それをWebアプリに含めることができます。これは本当に私がそよ風を撃ってこれを理解しようとしているだけです。これで市場などをホストするつもりはありません。

したがって、ベース4.0方向にインストールされるすべてのdll(c:\ Program Files\Sql Server compact\v4.0)をアプリケーションのlibフォルダーにコピーしました。 [出力方向にコピー]オプションを[新しい場合にコピー]に設定しました。次に、System.Data.SqlServerCE dllを参照して、「ローカルにコピー」をTrueに設定します。

Sql Studio Expressを介してsdfファイルを作成しました。重要なメモは、このファイルのCE 4.0バージョンを作成するオプションが表示されなかったため、CE 3.5を使用して作成されたことです。いくつかのテーブルを作成し、それらのテーブルに数行を追加して、*。sdfファイルをApp_Dataディレクトリにコピーします。 VS 2008内からは、このファイルがプロジェクトに表示されることはありませんが、App_Dataディレクトリの物理的な場所に存在します。なぜなのかよくわかりません。

次に、次の方法でsdfファイルに基本的な接続を試みます。

SqlCeConnection conn = new SqlCeConnection("DataSource=rpg.sdf");

これにより、以下のエラーが発生します。

Unable to load the native components of SQL Server Compact corresponding to the ADO.NET provider of version 8402. Install the correct version of SQL Server Compact. Refer to KB article 974247 for more details.

私はここから理解しました、私はSql CE 3.5を動作させることを試みます。 Sql CE 3.5のローカルインストールをsp2にアップグレードします。プロジェクトの参照からSystem.Data.SqlServerCE dllのバージョンを削除して再読み込みすることを含め、基本の場所(c:\ Program Files\Sql Server compact\v3.5)にDLLをコピーします。

ここで興味深いのは、右クリックして、参照されているSqlServerCE dllのプロパティを見ると、常にバージョン4.0.0.1と表示されています。

みんな、私は本当にここでいくつかの方向を使用することができました。スタックオーバーフロー、ヘルプドキュメント、オンラインブック、グーグルを検索しました。私は本当にこれをCE 3.5または4.0の最上部から取り、何を追加するか、それらをどこに置くか、それらを参照する方法、.sdfファイルをプロジェクトに追加する方法を正確に教えてくれるものは何も見つかりませんでした、それに接続し、そこからクエリを実行します。 Sql CE 3.5を使用するはずのIBuySpyポータルサンプルアプリについていくつか言及しましたが、実際にmsdnダウンロード迷路をナビゲートしてそこに到達することはできません。理想的には、CE 4.0のプライベート展開をセットアップしたいです。

ぜひ聞きたいです。提案、ポイント、高く評価されるものは何でも。ありがとうございました!

はいI DID KBを参照してください。ITは役に立ちませんでした

こちらをご覧ください: http://support.Microsoft.com/kb/974247

CORFLAGからの結果

さて、それを試してみて、これらは私の結果です:C:\ Development\Mvc2MessingAround\Mvc2MessingAround\bin\Lib> corflags System.Data。 SqlServerCe.dll Microsoft(R).NET Framework CorFlags変換ツール。バージョン3.5.21022.8 Copyright(c)Microsoft Corporation。全著作権所有。

Version   : v2.0.50727
CLR Header: 2.5
PE        : PE32
CorFlags  : 9
ILONLY    : 1
32BIT     : 0
Signed    : 1

Sql CEの両方のバージョン(3.5/4)のx86バージョンをインストールすると誓約しました。プロセッサーが64ビット対応であるため、インストーラーが何らかの理由で混乱している可能性がありますが、Windows XP SP 3 32ビットを実行しています。結果は、それが64ビットであることを示しているようです。それは事実ですか?

ADDED DETAILS

これまでに、以下の構成が2台のマシンで試行されました。どちらもWindows XP SP3 32ビット、64ビット対応プロセッサです。両方の開発環境はVS 2008 Proです。マシン2での結果は、Sql CE 4 Ctpの新規インストール後のものです。

設定#1

myapp\bin\
     System.Data.SqlServerCe.dll

myapp\bin\private
    AMD64
    x86

myapp\bin\private\x86
    sqlceca40.dll
    sqlcecompact40.dll
    sqlceer40EN.dll
    sqlceme40.dll
    sqlceqp40.dll
    sqlcese40.dll

myapp\bin\private\AMD64
    sqlceca40.dll
    sqlcecompact40.dll
    sqlceer40EN.dll
    sqlceme40.dll
    sqlceqp40.dll
    sqlcese40.dll

エラー:

An exception of type 'System.Data.SqlServerCe.SqlCeException' occurred in System.Data.SqlServerCe.DLL but was not handled in user code

Additional information: Unable to load the native components of SQL Server Compact corresponding to the ADO.NET provider of version 8402. Install the correct version of SQL Server Compact. Refer to KB article 974247 for more details.

コード:

SqlCeConnection conn = new SqlCeConnection();

設定2

#1と同じですが、myapp\bin方向にSystem.Data.SqlServerCE.Entity.dllがあります。

上記のコードに到達する前のページエラー。これはメッセージです:

ファイルまたはアセンブリ 'System.Data.SqlServerCe.Entity'またはその依存関係の1つを読み込めませんでした。このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされており、読み込むことができません。

説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーの詳細と、コードのどこで発生したかについては、スタックトレースを確認してください。

例外の詳細:System.BadImageFormatException:ファイルまたはアセンブリ 'System.Data.SqlServerCe.Entity'またはその依存関係の1つを読み込めませんでした。このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされており、読み込むことができません。

VS 2008 Proでプロジェクト設定を確認しました。Net3.5フレームワークがターゲットとして設定されています。

設定3

System.Data.SqlServerCE.dllがmyapp\bin\privateフォルダーから参照されることを除いて、1と同じです。

結果はCONFIGURATION#1と同じです(エラーメッセージは100%同じで、エラーは同じコード行で発生します)。

正しい構成

Erikの指示に従って(私がより注意深く従った場合)、セットアップは

myapp\bin
    x86
    AMD64
    System.Data.SqlServerCE.dll

コードのbinフォルダーから直接System.Data.SqlServerCE.dllを参照します。私の愚か者はプライベートフォルダを含める必要があると考えていましたが、含まれていません。 .net 4.0ソリューションを使用している場合を除き、System.Data.SqlServerCE.Entity.dllをbinフォルダーに配置しないでください。 dllが3.5で動作するとは思わない。

役立つリンク:

http://blogs.msdn.com/b/sqlservercompact/archive/2010/07/07/introducing-sql-server-compact-4-0-the-next-gen-embedded-database-from- Microsoft.aspx

22
jason

SQL CE 3.5はASP.NETでは機能しません。4.0CTPを使用する必要があります。

こちら からダウンロードしてください。

ランタイムをインストールします。

次のディレクトリの内容(x86およびAMD64フォルダーを含む)をASP.NETアプリのbinフォルダーにコピーします。C:\ Program Files\Microsoft SQL Server Compact Edition\v4.0\Private

更新:デスクトップフォルダーのSystem.Data.SqlServerCe.dllを使用して、中程度の信頼の問題を回避します

myapp\bin\ 
 System.Data.SqlServerCe.dll 

myapp\bin\x86 
 sqlceca40.dll 
 sqlcecompact40.dll 
 sqlceer40EN.dll 
 sqlceme40.dll 
 sqlceqp40.dll 
 sqlcese40.dll 

myapp\bin\AMD64 
 sqlceca40.dll 
 sqlcecompact40.dll 
 sqlceer40EN.dll 
 sqlceme40.dll 
 sqlceqp40.dll 
 sqlcese40.dll 

/ binフォルダーに配置したばかりのSystem.Data.SqlServerCe.dllファイルへの参照を追加します。

SQL Compact sdfファイルをApp_Dataフォルダーに配置します。

接続文字列を追加します。

<connectionStrings>
   <add name ="NorthWind"
   connectionString="data source=|DataDirectory|\Nw40.sdf" />
</connectionStrings>

接続してください! :-)

using System.Data.SqlServerCe;

    protected void Page_Load(object sender, EventArgs e)
    {
        using (SqlCeConnection conn = new SqlCeConnection())
        {
            conn.ConnectionString = ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
            conn.Open();
            using (SqlCeCommand cmd = new SqlCeCommand("SELECT TOP (1) [Category Name] FROM Categories", conn))
            {
                string valueFromDb = (string)cmd.ExecuteScalar();
                Response.Write(string.Format("{0} Time {1}", valueFromDb, DateTime.Now.ToLongTimeString()));
            }
        }
    }
31
ErikEJ

ProviderNameを使用する接続文字列を使用していて、SDKをインストールしていない場合は、これをweb.config(またはapp.config)に追加する必要もあります。

  <runtime>
     <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Data.SqlServerCe" publicKeyToken="89845dcd8080cc91" culture="neutral"/>
        <bindingRedirect oldVersion="4.0.0.0-4.0.0.1" newVersion="4.0.0.1"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <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, Version=4.0.0.1, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
    </DbProviderFactories>
  </system.data>

注:SDKをインストールした場合は、この情報がmachine.configに含まれるため、「削除」が必要です。

13
Eric Labashosky

OK、あなたが彼らのために釣りをしているので、これは推測です。

参照ディレクトリにコピーしたアセンブリで corflags.exe を実行します。どのタイプの機械用に構築していますか? 64ビットマシンでx64またはanyCpuにコンパイルする場合は、参照が32ビットのみの参照ではないことをcorflagsが通知していることを確認してください。多分それはあなたのGACか何かの間違ったバージョンに「フォールバック」しているのでしょう。参照されているアセンブリが32ビットのみであることが示されている場合は、プロジェクトを32ビットプロジェクトとしてコンパイルするか、64ビットバージョンのDLLを見つけますか?

2
Dave Markle

NuGetを使用してSQL CEプロバイダーをインストールする場合、最も簡単な解決策は、ビルド後のステップを追加して、これらをNuGetパッケージのNativeBinariesフォルダーからコピーすることです。

1
Dale Anderson

私にとっての鍵は、プライベートディレクトリ(C:\ Program Files\Microsoft SQL Server Compact Edition\v4.0\Private)のSystem.Data.SqlServerCe.Entity.dllのバージョンが4.0.0.1であり、バージョンがデスクトップディレクトリ(C:\ Program Files\Microsoft SQL Server Compact Edition\v4.0\Desktop\System.Data.SqlServerCe.Entity)の下は4.0.0.0です。 Privateディレクトリ内のSystem.Data.SqlServerCe.dllのバージョンは4.0.0.0です。

SqlServer.dllへの対応する更新なしに、更新されたSqlServerCe.Entity.dllを配布するのは、Microsoft側の間違いだと思います。

0
Mark McClelland