Статьи

Настольное приложение SQL Server Compact 4 с простым частным развертыванием и LINQ to SQL

В этой статье я опишу упрощенный подход к частному развертыванию 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