For anyone interested in exploring this database option furhter, I have now converted its help files from the Microsoft Document Explorer format (.hxs) to structured text at http://www.EmpowermentZone.com/ssce_doc.zip SQL Server Compact Edition appears to have some of the simplicity and portability benefits of SqLite -- though not as small or fast -- while bringing other benefits of complete .NET integration and built-in mechanisms for synchronizing mobile devices and desktop computers. Jamal On Tue, 4 Dec 2007, Jamal Mazrui wrote: > Date: Tue, 4 Dec 2007 17:12:53 -0500 (EST) > From: Jamal Mazrui <empower@xxxxxxxxx> > Reply-To: programmingblind@xxxxxxxxxxxxx > To: programmingblind@xxxxxxxxxxxxx > Subject: Data bound fruit basket with SQL Server Compact Edition > > >From the archive at > http://www.EmpowermentZone.com/ssce_fruit.zip > > Previously, I did a fruit basket program in C# 2.0 with data binding via > Microsoft Access or SQLite, available at > http://www.EmpowermentZone.com/db_fruit.zip > > The present program is written in C# 3.0 with data binding via Microsoft > SQL Server Compact Edition 3.5 (previously called Mobile or EveryWhere > Edition). This version of SQL Server was released with the .NET Framework > 3.5 and Visual Studio 2008. It is a freely distributable, embeddable > database system, designed for both mobile devices and desktop computers > (but not web servers). > > A Database is contained in a single file with a .sdf extension, and may be > ported simply by copying the file. The software's home page is at > http://www.microsoft.com/sql/editions/compact/default.mspx > > The fruit basket program requires the runtime engine available from there. > Designer support for compact database applications is provided in Visual > Studio 2008, including the Express Editions. > > The code for this program tries to be minimalistic by using a layout > panel, inferred types, in-line properties, and anonymous event handlers. > The ssee_fruit.sdf database is created if not found. It tracks fruit > added to or deleted from the basket, so the same content is present at the > start of a new program session. > > Jamal > > /* > content of ssce_fruit.cs > Fruit Basket program in C# 3.0 with SQL Server Compact Edition 3.5 > Public domain by Jamal Mazrui > */ > > // Import namespaces > using System; > using System.Data; > using System.Data.SqlServerCe; > using System.IO; > using System.Windows.Forms; > > // Define class > class FruitBasket { > > // Define entry point of program > static void Main() { > // Define full path of database file > var sSdf = Path.Combine(Application.StartupPath, "ssce_fruit.sdf"); > // Define database connection string > var sConnect = "Data Source=" + sSdf; > > // Define connection > using (var connect = new SqlCeConnection(sConnect)) { > var sTable = "Basket"; > var sColumn = "Fruit"; > > // Open connection if database exists, else create it > if (File.Exists(sSdf)) connect.Open(); > else { > using (var engine = new SqlCeEngine(sConnect)) engine.CreateDatabase(); > connect.Open(); > var sCreate = "create table " + sTable + " (ID int identity primary key, " > + sColumn + " nvarchar(20))"; > var createCommand = new SqlCeCommand(sCreate, connect); > createCommand.ExecuteNonQuery(); > } // if database exists > > // Define table adapter > var sSelect = "select * from " + sTable; > var selectCommand = new SqlCeCommand(sSelect, connect); > var adapter = new SqlCeDataAdapter(selectCommand); > var builder = new SqlCeCommandBuilder(adapter); > var table = new DataTable(sTable); > adapter.Fill(table); > > // Create controls; > var tlp = new TableLayoutPanel {ColumnCount = 3, RowCount = 2}; > var lblFruit = new Label {Text = "&Fruit:", Parent = tlp}; > var txtFruit = new TextBox {Parent = tlp}; > var btnAdd = new Button {Text = "&Add", Parent = tlp}; > var lblBasket = new Label {Text = "&Basket:", Parent = tlp}; > var lstBasket = new ListBox {DataSource = table, DisplayMember = sColumn, > Parent = tlp}; > var btnDelete = new Button {Text = "&Delete", Parent = tlp}; > > // Define Add event handler; > btnAdd.Click += (o, e) => { > var sFruit = txtFruit.Text.Trim(); > if (sFruit.Length == 0) MessageBox.Show("No fruit to add!", "Alert"); > else { > table.Rows.Add(null, sFruit); > adapter.Update(table); > lstBasket.SelectedIndex = lstBasket.Items.Count - 1; > txtFruit.Clear(); > } // if fruit to add > }; // add > > // Transfer new ID generated by database into table > table.RowChanged += (o, e) => { > if(e.Action != DataRowAction.Add) return; > > var sTransfer = "SELECT @@identity"; > var transferCommand = new SqlCeCommand(sTransfer, connect); > e.Row["ID"] = transferCommand.ExecuteScalar( ); > }; // transfer > > // Define Delete event handler; > btnDelete.Click += (o,e) => { > var iFruit = lstBasket.SelectedIndex; > if (iFruit == -1) MessageBox.Show("No fruit to delete!", "Alert"); > else { > table.Rows[iFruit].Delete(); > adapter.Update(table); > if (iFruit == lstBasket.Items.Count) iFruit--; > lstBasket.SelectedIndex = iFruit; > } // if fruit to delete > }; // delete > > // Finalize dialog; > var dlg = new Form {Text = "Fruit Basket", AcceptButton = btnAdd, > StartPosition = FormStartPosition.CenterScreen, AutoSize = true, > AutoSizeMode = AutoSizeMode.GrowAndShrink}; > dlg.Controls.Add(tlp); > // Define closing event handler > dlg.Closing += (o, e) => e.Cancel = (MessageBox.Show("Close program?", > "Confirm", MessageBoxButtons.YesNo) == DialogResult.No); > dlg.ShowDialog(); > connect.Close(); > } // using connect > } // Main method > } // FruitBasket class > > // End of ssce_fruit.cs > > __________ > View the list's information and change your settings at > //www.freelists.org/list/programmingblind > __________ View the list's information and change your settings at //www.freelists.org/list/programmingblind