Ανακαλύπτοντας την System.Data.SQLite

Χρειάστηκε να πειραματιστώ με την (επανα)δημιουργία μίας standalone εφαρμογής σε C#, σε .net3.5(!) με embedded βάση δεδομένων. Δεν ήθελα να βασιστώ στις κλασσικές πεπατημένες μεθόδους, την πλαστικούρα του vs και φυσικά δεν υπήρχε τρόπος να συνδεθώ σε απομακρυσμένη βάση.

Οπότε στράφηκα στη System.Data.SQLite, κάτι το οποίο μου είχε αναφέρει πριν χρόνια ένας αξιότιμος senior και το οποίο φυσικά δεν χρησιμοποίησα ποτέ.

Κατεβάζω λοιπόν το κατάλληλο .zip, παίρνω το dll (χρειάζεται μόνο το System.Data.SQLite.dll), δημιουργώ τα assembly references, και δημιουργώ τη βάση με το sqlitebrowser και μπάμ, δε δουλεύει τίποτα!

1ος λόγος: Είχα γυρισμένο τον compiler να κάνει compile σε Any CPU, ενώ έγραφα 32bit εφαρμογή και είχα κατεβάσει την 32bit dll. Το intelligence του vs τα έδειχνε όλα οκ αλλά δεν. Οπότε ανάλογα με την αρχιτεκτονική, θέλει και το αντοίστιχο dll.

2ος λόγος: Η database, πρέπει να είναι στο ίδιο αρχείο με το εκτελέσιμο. Relative paths, ή καρφωτά δεν χρησιμοποίησα, διότι τα θεωρώ μία κακή τεχνική.

Παρακάτω, παραθέτω μία κλάση σε c# την οποία ονομάζω dbmanager και την χρησιμοποιώ για την αλλιλεπίδραση με την sqlite db μου:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;//using gia to assembly reference sth dll
using System.Data;
using System.Windows.Forms;

namespace test_sqlite//to diko sou namespace edw
{
class dbmanager
{
private static SQLiteConnection sql_con;
private static SQLiteCommand sql_cmd;
private static SQLiteDataAdapter DB;

public static void setConnection()//connection string function, kaleitai apo thn executeQuery
{
try
{
sql_con = new SQLiteConnection(“Data Source=to_onoma_ths_dikhs_soy.db;Version=3;New=False;Compress=True;”);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}

public static void executeQuery(string txtQuery)//anoigei connection sth db kai ektelei erwthma
{
try
{
setConnection();
sql_con.Open();
sql_cmd = sql_con.CreateCommand();
sql_cmd.CommandText = txtQuery;
sql_cmd.ExecuteNonQuery();
sql_con.Close();
}
catch (Exception exc)
{
MessageBox.Show(exc.Message + “:: FROM executeQuery( ) , propably caused by syntax error.”);
}
}

public static DataTable loadData(string cmd) //returns datatable
{
try
{
setConnection();
sql_con.Open();
sql_cmd = sql_con.CreateCommand();
DB = new SQLiteDataAdapter(cmd, sql_con);
DataSet DS = new DataSet();
DB.Fill(DS);
DataTable DT = DS.Tables[0];
sql_con.Close();

return DT;
}
catch (Exception exc)
{
MessageBox.Show(exc.Message + “:: FROM loadData( ), propably caused by invalid data or connection failure.”);
}

return null;
}

}
}

Την παραπάνω τη δημιούργησα συλλέγοντας κομμάτια απο το algorhymes και Tigran’s blog.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: