Не удается получить sql server compact 3.5/4 для работы с ASP.NET MVC 2
Я использую Visual Studio 2008 Pro.
Вероятно, я, вероятно, пропустил что-то очень очевидное, но я пытался получить CTP для Sql Server compact 4 для работы в моем приложении asp.net mvc. Я не могу найти рядом с инструкцией о том, как установить это приложение или рабочий пример приложения. Моя цель - частная установка, поэтому я могу просто включить ее в свое веб-приложение, не требуя установки сервера SQL на моем доменном хостинге. На самом деле я просто стреляю в ветер и пытаюсь понять это. Я не планирую размещать рынок или что-либо еще с этим.
Итак, я скопировал всю DLL, которая устанавливает в базовом 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 из моих ссылок на проекты.
Любопытная вещь здесь, когда я нажимаю правой кнопкой мыши и смотрю на свойства ссылочной dll SqlServerCE, она всегда говорит о ее версии 4.0.0.1.
Ребята, я действительно мог бы использовать какое-то направление здесь. Я искал переполнение стека, документы справки, книги в Интернете и googled. Я действительно не нашел ничего, что берет это с самого верха для 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 Conversion Tool. Версия 3.5.21022.8 Copyright (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 бит. Это тот случай?
ДОБАВЛЕННЫЕ ДАННЫЕ
На сегодняшний день приведенные ниже конфигурации были опробованы на двух машинах. Оба являются 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, но с 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.
Результаты те же, что и CONFIGURATION # 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
Ответы
Ответ 1
SQL CE 3.5 не работает с ASP.NET, вы должны использовать 4.0 CTP.
Загрузите из здесь.
Установите время выполнения.
Скопируйте содержимое каталога (включая папки x86 и amd64) в папку bin вашего приложения ASP.NET:
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
Добавьте ссылку на файл 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()));
}
}
}
Ответ 2
Если вы используете строку соединения, которая использует имя поставщика, и вы не установили 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
Ответ 3
Хорошо, вот догадаться, так как вы ловите их.
Запустите corflags.exe в сборке, скопированной в каталог ссылок. Для какой машины вы строите? Если вы работаете на 64-битной машине, и вы компилируете ее на x64 или anyCpu, убедитесь, что corflags сообщает вам, что ваши ссылки не являются 32-разрядными ссылками. Возможно, он "отступает" к неправильной версии вашего ПКК или что-то в этом роде. Если он сообщает вам, что ссылочная сборка только 32-разрядная, либо скомпилируйте проект как 32-разрядный проект, либо найдите 64-разрядную версию DLL?
Ответ 4
Если вы устанавливаете поставщика SQL CE с помощью NuGet, самым простым решением является добавление шага после сборки, чтобы скопировать их из папки NativeBinaries пакета NuGet.
Ответ 5
Ключ для меня заключался в том, что версия System.Data.SqlServerCe.Entity.dll в личном каталоге (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 в личном каталоге - 4.0.0.0.
Я думаю, что было ошибкой со стороны Microsoft распространять обновленную SqlServerCe.Entity.dll без соответствующего обновления для SqlServer.dll.