Introduction
Many people ask me how we can insert data in SQL Server Compact Edition (CE) database. Actually they had written the code and until they close the emulator, they have those modified/inserted data, but as soon as they close the emulator the data is not reflected in the CE database. They are wondering, "How can that be possible?"
Background
Let’s take a simple example so you can understand the basic concept of what happens behind the scenes:
- You developed software which uses a Microsoft Access database file to store data and the db is deployed in the machine where you installed the software.
- Now you installed the software in Machine A and B.
- When you run the software in Machine A, you made some changes in the db using software.
- Now you closed your software of Machine A, now tell me are the changes made in db of A effected in machine B? Obviously not, here you are.
As compared to the above scenario, when you run your mobile application and it's open in emulator, then both the OS and the emulator are two different machines. Your CE db of OS is totally different from your emulator CE db, so whatever you changed in your emulator db is not getting reflected in your OS.
For example, when you deploy your application in Windows mobile and when you modify the data, the modified data is displayed in mobile not in the OS where you developed that application.
Using the Code
One way I know to do it is by sharing the storage card of Mobile application and pasting the modified db of CE into that shared directory and reusing it.
- Create one Windows mobile application named
SampleMobileApplication.

- Select the “
SampleMobileApplication” project and press right mouse button to open property and change the Output File folder path:

- Create one CE db Emp with two columns
ID and Name.

- Add one form with two buttons Get Employees and Add New:

- Add the following code in the Show Data form:
Imports System.Data
Imports System.Data.SqlServerCe
Imports System.IO
Public Class frmEmp
Private Sub btnGetEmployees_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGetEmployees.Click
GetTableData()
End Sub
Private Sub GetTableData()
Dim conn As SqlCeConnection = Nothing
Try
btnGetEmployees.Enabled = False
conn = New SqlCeConnection("Data Source = _
\Program Files\SampleMobileApplication\mydatabase.sdf;")
conn.Open()
Dim cmd As SqlCeCommand = conn.CreateCommand()
Dim dAdp As SqlCeDataAdapter = New SqlCeDataAdapter()
Dim ds As New DataSet
cmd.CommandText = "SELECT * FROM EMP"
dAdp.SelectCommand = cmd
cmd.ExecuteReader()
dAdp.Fill(ds)
dgEmp.DataSource = ds.Tables(0)
Catch ex As Exception
Finally
conn.Close()
btnGetEmployees.Enabled = True
End Try
End Sub
Private Sub btnAddNew_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnAddNew.Click
Dim frmAddNewEmp As New frmAddEmp
frmAddNewEmp.Show()
End Sub
End Class
- Add another form for adding new employee:

- Add the following code in the new employee:
Imports System.Data
Imports System.Data.SqlServerCe
Imports System.IO
Public Class frmAddEmp
Private Sub btnBack_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnBack.Click
Me.Close()
End Sub
Private Sub btnSave_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnSave.Click
If txtID.Text.Trim.Equals(String.Empty) Then
MessageBox.Show("Please enter three digit employee ID.", Me.Text)
ElseIf txtName.Text.Trim.Equals(String.Empty) Then
MessageBox.Show("Please enter employee name.", Me.Text)
ElseIf txtID.Text.Length > 3 Then
MessageBox.Show("Invalid employee ID length, _
only 3 digits are supported.", Me.Text)
ElseIf txtName.Text.Length > 255 Then
MessageBox.Show("Invalid employee name length, _
only 255 character are supported.", Me.Text)
Else
Dim conn As SqlCeConnection = Nothing
Try
conn = New SqlCeConnection("Data Source = _
\Program Files\SampleMobileApplication\mydatabase.sdf;")
conn.Open()
Dim cmd As SqlCeCommand = conn.CreateCommand()
Dim dAdp As SqlCeDataAdapter = New SqlCeDataAdapter()
Dim ds As New DataSet
cmd.CommandText = String.Format("INSERT INTO EMP(ID, _
[NAME]) VALUES ('{0}','{1}')", txtID.Text, txtName.Text)
dAdp.InsertCommand = cmd
cmd.ExecuteNonQuery()
MessageBox.Show("Saved Successfully.", Me.Text)
txtID.Text = String.Empty
txtName.Text = String.Empty
txtID.Focus()
Catch ex As Exception
MessageBox.Show(ex.Message, Me.Text)
Finally
conn.Close()
End Try
End If
End Sub
End Class
- Run the application and click File -> Configure.
- Define the Shared folder in Emulator Property dialog box as shown below:
- Now start the “
SampleMobileApplication” and click the Get Employees button.
- Now click the Add New button and enter the information and click the save button.
- Now click the Back button then click the Get Employees button.
- You will see that “Albert” is added and displayed in the grid. Now close the application by clicking close button of Form.
- Now by using Up and Down arrow select myDatabase and copy the db by clicking the menu button of Pocket PC as shown below:
- Now open the storage card and paste the db file.
- Refresh the Storage card by going one directory up and back in storage card to see myDatabase file.
- Now close the emulator and open myDatabase from E:\Test or whatever directory path you specified for storage card and you see that the new entry is reflected in the
Emp table.
- Run the application again and you found that the new entry is not reflected. Close the emulator again and now copy that DB from your E:\Test folder and paste it in under the SampleMobileApplication directory and now run the application again and you find that the entry is reflected.
History
- 6th January, 2009: Initial post