1.SQLCE的使用
SqlCE的使用和普通SQL區別不大,但是包不一樣,不多說看例子:
SQLCE3.5使用例程
public class Db
{
public static void WriteLocation(Gps gps)
{
string appPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase.ToString());
string dbcStr = @"Data Source =" + appPath.Replace(@"\\",@"\") + @"\Mc.sdf";
SqlCeConnection sqlCon = new SqlCeConnection(dbcStr);
SqlCeCommand sqlCmd = new SqlCeCommand(" ", sqlCon);
sqlCon.Open();
SqlCeTransaction sqltran = sqlCon.BeginTransaction();
sqlCmd.Transaction = sqltran;
try
{
sqlCmd.CommandText = "INSERT INTO Location_t (Lc_Dt, Lc_Longitude, Lc_Latitude, Lc_Speed, Lc_Direction) VALUES (@Lc_Dt,@Lc_Longitude,@Lc_Latitude,@Lc_Speed,@Lc_Direction)";
sqlCmd.Parameters.Add("Lc_Dt", SqlDbType.DateTime).Value = gps.Datetime;
sqlCmd.Parameters.Add("Lc_Longitude", SqlDbType.Decimal).Value = gps.DLong;
sqlCmd.Parameters.Add("Lc_Latitude", SqlDbType.Decimal).Value = gps.DLat;
sqlCmd.Parameters.Add("Lc_Speed", SqlDbType.Decimal).Value = gps.DSpeed;
sqlCmd.Parameters.Add("Lc_Direction", SqlDbType.Decimal).Value = gps.DDirection;
sqlCmd.ExecuteNonQuery();
sqltran.Commit();
}
catch (Exception ex)
{
sqltran.Rollback();
}
finally
{
sqlCon.Close();
}
}
}
首先需要注意SQLCE需要 using System.Data.SqlServerCe;並且相關的類都要由Sql開頭變為SqlCe開頭。至於使用則和普通Sql沒有什麼區別。
2.ConnectionString
在ConnectionString這裡我很花了點功夫,開始怎麼弄都不對,後來才發現是有點竅門的。在VS2008裡面,它使用的路徑是.\xxx.sdf,而在目標機上是不能使用相對路徑的。
而絕對路徑試了多次都不行,後來才找到一篇文章是取當前程序路徑。string dbcStr = @"Data Source =" + appPath.Replace(@"\\",@"\") + @"\Mc.sdf";即這一句話。
需要注意的是@似乎表示引號中的內容不轉義,這樣呢寫起來會比較方便。如果用轉義的也可以,這個大家可以自己去試。@"\Mc.sdf",這個地方是數據庫相對於執行文件的路徑,
需要根據自己的實際情況進行修改。
3.一個小問題的解決
首先要說的是經驗主義要不得。在用上面的sql語句寫數據庫的時候開始有錯誤:ExPRession evaluation caused an overflow. [ Name of function (if known) = ]。
然後搜索的結果,發現是需要打sqlce sp2 beta2的補丁,結果打了補丁沒用。後來覺得是不是數據類型的問題,將上面程序中對應的幾個decimal的字段的長度和精度都進行了增加,
問題解決。因此估計該Exception應該是數據類型不匹配一類的問題。