@MrLumusss

Как подключить готовую БД SQLite к проекту на C# WinForms?

Добрый день. Сделал БД в SQLite, но просто не могу разобраться как подключить её к проекту, ранее работал в SSMS, где все решалось парой кликов и создавались все необходимые файлы, тут же просто не могу понять что да как. Пролазил кучу форумов, но так и не понял. Может кто подсказать как это сделать? Или ссылку дать, ибо сам не нашел.
  • Вопрос задан
  • 471 просмотр
Пригласить эксперта
Ответы на вопрос 2
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
#region License

// Разработано: Коротенко Владимиром Николаевичем (Vladimir N. Korotenko)
// email: koroten@ya.ru
// skype:vladimir-korotenko 
// https://vkorotenko.ru
// Создано:  09.04.2019 23:04

#endregion

using SpecialForcesDirectory.Code;
using System.IO;

namespace SpecialForcesDirectory.Dbl
{
    public class DataContext
    {
        private static readonly object Lock = new object();
        private static DataContext _ctx;

        public ContentDatabase ContentData { get; private set; }
        public UserDatabase UserDatabase { get; private set; }


        private DataContext()
        {
            ContentData = new ContentDatabase();
            UserDatabase = new UserDatabase();
        }


        public static DataContext Instance
        {
            get
            {
                lock (Lock)
                {
                    if (_ctx != null) return _ctx;
                    _ctx = new DataContext();
                    return _ctx;
                }
            }
        }




      

        public static void Close()
        {
            if (_ctx == null) return;
            lock (Lock)
            {
                if (_ctx.ContentData != null)
                {
                    _ctx.ContentData.Clear().Wait();
                    _ctx.ContentData = null;
                }

                if (_ctx.UserDatabase == null) return;
                _ctx.UserDatabase.Clear().Wait();
                _ctx.UserDatabase = null;
                _ctx = null;
            }
        }

        /// <summary>
        ///     Перезаписывает базу данных при обновлении, корректно закрывая ресурсы.
        /// </summary>
        /// <param name="file"></param>
        public static void UpdateFile(byte[] file)
        {
            var fp = BaseContentDatabase.DatabasePath;
            Close();
            lock (Lock)
            {
                File.WriteAllBytes(fp, file);
                _ctx = new DataContext();
            }
        }

        public static void DropFile()
        {
            var fullPath = BaseContentDatabase.DatabasePath;
            var userDb = BaseUserDatabase.DatabasePath;
            Close();
            lock (Lock)
            {
                File.Delete(fullPath);
                File.Delete(userDb);
            }
        }
    }
}


#region License
// // Разработано: Коротенко Владимиром Николаевичем (Vladimir N. Korotenko)
// // email: koroten@ya.ru
// // skype:vladimir-korotenko
// // https://vkorotenko.ru
// // Создано:  13.08.2020 14:07
#endregion

using System.Collections.Generic;
using System.Threading.Tasks;
using SpecialForcesDirectory.Code;
using SpecialForcesDirectory.Models;
using SQLite;

namespace SpecialForcesDirectory.Dbl
{
    public class ContentDatabase : BaseContentDatabase
    {
        #region Category repository
        private async Task<SQLiteAsyncConnection> GetCategoryConn()
        {
            return await GetDatabaseConnection<Category>().ConfigureAwait(false);
        }
        public async Task<IEnumerable<Category>> GetCategories()
        {
            var conn = await GetCategoryConn();
            return await AttemptAndRetry(() => conn.Table<Category>().ToListAsync()).ConfigureAwait(false);
        }
        public async Task<Category> GetCategory(int id)
        {
            var conn = await GetCategoryConn();
            return await AttemptAndRetry(() => conn.GetAsync<Category>(id)).ConfigureAwait(false);
        } 
        #endregion

        #region Content Repository
        private async Task<SQLiteAsyncConnection> GetCtxConn()
        {
            return await GetDatabaseConnection<Content>().ConfigureAwait(false);
        }
        
        public async Task<IEnumerable<Content>> GetItems()
        {
            var conn = await GetCtxConn();
            return await AttemptAndRetry(() => conn.Table<Content>().ToListAsync()).ConfigureAwait(false);
        }

        public async Task<Content> GetItem(int id)
        {
            var conn = await GetCtxConn();
            return await AttemptAndRetry(() => conn.GetAsync<Content>(id)).ConfigureAwait(false);
        }

        public async Task<int> DeleteItem(int id)
        {
            var conn = await GetCtxConn();
            return await AttemptAndRetry(() => conn.DeleteAsync<Content>(id)).ConfigureAwait(false);
        }

        public async Task SaveItem(Content item)
        {
            var conn = await GetCtxConn();
            if (item.Id == 0) await AttemptAndRetry(() => conn.InsertAsync(item)).ConfigureAwait(false);
            await AttemptAndRetry(() => conn.UpdateAsync(item)).ConfigureAwait(false);
        }

        public async Task<IEnumerable<SRawItem>> GetItemsByQuery(string q, int lim)
        {
            var qu = q.ToUpper();
            var list = new List<SRawItem>();
            var conn = await GetCtxConn();
            var result = conn.Table<Content>()
                .Where(x => x.EnableTab1 == 1 && x.Tab1.ToUpper().Contains(qu)
                            || x.EnableTab2 == 1 && x.Tab2.ToUpper().Contains(qu)
                            || x.EnableTab3 == 1 && x.Tab3.ToUpper().Contains(qu)).Take(lim);

            var r = await result.ToListAsync();
            foreach (var content in r)
            {
                var st = GetSt(content, qu);
                var title = await conn.Table<Category>().Where(x => x.Id == content.CatId).FirstAsync();
                var ni = new SRawItem
                {
                    Body = st.Body,
                    CatId = content.CatId.ToString(),
                    Title = title.Title,
                    Id = content.Id.ToString(),
                    MType = "a",
                    Tab = st.Tab
                };
                list.Add(ni);
            }

            return list;
        }

        private static TabStruct GetSt(Content content, string q)
        {
            if (content.Tab1.ToUpper().Contains(q))
                return new TabStruct { Tab = "1", Body = content.Tab1 };
            if (content.Tab2.ToUpper().Contains(q))
                return new TabStruct { Tab = "2", Body = content.Tab2 };
            return new TabStruct { Tab = "3", Body = content.Tab3 };
        }

        private struct TabStruct
        {
            public string Body { get; set; }
            public string Tab { get; set; }
        }

        #endregion

        public async Task Clear()
        {
            await BaseContentDatabase.Close();
        }
    }
}


В проект вставите
<PackageReference Include="sqlite-net-pcl" Version="1.8.116" />
Ответ написан
Комментировать
@rPman
скачиваешь sqlite драйвер

дальше либо сам создаешь ado.net подключение, либо пользуешься встроенным генератором всех нужных классов в студию (создаешь подключение, там кликами создаешь DataSet в нем добавляешь таблицы из базы, затем с помощью DataBinding прямо в интерфейсе связываешь компоненты форм с данными)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы