В этой статье я опишу упрощенный подход к частному развертыванию SQL Server Compact, а обзорную публикацию в блоге о частном развертывании с SQL Server Compact см. В моем блоге здесь .
Заставляя ваше приложение работать с использованием x86 всегда (предпочтительно 32-разрядного), который является новым целевым параметром Platform для приложений, нацеленных на .NET Framework 4.5, развертывание SQL Server Compact с вашим приложением становится проще, но оно должно следовать другим рекомендациям, чем Я ранее писал о. (Тот же подход будет работать и с приложениями, ориентированными на .NET 4.0, просто установите целевую платформу на x86 в указанном ниже месте. И тот же подход будет работать и с DLL-файлами SQL Server Compact 3.5.)
Чтобы узнать больше о новой целевой опции платформы по умолчанию, представленной в .NET 4.5, см. Документацию MSDN здесь и пост в блоге здесь .
Кроме того, я покажу, как использовать LINQ to SQL с SQL Server Compact 4.0, с низкими издержками и быстродействующим ORM.
Для простоты и для того, чтобы сосредоточить внимание на аспектах частного развертывания, я продемонстрирую на консольном приложении, но тот же подход будет работать и для приложений WinForms и WPF.
Прежде чем начать, убедитесь, что у вас установлено следующее:
1: Visual Studio 2010/2012/2013 Pro или выше
2: надстройка SQL Server Compact Toolbox (установка через инструменты / расширения в VS)
3: Существующий файл базы данных SQL Server Compact, я буду использовать Chinook, который вы можете скачать здесь .
4. Среда выполнения SQL Server Compact 4.0 с пакетом обновления 1 (SP1)
(Вы также можете использовать бесплатную Visual Studio 2010/2012/2013 для Windows Desktop с автономной SQL Server Compact Toolbox для 4.0, которая также поддерживает генерацию кода LINQ to SQL)
После этого давайте откроем Visual Studio и начнем:
Создать новое консольное приложение
Перейдите в Файл, Новый проект и создайте новое консольное приложение Windows. Обязательно установите целевую платформу на 4.0 или новее.
Включите двоичные файлы SQL Server Compact в свой проект
Теперь включите двоичные файлы SQL Server Compact 4.0 и ADO.NET Provider в свое содержимое. Скопируйте C: \ Program Files (x86) \ Microsoft SQL Server Compact Edition \ v4.0 \ Private \ System.Data.SqlServerCe.dll в папку проекта, а затем скопируйте все файлы и папки в C: \ Program Files (x86). \ Microsoft SQL Server Compact Edition \ v4.0 \ Private \ x86 также в папку вашего проекта.
В обозревателе решений выберите Показать все файлы и включите новую папку и семь файлов, только что скопированных в проект:
Теперь отметьте все скопированные файлы (также файлы в папке Microsoft.VC9.CRT) и отметьте их как «Содержимое, всегда копировать»:
Наконец, добавьте ссылку на файл System.Data.SqlServerCe.dll в папке вашего проекта:
(Обязательно проверьте местоположение файла и версию, должна быть 4.0.0.1)
Добавьте файл вашей базы данных в проект
Убедитесь, что это также содержимое, всегда копируйте — здесь мы используем рабочий процесс «Сначала база данных».
Создайте LINQ to SQL DataContext
Далее мы создадим класс LINQ to SQL DataContext и связанные с ним классы таблиц на основе базы данных, поэтому подключитесь к базе данных в SQL Server Compact Toolbox, используя пункт меню Добавить соединение SQL Server Compact 4.0:
Затем щелкните правой кнопкой мыши базу данных и выберите «Добавить LINQ to SQL DataContext в текущий проект»:
(Я просто использую ChinookContext в качестве имени контекста)
Нажмите кнопку ОК, и файл класса DataContext будет добавлен в ваш проект, а в проект будет добавлена необходимая ссылка на System.Data.Linq.
Теперь давайте добавим некоторый тестовый код в метод Main, чтобы убедиться, что все работает до сих пор, поэтому код Program.cs выглядит следующим образом:
using System; using System.Data.SqlServerCe; namespace LinqToSqlCePrivateDeploy { class Program { private const string dbFileName = "Chinook_SqlServerCompact_AutoIncrementPKs.sdf"; private static string dbConnectionString = string.Format("Data Source=|DataDirectory|{0};Max Database Size=4091", dbFileName); static void Main(string[] args) { using (var connection = new SqlCeConnection(dbConnectionString)) { using (var context = new ChinookContext(connection)) { //To log SQL statements, use: //context.Log = Console.Out; foreach (var album in context.Album) { Console.WriteLine(album.Artist.Name); Console.WriteLine(album.Title); } } } Console.Read(); } } }
Теперь мы можем получить доступ к базе данных через сгенерированную объектную модель, и нам не нужно вводить SQL, но мы можем использовать LINQ для запроса к базе данных. Кроме того, мы можем обновить базу данных (INSERT, UPDATE, DELETE) с помощью методов в DataContext.
Обратите внимание, что DataContext должен быть создан с помощью объекта SqlCeConnection, чтобы LINQ to SQL мог работать с SQL Server Compact 4.0.
Развернуть файл базы данных
Последний шаг будет сделан, чтобы гарантировать, что файл базы данных будет расположен в доступной для записи папке на компьютере пользователя при развертывании / установке. Мы просто сделаем это в коде, чтобы не зависеть от действий и проблем при установке. Кроме того, мы можем сделать это без сохранения каких-либо строк подключения в app.config, что делает приложение более автономным. Мы будем использовать тот же подход, который я уже использовал в своем блоге, который использует макрос строки подключения DataDirectory.
private static void CreateIfNotExists(string fileName) { string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); // Set the data directory to the users %AppData% folder // So the database file will be placed in: C:\\Users\\<Username>\\AppData\\Roaming\\ AppDomain.CurrentDomain.SetData("DataDirectory", path); // Enure that the database file is present if (!System.IO.File.Exists(System.IO.Path.Combine(path, fileName))) { //Get path to our .exe, which also has a copy of the database file var exePath = System.IO.Path.GetDirectoryName( new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath); //Copy the file from the .exe location to the %AppData% folder System.IO.File.Copy( System.IO.Path.Combine(exePath, fileName), System.IO.Path.Combine(path, fileName)); } }
Не забудьте добавить вызов CreateIfNotExists в качестве первой строки в методе Main:
static void Main(string[] args) { CreateIfNotExists(dbFileName);
Теперь вы можете использовать ClickOnce, XCopy или Installer для развертывания приложения без каких-либо других требований, кроме целевой версии .NET Framework.
Чего мы достигли:
— Простое автономное развертывание однопользовательского настольного приложения любого типа на любой платформе .NET 4.0 или более поздней версии (но не ARM)
— Нет необходимости в специальных заклинаниях в app.config
— RAD (Rapid App Development) «Database First» доступ к хорошо работающей, хорошо документированной и простой ORM.
Вы можете скачать полное решение здесь; http://sdrv.ms/179QBaa