Не удается получить SQL Server Compact 3.5 / 4 для работы с ASP .NET MVC 2 - PullRequest
22 голосов
/ 11 июля 2010

Я использую Visual Studio 2008 Pro.

Возможно, мне здесь не хватает чего-то очень очевидного, но я пытался заставить CTP для Sql Server compact 4 работать в моем приложении asp.net mvc. Я не могу найти рядом с инструкцией о том, как настроить это или рабочий пример приложения. Моя цель - частная установка, поэтому я могу просто включить ее в свое веб-приложение, не выполняя настройку сервера sql на хостинге моего домена. Это действительно только я стреляю в ветер и пытаюсь понять это. Я не планирую устраивать рынок или что-то подобное.

Итак, я скопировал все dll, которые устанавливаются в направлении base 4.0 (c: \ Program Files \ Sql Server compact \ v4.0), в папку lib в моем приложении. Я установил для параметра «Копировать в выходное направление» значение «Копировать, если новее». Затем я ссылаюсь на dll System.Data.SqlServerCE и устанавливаю для параметра «Копировать локальный» значение True.

Я создал файл sdf через Sql Studio Express. Важным примечанием является то, что я не видел опции для создания версии этого файла для 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. Я копирую dll в базовом расположении (c: \ Program Files \ Sql Server compact \ v3.5), включая удаление и чтение версии dll System.Data.SqlServerCE из ссылок на мои проекты.

Любопытно, что когда я щелкаю правой кнопкой мыши и смотрю на свойства ссылочной библиотеки SqlServerCE, она всегда говорит, что это версия 4.0.0.1.

Ребята, я действительно мог бы использовать какое-то направление здесь. Я искал переполнение стека, справочные документы, книги в Интернете и гуглил. Я действительно не нашел ничего, что бы взяло это с самого верха для CE 3.5 или 4.0 и точно скажет мне, что добавить dll, куда их поместить, как ссылаться на них, как добавить файл .sdf в мой проект, подключиться к нему и запросить его. Я наткнулся на несколько упоминаний примера приложения портала IBuySpy, в котором предполагалось использовать Sql CE 3.5, но на самом деле я не могу ориентироваться в лабиринте загрузки msdn, чтобы добраться до него. В идеале я хочу настроить частное развертывание для CE 4.0.

У меня все уши. Предложения, баллы, все, что будет высоко оценено. Спасибо!

ДА Я ВИДЕЛ КБ. ЭТО НЕ ПОМОГЛО

Смотрите здесь: http://support.microsoft.com/kb/974247

РЕЗУЛЬТАТЫ ОТ КОРФЛАГА

Хорошо, попробовал это, и вот мои результаты: C: \ Development \ Mvc2MessingAround \ Mvc2MessingAround \ bin \ Lib> corflags System.Data. SqlServerCe.dll Microsoft (R) .NET Framework Инструмент преобразования CorFlags. Версия 3.5.21022.8 Авторские права (c) Корпорация Microsoft. Все права защищены.

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

Я бы поклялся, что установил x86-версию обеих версий Sql CE (3.5 / 4). Установщик мог запутаться как-то, потому что мой процессор поддерживает 64 бита, но я использую Windows XP SP 3 32 бит. Результаты показывают, что он 64-битный. Это тот случай?

ДОБАВЛЕННЫЕ ДЕТАЛИ

На сегодняшний день приведенные ниже конфигурации были опробованы на 2 машинах. Оба являются 32-разрядными Windows XP SP3 с 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, но с System.Data.SqlServerCE.Entity.dll в направлении myapp \ bin.

Ошибка страницы перед попаданием кода выше.Это сообщение:

Не удалось загрузить файл или сборку 'System.Data.SqlServerCe.Entity' или одну из ее зависимостей.Эта сборка создается средой выполнения, более новой, чем текущая загруженная среда, и не может быть загружена.

Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.BadImageFormatException: Не удалось загрузить файл или сборку 'System.Data.SqlServerCe.Entity' или одну из ее зависимостей.Эта сборка создается средой выполнения, более новой, чем текущая загруженная среда, и не может быть загружена.

Я проверил настройки проекта в VS 2008 Pro, и в качестве цели установлена ​​среда .Net 3.5.

КОНФИГУРАЦИЯ 3

То же, что и # 1, за исключением того, что System.Data.SqlServerCE.dll ссылается на папку myapp \ bin \ private.

Результатытакой же, как КОНФИГУРАЦИЯ № 1 (сообщение об ошибке на 100% одинаковое, и ошибка возникает в той же строке кода).

ПРАВИЛЬНАЯ КОНФИГУРАЦИЯ

Согласно инструкциям Эрика (имелЯ следовал за ними более тщательно), установка должна быть

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

Ссылка на System.Data.SqlServerCE.dll прямо из папки bin для кода.Моя глупость думала, что Личная папка должна быть включена, но это не так.Не помещайте System.Data.SqlServerCE.Entity.dll в папку bin, если вы не используете решение .net 4.0.Я не думаю, что 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

Ответы [ 5 ]

31 голосов
/ 11 июля 2010

SQL CE 3.5 не работает с ASP.NET, необходимо использовать CTP 4.0.

Скачать с здесь .

Установить среду выполнения.

Скопируйте следующее содержимое каталога (включая папки x86 и amd64) в папку bin вашего приложения ASP.NET: C: \ Program Files \ Microsoft SQL Server Compact Edition \ v4.0 \ Private

ОБНОВЛЕНИЕ: используйте System.Data.SqlServerCe.dll из папки Desktop, чтобы избежать проблем со средним уровнем доверия

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 

Добавьте ссылку на файл System.Data.SqlServerCe.dll, который вы только что поместили в папку / bin.

Поместите sdf-файл SQL Compact в папку App_Data.

Добавить строку подключения:

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

Connect! : -)

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()));
            }
        }
    }
13 голосов
/ 08 октября 2010

Если вы используете строку подключения, которая использует 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

2 голосов
/ 11 июля 2010

Хорошо, вот предположение, так как вы ловите их.

Запустите corflags.exe для сборки, которую вы скопировали в каталог ссылок.Для какого типа машины вы строите?Если вы работаете на 64-битной машине и собираете x64 или anyCpu, убедитесь, что corflags сообщает вам, что ваши ссылки не являются 32-битными.Может быть, это «откат» к неправильной версии в вашем GAC или что-то в этом роде.Если он говорит вам, что указанная сборка является только 32-разрядной, либо скомпилируйте ваш проект как 32-разрядный проект, либо найдите 64-разрядную версию DLL?

1 голос
/ 23 марта 2015

Если вы устанавливаете поставщик SQL CE с помощью NuGet, самое простое решение - добавить шаг после сборки, чтобы скопировать их из папки NativeBinaries пакета NuGet

0 голосов
/ 16 января 2011

Я понял, что версия System.Data.SqlServerCe.Entity.dll в каталоге Private (C: \ Program Files \ Microsoft SQL Server Compact Edition \ v4.0 \ Private) - 4.0.0.1 где версия под каталогом рабочего стола (C: \ Program Files \ Microsoft SQL Server Compact Edition \ v4.0 \ Desktop \ System.Data.SqlServerCe.Entity) - 4.0.0.0. Версия System.Data.SqlServerCe.dll в каталоге Private - 4.0.0.0.

Я думаю, что было ошибкой со стороны Microsoft распространять обновленный SqlServerCe.Entity.dll без соответствующего обновления SqlServer.dll.

...