Here is my bug from Friday. I have code something like the following that works in SQL CE 2.0:
string sql = "select field1, field2 from Table";
string conStr = @"Data Source=\Stuff.sdf";
SqlCeConnection con = new SqlCeConnection(conStr);
con.Open();
SqlCeCommand command = new SqlCeCommand(sql, con);
SqlCeDataReader reader = command.ExecuteReader();
SqlCeCommand updateCommand = null;
StringBuilder message = new StringBuilder();
while (reader.Read())
{
object[] vals = new object[reader.FieldCount];
reader.GetValues(vals);
if (null == updateCommand)
{
//... if first record, build update command
DataTable dt = reader.GetSchemaTable();
foreach (DataRow row in dt.Rows)
{
string colName = (string)row["ColumnName"];
message.Append(colName);
message.Append("=");
message.Append(row["ColumnSize"]);
}
}
}
This code merges data from "temp database" into permanent database. Due to the # of tables merging the commands are built by reading the schema of the tables in the to-be-merged database. Some of this code I inherited from someone else, and it works, or I might see about using SqlCeCommandBuilder, but that is a post for another day. This code reads all records from a merge table, and if it is the first record, build update and insert commands using the Schema Table. In SqlCE 2 this works fine. In SQL Mobile, if you call GetSchemaTable()
after you have read the first record from the reader then the ColumnSizes contained in the schema table will be incorrect, reflecting the data in the current record rather than the schema of the table. This results in things like truncated data errors if the first record has 5 chars in a varchar(20) field, etc. The code works as expected if the GetSchemaTable() method is called before you begin reading records.
I can't find anything in the doc describing this as expected behavior, so its submitted as a bug.