2011-06-20 15 views
9

Çalıştırmamda bir kaynak olarak gömülü olacak bir SQLite veritabanını yüklemeye çalışıyorum. Merak edenler için, yapılandırma verilerini depolamak için küçük bir SQLite veritabanı kullanıyorum ve yürütülebilir dosyanın içine yerleştirilmiş varsayılan yapılandırmayı göndermek istiyorum (dosyaları bir programla birlikte taşımaktan nefret ediyorum)..NET'te bir bayt akışından bir SQLite veritabanı yükleniyor

Bu yalnızca varsayılan yapılandırma olur. Yani, bu yapılandırmayı değiştirmek zorunda değilim. Statiktir ve programım kurulduktan sonra değiştirilemez.

SQLite için System.Data.SQLite sarıcısını kullanıyorum.

Böyle bir bayt akışına erişim elde edebilirsiniz:

using (var stream = 
      Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { 
    // use of "stream" here. 
} 

Ancak, bu akıştan bir SQLiteConnection nesnesi oluşturarak açısından bir kayıp am.

Program her yüklendiğinde, basit bir çıkış basitçe yeni bir yapılandırma dosyası oluşturmak ve sonra SQLiteyi bu dosyadan okuyacağını söylemek olabilir. Bu muhtemelen işe yarayacaktır, ancak bu tekniği kullanmaktan kaçınmak istiyorum - çözümümün bu soruna yeniden kullanılmasını da planlıyorum (ayrıca her dil bir [sıkıştırılmış] SQLite veritabanıdır ve varsayılan dil yürütülebilir dosyaya yerleştirilmiştir). kullanıcı diğer dilleri basitçe diğer dil veritabanlarını programın çalışma dizinine kopyalayabilir).

Bu veritabanını bellekte tutmanın bellek maliyetiyle ilgilenmiyorum. Çok küçük (muhtemelen 50 KiB'den az), bu da beni rahatsız etmiyor. Açıkçası bu daha büyük bir veritabanı olsaydı, bu bir sorun olabilir. Son olarak, bunun bir yapılandırmayı depolamanın zayıf bir yolu olarak görülebileceğinin farkındayım. Kullanıcının tüm ayarlarını el ile girdiği durumlarda, düz metin tabanlı bir çözümün iyi olduğunu kabul etmekteyken, bu çoğunlukla kullanıcının açıkça tanımlayamadığı ayarlar için kullanılır. Örneğin, çeşitli yerleştirme pencerelerinin konumlarını bir uygulamada saklamak veya dahili kaynakların nerede bulunabileceği hakkında veri depolamak.

Yardımlarınız için teşekkür ederiz.

+0

7 yıl sonra, bir sql lite db'yi bir ikili belleğe kaydetmenize veya bir akıştan yüklemenize izin veren bir çözüme sahip olup olmadığınızı merak ediyor musunuz? – lucuma

cevap

5

görünüyor. Bellek içi veritabanını bir dosyaya (yani ikili biçimde), yalnızca bir SQL dökümü biçiminde bile kaydedemezsiniz.

Çözümlerden biri, bir kaynakta veritabanı oluşturmak için SQL kodunu depolamaktır. Daha sonra her uygulama başlatıldığında db belleğinde oluşturun.

+0

Bunu düşündüm ve bu noktada gitmenin tek yolu gibi görünüyor. Her iki durumda da, çok büyük olmamalı: Ben zaten kaynağı sıkıştırmaya çalışacaktım (çünkü çok metin içeren SQLite veritabanları güzelce sıkıştırılmış gibi görünüyor). – Ethan

0

ben size bağlantı dizesi için kullanmak istiyor inanıyoruz:

Data source=:memory: 

örneğin buraya bakın: bu işlevsellik bir System.Data.SQLite sağlayıcısı inmplemented edilmez gibi Opening a SQLiteConnection on a binary stream instead of a file?

+3

Evet, boş bir veritabanıyla başlamak istediğimde bu iyi olurdu. Ama bu durumda, yeni bir tane açmak yerine, bir veritabanı olarak okumak istediğim, mevcut bir ikili akışa sahibim. – Ethan

+0

@Ethan: Boş bir veritabanı olma hakkında gönderdiğim örnekte hiçbir şey göremiyorum.Ama dürüst olmak gerekirse, daha önce hiç SQLite kullanmamıştım ve sadece yardım etmeye çalışıyordum, bu yüzden neden bahsettiğimi bilmiyorum :) – mellamokb

+0

Belki de bunu yapmanın bir yolu var, Örnek, ikili akışı geçmemek için bir yer olmadığıdır. Bu yönetilmeyen bir kod olsaydı, akışta adresin/boyutun el ile geçmesi gibi saçma bir şey yapabilirim, ancak .NET'te bu mümkün değil diye oldukça eminim. – Ethan

İlgili konular