I wanted to be able to create and access a local sql database using c#. I wanted to avoid having to install any database instances on the machine on which this app could run. The application needs to be as self-contained as possible. I am also very used to the way data is accessed in php so this uses sql query strings passed to execute commands, and result sets that can be iterated through.
First, a reference needs to be added to SqlServerCE...
Then make sure the reference is added in code...
using System.Data.SqlServerCe;
Here is the full code...
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlServerCe; // add this to use sql server compact methods using System.IO; // add this to use file.Delete,file.Exists and Path methods namespace sql_server_compact_test_application { public partial class Form1 : Form { private SqlCeEngine database; private SqlCeConnection conn; private SqlCeCommand cmd; string databaseFileName; public Form1() { InitializeComponent(); /* I want the database file to be in the same folder as the executable so Path.GetDirectoryName(Application.ExecutablePath) is used to find that out. */ databaseFileName = Path.GetDirectoryName(Application.ExecutablePath) + "\\testymctest.sdf"; string connString = "DataSource=\"testymctest.sdf\"; Password=\"OIUhjso&1\""; databaseNameLabel.Text = "Database file: " + databaseFileName; if (File.Exists(databaseFileName)) { infoLabel.Text = "Connected to existing file"; conn = new SqlCeConnection(connString); cmd = new SqlCeCommand(); cmd.Connection = conn; } else { infoLabel.Text = "Created database as it did not exist"; database = new SqlCeEngine(connString); database.CreateDatabase(); conn = new SqlCeConnection(connString); if (conn.State == ConnectionState.Closed) { conn.Open(); } string query = "create table testtable (id int not null identity(1,1) primary key,sausage nvarchar(50))"; cmd = new SqlCeCommand(query,conn); try { cmd.ExecuteNonQuery(); } catch (SqlCeException sqlexception) { MessageBox.Show("Caught sql exception: " + sqlexception.Message,"SQL Error",MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { MessageBox.Show("Caught exception: " + ex.Message,"Error", MessageBoxButtons.OK,MessageBoxIcon.Error); } finally { conn.Close(); } } } private void deleteDatabaseButton_Click(object sender, EventArgs e) { if (conn.State == ConnectionState.Open) { conn.Close(); } File.Delete(databaseFileName); infoLabel.Text = "Database deleted. You will need to restart the app. " + "The code could be modified to recreate the database after deletion, but hasn't yet"; } private void getDataButton_Click(object sender, EventArgs e) { textBox2.ResetText(); if (conn.State == ConnectionState.Closed) conn.Open(); cmd.CommandText = "select * from testtable"; SqlCeResultSet results = cmd.ExecuteResultSet(ResultSetOptions.Scrollable); //SqlCeResultSet results = cmd.ExecuteResultSet(ResultSetOptions.None); int SausageIndex = results.GetOrdinal("sausage"); // get the column position of the field named 'sausage' if (results.ReadFirst()) textBox2.Text += results.GetString(SausageIndex) + "\r\n"; else MessageBox.Show("There is no data to show yet"); while (results.Read()) { textBox2.Text += results.GetString(SausageIndex) + "\r\n"; } } private void AddButton_Click(object sender, EventArgs e) { string sql = "insert into testtable (sausage) values (@sausage)"; //try //{ if (conn.State == ConnectionState.Closed) conn.Open(); cmd.CommandText = sql; /* Note, here I'm passing the user-supplied input using AddWithValue to avoid sql injection. It could be included directly in the sql string above but this is safer */ cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@sausage", textBox1.Text); cmd.ExecuteNonQuery(); //} //catch (SqlCeException sqlexception) //{ // MessageBox.Show("SQL Exception: " + sqlexception.Message, "SQL Exception", MessageBoxButtons.OK, MessageBoxIcon.Error); //} //catch (Exception ex) //{ // MessageBox.Show("Exception: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); //} //finally //{ conn.Close(); //} /* I commented out the try/catch code that was in the example code where I got this from because I find that the way an app deals with uncaught exceptions actually provides more useful information than this... and the IDE stops at the code that caused the exception */ } } }