SQL CE數據庫搭建和操作


創建新的 SQL Server CE 數據庫

  1. 啟動 Visual Studio .NET,然后打開一個新項目。
  2. 創建對使用的命名空間的引用。

復制

using System;

using System.IO;

using System.Text;

using System.Data;

using System.Data.SqlServerCe;

using System.Collections;

using System.Windows.Forms;

using System.Data.Common;

  1. 創建 WalkThrough 類。

復制

public class WalkThrough

{

    static void Main()

    {

        SqlCeConnection conn = null;

 

        try

        {

  1. 驗證具有您打算使用的名稱的數據庫是否已存在。

復制

            if (File.Exists ("Test.sdf") )

                File.Delete ("Test.sdf");

  1. 使用 System.Data.SqlCeEngine 對象創建名為 Test.sdf 的空數據庫。

注意   SQL Server CE 中,數據庫名稱的文件擴展名為 .sdf。

復制

            SqlCeEngine engine = new SqlCeEngine ("Data Source = Test.sdf");

            engine.CreateDatabase ();

  1. 連接到這個新數據庫。

復制

conn = new SqlCeConnection ("Data Source = Test.sdf");

conn.Open();

創建新表

  1. 使用 System.Data.SqlCeCommand 創建命令類的實例。

復制

SqlCeCommand cmd = conn.CreateCommand();

  1. 運行命令 cmd 創建表。用於創建表的指令必須在 cmd.CommandText 所包含的 SQL 代碼中。

若要使用 SQL Server CE 的 SQL 編程語言創建表,請使用 CREATE TABLE 語法。有關更多信息,請參見《SQL Server CE 聯機手冊》中的用於 SQL Server CE 的 SQL 參考

復制

cmd.CommandText = "CREATE TABLE TestTbl(col1 int PRIMARY KEY, col2 ntext, col3 money)";

cmd.ExecuteNonQuery();

將數據添加到新表中

  1. 運行命令以添加數據行。與創建表相同,用於添加行的指令也必須在 cmd.CommandText 所包含的 SQL 代碼中。

若要使用 SQL Server CE 的 SQL 編程語言將行添加到表中,請使用 INSERT 語法。有關更多信息,請參見《SQL Server CE 聯機手冊》中的用於 SQL Server CE 的 SQL 參考

復制

cmd.CommandText =  "INSERT INTO TestTbl(col1, col2, col3) VALUES (0, 'abc', 15.66)";

cmd.ExecuteNonQuery();

  1. 創建命令,使用參數將數據多次插入表中。

參數可以更高效地查詢數據庫,因為可以使用一組包含參數的 SQL 語句插入多個值。有關更多信息,請參見《SQL Server CE 聯機手冊》的在查詢中使用參數

復制

cmd.CommandText = "INSERT INTO TestTbl(col1, col2, col3) VALUES (?, ?, ?)";

 

cmd.Parameters.Add(new SqlCeParameter("p1", SqlDbType.Int));

cmd.Parameters.Add(new SqlCeParameter("p2", SqlDbType.NText));

cmd.Parameters.Add(new SqlCeParameter("p3", SqlDbType.Money));

 

cmd.Parameters["p2"].Size = 50;

 

cmd.Prepare();

  1. 執行參數化命令,將數據插入表中。

復制

cmd.Parameters["p1"].Value = 1;

cmd.Parameters["p2"].Value = "abc";

cmd.Parameters["p3"].Value = 15.66;

cmd.ExecuteNonQuery();

  1. 清除參數,並檢查已插入表中的數據。

若要使用 SQL Server CE 的 SQL 編程語言讀取現有數據,請使用 SELECT 語法。有關更多信息,請參見《SQL Server CE 聯機手冊》中的用於 SQL Server CE 的 SQL 參考

復制

cmd.Parameters.Clear();

//Set the command text to a SELECT query.

//

cmd.CommandText = "SELECT * FROM TestTbl";

讀取 SQL Server CE 數據庫數據

讀取數據庫數據是一種常見的任務,通常涉及對表行信息的訪問。為使用 System.Data.SqlServerCe 執行此任務,您需要 SqlCeDataReaderSqlCeCommand 對象。

注意   有關完整代碼列表,請參見代碼列表:使用 SQL Server CE 數據庫

  1. 調用 SqlCeCommand 對象的 ExecuteReader 方法以創建 SqlCeDataReader 的實例。

復制

SqlCeDataReader rdr = cmd.ExecuteReader();

  1. 指示數據讀取器 rdr 在行存在時在每行的列中顯示數據。

復制

while (rdr.Read())

{MessageBox.Show("col1 = " + rdr.GetInt32(0) +

     "col2 = " + rdr.GetString(1) +

     "col3 = " + rdr.GetSqlMoney(2));

}

更改 SQL Server CE 數據庫中的數據

在創建表后,可以以多種方式修改表中的數據:更改特定數據的屬性,添加和刪除數據行,甚至還可以通過修改表中的列來更改存儲數據的方式。

在本節中,您將更改表項的值,查找更改的表的數據並處理所有錯誤。為執行這些步驟,您將使用在前面的任務中使用的類:SqlCeCommandSqlCeDataReader。另外,您將使用 SqlCeException 進行錯誤處理。

注意   不能在此任務中運行僅用於特定步驟的代碼。有關完整代碼列表,請參見代碼列表:使用 SQL Server CE 數據庫

更新 SQL Server CE 表中的數據

  • 設置命令對象以使用 UPDATE 語句。

若要使用 SQL Server CE 的 SQL 編程語言更改行列的值,請使用 UPDATE 語法。有關更多信息,請參見《SQL Server CE 聯機手冊》中的用於 SQL Server CE 的 SQL 參考

復制

cmd.CommandText = "UPDATE TestTbl SET col2 = 'some new value' WHERE col1 = 0";

cmd.ExecuteNonQuery();

讀取 SQL Server CE 表中的數據

  1. 設置命令對象以使用 SELECT 語句,然后通過執行 SqlCeCommand.ExecuteReader 創建數據讀取器的實例。

復制

            cmd.CommandText = "SELECT * FROM TestTbl";

 

            rdr = cmd.ExecuteReader();

 

            while (rdr.Read())

            {

                MessageBox.Show(" col1 = " + rdr.GetInt32(0) +

                    " col2 = " + rdr.GetString(1) +

                    " col3 = " + rdr.GetSqlMoney(2));

            }

 

        }

  1. 使用 SqlCeException 捕獲任何錯誤,然后關閉與數據庫的連接。

復制

 catch (SqlCeException e)

{

      ShowErrors(e);

}

finally

{

   if(conn.State == ConnectionState.Open)

      conn.Close();

}

}

 

    public static void ShowErrors(SqlCeException e)

    {

        SqlCeErrorCollection errorCollection = e.Errors;

 

        StringBuilder bld = new StringBuilder();

 

        foreach (SqlCeError err in errorCollection)

        {

            bld.Append("\n Error Code: " + err.HResult.ToString("X"));

            bld.Append("\n Message   : " + err.Message);

            bld.Append("\n Minor Err.: " + err.NativeError);

            bld.Append("\n Source    : " + err.Source);

               

            foreach (int numPar in err.NumericErrorParameters)

            {

                if (0 != numPar) bld.Append("\n Num. Par. : " + numPar);

            }

               

            foreach (string errPar in err.ErrorParameters)

            {

                if (String.Empty != errPar) bld.Append("\n Err. Par. : " + errPar);

            }

 

            MessageBox.Show(bld.ToString());

            bld.Remove(0, bld.Length);

        }

    }

}

有關 SQL Server CE 中的錯誤處理的更多信息,請參見《SQL Server CE 聯機手冊》中的錯誤處理

 

 

 

System.Data.SqlServerCe 命名空間

System.Data.SqlServerCe 命名空間是用於 SQL Server Compact 3.5 的托管數據提供程序。此命名空間是類的集合,這些類提供對 SQL Server Compact 3.5 數據庫的訪問。通過使用 System.Data.SqlServerCe,您可以從智能設備或計算機創建、管理和同步 SQL Server Compact 3.5 數據庫。

以下功能可用於創建 SQL Server Compact 3.5 桌面應用程序。

  • 對 System.Transaction.TransactionScope 類的支持。
  • Entity Framework (System.Data.SqlServerCe.Entity.dll) 的 SQL Server Compact 3.5 提供程序。
  • Visual Studio 2008 中的對 Visual C++ 速成版 和 Visual Basic 速成版 應用程序開發的支持。
  • 通過使用 Sync Services for ADO.NET 對同步數據的支持。

 

說明

                                                                     

ResultSetEnumerator

可用於循環訪問 ResultSet 對象中的記錄集合的枚舉器。 ResultSetEnumerator 不應從代碼直接使用。 直接使用SqlCeResultSet 對象可以獲得更多功能。

    

ResultSetView

實現數據綁定接口,並在用戶界面控件與 SqlCeResultSet 之間起到橋梁作用。

    

RowView

基礎結構。

    

SqlCeChangeTracking

提供可用於跟蹤對 SQL Server Compact 數據庫中的表所做更改的方法。

    

SqlCeCommand

表示對數據源執行的 SQL 語句。

    

SqlCeCommandBuilder

提供一種方法,以自動生成用於協調對 DataSet 所做的更改和關聯數據庫的單表命令。無法繼承此類。

    

SqlCeConnection

表示到 SQL Server Compact 3.5 數據源的連接是打開的。

    

SqlCeDataAdapter

表示一組數據命令和一個數據庫連接,它們用於填充 DataSet 和更新數據源。

    

SqlCeDataReader

提供從數據源讀取數據行的只進流的方法。無法繼承此類。

    

SqlCeEngine

表示 SQL Server Compact 3.5 引擎對象的屬性、方法及其他對象。無法繼承此類。

    

SqlCeError

收集與數據源返回的警告或錯誤有關的信息。 無法繼承此類。

    

SqlCeErrorCollection

收集 SQL Server Compact 3.5 的 .NET Compact Framework 數據訪問接口產生的所有錯誤。   無法繼承此類。

    

SqlCeException

基礎提供程序從 SQL Server Compact 3.5 數據源返回警告或錯誤時引發的異常。   無法繼承此類。

    

SqlCeFlushFailureEventArgs

封裝 FlushFailure 事件的事件參數。

    

SqlCeInfoMessageEventArgs

為 InfoMessage 事件提供數據。 無法繼承此類。

    

SqlCeInvalidDatabaseFormatException

嘗試打開較舊或較新 SQL Server Compact 版本的數據庫文件時,SQL   Server Compact 數據源引發異常。

    

SqlCeLockTimeoutException

如果已經達到鎖超時,則會引發此異常。

    

SqlCeParameter

表示 SqlCeCommand 的參數,還可表示該參數到一個 DataSet 列的映射。   無法繼承此類。

    

SqlCeParameterCollection

收集與 SqlCeCommand 有關的所有參數以及它們各自到 DataSet 列的映射。

    

SqlCeProviderFactory

表示一組方法,這些方法用於創建訪問接口對數據源類的實現的實例。

    

SqlCeRemoteDataAccess

初始化 SqlCeRemoteDataAccess 對象的新實例。有關遠程數據訪問的更多信息,請參見使用遠程數據訪問 (RDA)

    

SqlCeReplication

初始化 SqlCeReplication 對象的新實例。有關 SQL Server 復制的詳細信息,請參閱   SQL Server 聯機叢書。有關 SQL Server Compact 3.5 中合並復制的詳細信息,請參閱   SQL Server Compact 3.5 聯機叢書。

    

SqlCeResultSet

一個可更新、可滾動並且可綁定的游標。

    

SqlCeRowUpdatedEventArgs

為 RowUpdated 事件提供數據。

    

SqlCeRowUpdatingEventArgs

為 RowUpdating 事件提供數據。

    

SqlCeTransaction

表示要在數據源執行的 SQL 事務。無法繼承此類。

    

SqlCeTransactionInProgressException

在另一個事務進行期間嘗試修改數據庫時發生。

    

SqlCeType

基礎結構。

    

SqlCeUpdatableRecord

表示數據源中一行可更新的值。 SqlCeResultSet 對象包含一個或多個 UpdatableRecords。

    

SqlMetaData

基礎結構。指定並檢索從數據庫中檢索的參數和列中的元數據信息。 無法繼承此類。

委托

 

委托

說明

    

OnStartTableDownload

用戶為開始從服務器下載表更改時激發的事件定義的委托。

    

OnStartTableUpload

用戶為開始將表更改上載到服務器時激發的事件定義的委托。

    

OnSynchronization

一種用戶定義的委托,使用調解程序工作期間報告的正在執行的同步事件。

    

SqlCeFlushFailureEventHandler

必須實現偵聽 FlushFailure 事件的委托。

    

SqlCeInfoMessageEventHandler

表示將處理 SqlCeConnection 的 InfoMessage 事件的方法。

    

SqlCeRowUpdatedEventHandler

表示將要處理 SqlCeDataAdapter 的 RowUpdated 事件的方法。

    

SqlCeRowUpdatingEventHandler

表示處理 SqlCeDataAdapter 的 RowUpdating 事件的方法。

枚舉

 

枚舉

說明

    

AddOption

確定在添加訂閱時是將訂閱添加到現有數據庫還是創建新的數據庫。

    

CommitMode

當傳遞給 Commit 函數時,CommitMode 指定發生提交的時間。

    

DbInsertOptions

指定在使用 [System.Data.SqlServerCe.SqlCeResultSet.Insert] 方法時要使用的選項。

    

DbRangeOptions

指定在指定要查找的索引范圍時,SetRange 方法使用的選項。

    

DbSeekOptions

指定 Seek 方法將如何對索引進行搜索的選項。

    

DropOption

指定使用 DropSubscription 方法刪除訂閱時,是保留還是刪除數據庫。

    

ExchangeType

指定僅將數據合並到發布服務器還是在發布服務器和訂閱服務器之間進行雙向合並。

    

NetworkType

指定在設置 SqlCeReplication 對象的 DistributorNetwork 或 PublisherNetwork 屬性時使用的網絡協議。

    

PurgeType

指定當使用 SqlCeChangeTracking 類的 PurgeTombstoneTableData 方法或 PurgeTransactionSequenceData 方法時用於清除元數據的條件。

    

RdaBatchOption

指定是否將與 Push 相關聯的行組成一批,歸並到單個事務中。

    

RdaTrackOption

指定是否跟蹤正被提取到設備的表。

    

RepairOption

當傳遞給 Repair 方法時,RepairOption 指定要執行的數據庫修復類型。

    

ResultSetOptions

設置 ResultSetEnumerator 的選項。

    

ResultSetSensitivity

設置 ResultSetEnumerator 的敏感度。

    

SecurityType

指定復制期間在連接到發布服務器或分發服務器時要使用的安全模式。

    

SnapshotTransferType

控制如何將快照文件從分發服務器傳輸到運行 IIS 的計算機。

    

TrackingKeyType

指定用於標識跟蹤數據的鍵的類型。

    

TrackingOptions

指定要跟蹤的表操作。

    

ValidateType

指定要執行的數據驗證的類型。

    

VerifyOption

這些選項確定要使用的數據庫驗證的級別。

 

 

 

使用 System.Data.SqlServerCe

System.Data.SqlServerCe 提供了從運行在基於 Windows CE .NET 的平台上的 Microsoft Visual Studio .NET 應用程序對 Microsoft SQL Server 2000 Windows CE Edition (SQL Server CE) 數據庫的編程訪問。System.Data.SqlServerCe 提供了旨在公開 SQL Server CE 功能的類集。

有關如何使用 System.Data.SqlServerCe 類創建和訪問 SQL Server CE 數據庫的信息,請參見演練一節中的使用 SQL Server CE 數據庫

支持的功能

System.Data.SqlServerCe 提供了以下功能:

  • 對 SQL Server CE 數據源的一致訪問

共享數據的使用者應用程序可以使用 SQL Server CE 數據提供程序,連接到 SQL Server CE 數據源檢索、操作和更新數據。

  • 用於連接到數據庫、運行命令和檢索結果的組件

檢索的結果可以直接處理,或放在 ADO.NET DataSet 對象中以便以一種特殊方式向用戶公開,與來自多個數據源的數據合並或在各層之間遠程傳播。

  • 對編寫托管代碼的開發人員的支持

該功能類似於 ADO 向本機 COM 開發人員提供的功能。

  • 索引功能以實現最佳性能

SqlCeCommand.SetRange 限制通過 SqlCeDataReader.Read 和 SqlCeDataReader.Seek 調用可見的行項集。SqlCeDataReader.Seek 允許在當前范圍內的關鍵值處直接定位。

  • 通過 SqlCeReplication 和 SqlCeRemoteDataAccess 類與 SQL Server CE Replication 和遠程數據訪問 (RDA) 對象進行交互所需的接口
  • 支持數據庫創建和壓縮的 SqlCeEngine 類方法。
  • 參數化查詢

在 SqlCeCommand.CommandText 屬性中,所有參數占位符必須用問號 (?) 代替。不支持命名的參數。

  • 數據庫加密和密碼保護
  • SqlCeDataReader.GetValue 返回類型 SqlDecimal 的值。

System.Data.SqlServerCe 命名空間中的 SqlCeDataReader.GetValue 方法返回類型 System.Data.SqlTypes.SqlDecimal 的值,而 System.Data.SqlClient命名空間中的 SqlDataReader.GetValue 方法返回類型 System.Decimal 的值。

提供程序限制

System.Data.SqlServerCe 有以下限制:

  • 僅支持與 SQL Server CE 數據源的一個並行連接。不過,與 System.Data.SqlClient 不同的是,System.Data.SqlServerCe 支持在同一連接上創建的多個數據讀取器。
  • 不支持批查詢。查詢必須是單個 SQL 語句。例如,下面的語句是有效的:
1.      SELECT * FROM Customers

下面的語句是無效的:

2.      SELECT * FROM Customers; SELECT * FROM Customers2

Datasets 必須從 SqlCeDataAdapter 中刷新。如果使用的是 Visual Studio .NET 項目中的代碼,必須修改 SQL 語句以遵守此限制。

  • 不支持嵌套或並行事務。
  • 不支持命名的參數。

使用 System.Data.SqlClient

可以使用 System.Data.SqlClient 命名空間開發基於 Microsoft Windows CE .NET 的應用程序,這些應用程序將訪問 Microsoft SQL Server 7.0 或更高版本中的數據庫。System.Data.SqlClient 是 SQL Server .NET Framework 精簡版數據提供程序。該數據提供程序與 .NET Framework 的 System.Data.SqlClient 命名空間相對應。

與它在 .NET Framework 中的副本一樣,.NET Framework 精簡版中的 System.Data.SqlClient 是特定類的集合,這些類可用於從基於 Windows CE .NET 的設備中訪問包含托管代碼的 SQL Server 數據庫。

除非另外說明,否則 System.Data.SqlClient 命名空間中的所有對象與 .NET Framework 的 System.Data.SqlClient 命名空間中的相應對象相匹配。

提供程序限制

以下列表描述了適用於基於 Windows CE .NET 的設備和 .NET Framework 精簡版的限制和例外情況:

  • 不受支持的類

不支持 SqlClientPermission 和 SqlClientPermissionAttribute 類。

  • ConnectionString 屬性

在基於 Windows CE .NET 的設備上,使用 System.Data.SqlClient 的應用程序可能使用 Windows 身份驗證協議,而不是使用 SQL Server 身份驗證。為此,連接字符串必須包含以下屬性。

屬性

集成安全性

SSPI

用戶 ID

Domain\username

密碼

<password>

另外,不支持以下 ConnectionString 屬性:AttachDBFilename、Max Pool Size、Min Pool Size、Connection Lifetime、Connection Reset、Enlist、Pooling、Network Library 和 Encrypt。

  • ANSI 數據

僅在基於英語的設備上,才支持 SQL_Latin1_General_CP1_CI_AS 排序規則的 ANSI 數據。.NET Framework 中的所有字符串都是 Unicode。System.Data.SqlClient 使用 .NET Framework 編碼類將 SQL Server 中的 ANSI 數據轉換為 Unicode。盡管在 .NET Framework 精簡版中支持編碼類,但並非支持所有代碼頁。

此外,如果基於 Windows CE .NET 的設備未提供 ANSI 列的代碼頁,則 System.Data.SqlClient 不能讀取或寫入該列。如果不能使用 ANSI 到 Unicode 轉換的代碼頁,System.Data.SqlClient 就會生成錯誤。

有關可用於基於 Windows CE .NET 的特定設備的代碼頁的信息,請與設備制造商聯系。

  • 連接池

不支持連接池。任何時候,設備與 SQL Server 實例都只能有少量的連接。

  • 分布式事務

不支持分布式事務。事務不能跨數據庫或服務器。System.Data.SqlClient 在分布式事務期間產生 InvalidOperationException 異常。

  • 網絡庫選擇

只支持與 SQL Server 實例的 TCP/IP 連接。System.Data.SqlClient 不能通過設備插座連接到 SQL Server。

  • 網絡庫加密

不支持與 SQL Server 實例的加密連接。如果運行 SQL Server 的計算機上安裝了安全套接層 (SSL) 證書,連接將失敗。

  • Windows 身份驗證

支持 Windows 身份驗證;不過,必須始終在連接字符串中指定用於域控制器中的身份驗證的用戶 ID 和密碼。

有關更多信息,請參見 .NET Framework 精簡版 SDK 中的 System.Data.SqlClient 命名空間參考。

使用 SQL Server CE 管理數據

可以使用 Microsoft ADO.NET 訪問設備上的 Microsoft SQL Server 2000 Windows CE Edition (SQL Server CE) 數據庫。SQL Server CE 提供了與基本關系數據庫功能相似的 SQL Server 編程模型,即數據庫存儲區、查詢處理器以及可靠且可伸縮的連接。

SQL Server CE 連接解決方案使用 Web 協議 HTTP 或 HTTPS 進行通信。在使用連接解決方案之前,必須在運行 IIS 的計算機上安裝 SQL Server CE Server Tools。SQL Server CE 支持以下連接解決方案,這些連接解決方案用於管理設備上的 SQL Server CE 數據庫和服務器上的 SQL Server 數據庫之間的數據:

  • 合並復制
  • 遠程數據訪問 (RDA)

在通過 HTTP 使用復制或 RDA 訪問 SQL Server 的數據庫之前,必須設置一個虛擬目錄並配置相應的 NTFS 權限。有關更多信息,請參見《SQL Server CE 聯機手冊》的配置連接安全性

合並復制

SQL Server CE 中的合並復制基於 Microsoft SQL Server 2000 中實現的合並復制。合並復制非常適合移動設備,因為它使移動設備和服務器上的數據可以分別更新。以后當設備連接到服務器時,設備和服務器上的數據可以同步。

合並復制的常見方案包括:只讀復制,數據捕獲和上載,以及復制、更新和同步。大多數應用程序將這些方案組合起來使用。例如,銷售支持應用程序可能使用只讀復制將價格表下載到設備中,同時依靠數據捕獲和上載捕獲設備上的新訂單,然后將它們上載到服務器中。

可以使用水平和垂直篩選器定義和維護不同客戶端或客戶端組的唯一數據子集。水平篩選器可用於復制已發布的表行的子集。垂直篩選器可用於復制已發布的表列的子集。

有關更多信息,請參見《SQL Server CE 聯機手冊》的使用復制

若要實現復制,請使用 System.Data.SqlServerCe 命名空間的 SqlCeReplication 類。

遠程數據訪問

RDA 為基於 Windows CE .NET 的應用程序提供了訪問位於 Microsoft SQL Server 7.0 版或 SQL Server 2000 遠程實例上的數據庫的簡單方法。當不需要使用合並復制的完整功能時可以使用 RDA。使用 RDA 時不需要配置 SQL Server 復制或創建發布。

應用程序可以用兩種方式使用 RDA:一種是應用程序提交數據操作語言 (DML) 語句,該語句被轉交到 SQL Server 系統以執行,另一種是應用程序提供返回行集合的 SQL 查詢。結果行集合被傳送到基於 Windows CE 的設備,並以表的形式存儲在那里。還選擇跟蹤應用程序所做的所有更改。當應用程序發出請求時,更新的行被發送回服務器,並在那里應用於 SQL Server 數據庫。

有關更多信息,請參見《SQL Server CE 聯機手冊》的使用遠程數據訪問

若要實現 RDA,請使用 System.Data.SqlServerCe 命名空間的 SqlCeRemoteDataAccess 類。

有關 SQL Server CE 的更多信息,請參見 SQL Server CE 聯機手冊

配置 SQL Server CE 開發環境

Microsoft SQL Server 2000 Windows CE Edition (SQL Server CE) 的開發環境可配置為單服務器環境或多服務器環境。基於 Windows CE .NET 的設備可直接連接到單服務器或多服務器開發環境。根據服務器配置的不同,可能需要在多台計算機上安裝 SQL Server CE Server Tools。布署和調試應用程序必須使用 Microsoft ActiveSync。

多台服務器通常用在生產環境中(特別是在公司中),因為它們提供了更大的靈活性,並且能夠更好地滿足復雜的安全需要。但是,如果您是首次設置 SQL Server CE,可以考慮設置單服務器環境。這樣可以將所有必要的服務器軟件安裝在一台計算機上。若要進一步簡化設置,可以將單服務器和開發環境組合在一台計算機上,創建一個完整的開發和測試環境。成功設置了單服務器環境后,可以很容易地遷移到多服務器環境。

注意   可以使用模擬器測試應用程序;不過,在通過模擬器運行應用程序時不能使用安全套接層 (SSL) 加密。

安裝 Visual Studio .NET 時會自動配置 SQL Server CE 的開發環境。在安裝 Visual Studio 后,還必須配置 Microsoft Internet 信息服務 (IIS) 系統和基於 Windows CE .NET 的設備。運行 IIS 的計算機上還必須安裝 SQL Server CE Server Tools。SQL Server CE Server Tools 只與 SQL Server 2000 Service Pack 1 和更高版本兼容。在同時運行 IIS 和 SQL Server 2000 的計算機上安裝 SQL Server CE Server Tools 時,要確保 SQL Server CE Server Tools 的安裝程序與 SQL Server 2000 版本相對應。

文件名

兼容版本

Sqlcesql2ksp1.exe

SQL   Server 2000 Service Pack 1

Sqlcesql2ksp2.exe

SQL   Server 2000 Service Pack 2

SQL Server CE 組件位置

SQL Server CE 組件包含在 Microsoft Visual Studio .NET 中。下表按文件位置列出了安裝在開發計算機上的文件。默認情況下,這些文件和位置在 \Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000 中創建。

位置

內容

\Windows   CE

包含 SQL Server CE Assemblies、System.Data.SqlServerCe.dll 和System.Data.Common 的文件夾。

\Windows   CE\wce300 
  和 
  \Windows CE\wce400

一系列子文件夾,包含 CAB 文件 Sqlce.platform.processor.cab、Sqlce.dev.platform.processor.cab   和 Sql.platform.processor.cab。每個文件夾與   Windows CE 操作系統的一個版本和一個處理器類型相對應。
  Sqlce.platform.processor.cab 包含 SQL Server CE 所需的全部文件。
  Sqlce.dev.platform.processor.cab 包含 Isqlw20.exe(實現   SQL Server CE 查詢分析器的程序)和 Ssceerror20en.dll(提供在開發期間使用的錯誤說明的   DLL)。
  Sql.platform.processor.cab 包含使用 System.Data.SqlClient 所需的全部文件。

\

包含 SQL Server CE 聯機手冊 (Sqlce.chm)、SQL   Server CE Server Tools 自解壓縮可執行文件(Sqlcesql2ksp1.exe 或   Sqlcesql2ksp2.exe)和 ActiveSync 的 SQL   Server CE Relay 擴展 (SSCERelay.exe)。

\Samples

一系列包含示例應用程序的文件夾。

有關安裝問題的更多信息,請參見《SQL Server CE 聯機手冊》中的以下主題:

請參見

 

 

 

 

在Wince和Windows Mobile下最常用的數據庫為SQL CE,SQL CE也曾經叫做SQL Server for Windows CE和SQL Server

 Mobile Edition,最新版本命名為SQL Server Compact 3.5 SP1。 SQL Server Compact不僅僅能運行於Wince和Windows Mobile,而且能運行於Windows的PC上,是Access的有效替代品,如果不使用存儲過程,在SQL Server Compact下開發的程序幾乎可以無修改移植到SQL Server的其他服務器版本上。可以參見這篇文章 SQL Server Express和SQL Server Compact的應用  。在這篇文章中我會使用SQL CE這一命名。

   在.NET Compact Framework下進行SQL CE使用和開發,需要應用庫System.Data.SqlServerCe.dll,需要注意的是不同的SQL CE版本使用不用的DLL版本. SQL CE 3.5的庫一般對應以下的目錄 C:Program FilesMicrosoft SQL Server Compact Editionv3.5 ADO.net DLL,而SQL CE 3.0的庫一般對應以下的目錄 C:Program FilesMicrosoft Visual Studio 8SmartDevicesSDKSQL ServerMobile,彼此不相兼容。由於開發的命名空間(namespace)是一致的,所以開發的程序可以用在不用的SQL CE版本。

  helper類

  下面演示的是一個SQL CE的helper類,這個類只是針對SQL CE數據庫,沒有考慮移植到其他數據庫,所以所有的類都使用SQL CE相關的類。


    class SqlCeHelper : IDisposable
{
private SqlCeConnection connection;
private SqlCeCommand command;
private const string connectionString = "Data Source=/DB/db.sdf";
#region Open/Close
public void Open()
{
try
{
connection = new SqlCeConnection(connectionString);
command = connection.CreateCommand();
command.Connection = connection;
command.CommandType = CommandType.Text;
connection.Open();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
}
public void Close()
{
connection.Close();
connection.Dispose();
}
public void Dispose()
{
connection.Close();
connection.Dispose();
command.Dispose();
}
#endregion
#region Operatons
public SqlCeDataReader ExecuteReader(string sql)
{
command.CommandText = sql;
SqlCeDataReader reader = null;
try
{
reader = command.ExecuteReader();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return reader;
}
public DataSet ExecuteDataSet(string sql)
{
command.CommandText = sql;
SqlCeDataAdapter adapter = new SqlCeDataAdapter(command);
DataSet ds = new DataSet(); ;
try
{
adapter.Fill(ds);
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return ds;
}
public int ExecuteNonQuery(string sql)
{
command.CommandText = sql;
int result = -1;
try
{
result = command.ExecuteNonQuery();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return result;
}
public object ExecuteScalar(string sql)
{
command.CommandText = sql;
object o = null;
try
{
o = command.ExecuteScalar();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return o;
}
#endregion
#region Transaction
public void BeginTransaction()
{
command.Transaction = connection.BeginTransaction();
}
public void CommitTransaction()
{
command.Transaction.Commit();
}
public void RollbackTransaction()
{
command.Transaction.Rollback();
}
#endregion
}

 

 1.建立SQL CE的連接(SqlCeConnection)只需要指定數據庫文件路徑,在這個類,我hardcode了文件路徑,在實際應用中,可以在構

  造函數進行初始化,或者在Open函數中傳遞路徑參數。

 2.由於SQL CE當前版本不支持存儲過程,所以SqlCeCommand的CommandType指定為CommandType.Text,只支持執行SQL語句。

  3.實現了通用操作方法ExecuteReader,ExecuteDataSet,ExecuteNonQuery和ExecuteScalar。

  4.SQL CE支持事務(Transaction)。

  使用

 

  圖片看不清楚?請點擊這里查看原圖(大圖)。

  上圖為使用例子的表結構。


            SqlCeHelper sqlCe = new SqlCeHelper();
sqlCe.Open();
sqlCe.BeginTransaction();
if (sqlCe.ExecuteNonQuery("delete from t") < 0)
{
sqlCe.RollbackTransaction();
return;
}
if (sqlCe.ExecuteNonQuery("insert into t (f1, f2) values (1, 'abc')") < 0)
{
sqlCe.RollbackTransaction();
return;
}
SqlCeDataReader reader = sqlCe.ExecuteReader("select * from t where f1 = 1");
while (reader.Read())
{
Console.WriteLine("reader: f2:{0}n", reader["f2"]);
}
if (!reader.IsClosed)
{
reader.Close();
}
if (sqlCe.ExecuteNonQuery("update t set f2 = 'xyz'") < 0)
{
sqlCe.RollbackTransaction();
return;
}
DataSet ds = sqlCe.ExecuteDataSet("select * from t");
foreach (DataRow dr in ds.Tables[0].Rows)
{
Console.WriteLine("dataset: f2:{0}n", dr["f2"]);
}
sqlCe.CommitTransaction();
sqlCe.Close();

 使用這個Helper類很簡單,先生成這個類的實例,打開數據庫連接,使用ExecuteReader和ExecuteDataSet進行查詢操作,使用ExecuteNonQuery進行增刪改的操作。在操作過程中,同時可以加入事務處理操作,使用完畢關閉數據庫連接。

 

 

 

在Wince和Windows Mobile下最常用的數據庫為SQL CE,SQL CE也曾經叫做SQL Server for Windows CE和SQL Server Mobile Edition,最新版本命名為SQL Server Compact 3.5 SP1。 SQL Server Compact不僅僅能運行於Wince和Windows Mobile,而且能運行於Windows的PC上,是Access的有效替代品,如果不使用存儲過程,在SQL Server Compact下開發的程序幾乎可以無修改移植到SQL Server的其他服務器版本上。可以參見這篇文章 SQL Server Express和SQL Server Compact的應用  。在這篇文章中我會使用SQL CE這一命名。


在.NET Compact Framework下進行SQL CE使用和開發,需要應用庫System.Data.SqlServerCe.dll,需要注意的是不同的SQL CE版本使用不用的DLL版本. SQL CE 3.5的庫一般對應以下的目錄 C:\Program Files\Microsoft SQL Server Compact Edition\v3.5 ADO.net DLL,而SQL CE 3.0的庫一般對應以下的目錄 C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Mobile,彼此不相兼容。由於開發的命名空間(namespace)是一致的,所以開發的程序可以用在不用的SQL CE版本。

 

helper類

下面演示的是一個SQL CE的helper類,這個類只是針對SQL CE數據庫,沒有考慮移植到其他數據庫,所以所有的類都使用SQL CE相關的類。

 

    class SqlCeHelper : IDisposable
    {
        private SqlCeConnection connection;
        private SqlCeCommand command;
        private const string connectionString = "Data Source=/DB/db.sdf";

        #region Open/Close
        public void Open()
        {
            try
            {
                connection = new SqlCeConnection(connectionString);
                command = connection.CreateCommand();
                command.Connection = connection;
                command.CommandType = CommandType.Text;

                connection.Open();
            }
            catch (DataException e)
            {
                Console.WriteLine(e.Message);
            }
        }

        public void Close()
        {
            connection.Close();
            connection.Dispose();
        }

        public void Dispose()
        {
            connection.Close();
            connection.Dispose();
            command.Dispose();
        }
        #endregion

        #region Operatons
        public SqlCeDataReader ExecuteReader(string sql)
        {
            command.CommandText = sql;
            SqlCeDataReader reader = null;
            try
            {
                reader = command.ExecuteReader();
            }
            catch (DataException e)
            {
                Console.WriteLine(e.Message);
            }
            return reader;
        }

        public DataSet ExecuteDataSet(string sql)
        {
            command.CommandText = sql;
            SqlCeDataAdapter adapter = new SqlCeDataAdapter(command);
            DataSet ds = new DataSet(); ;

            try
            {
                adapter.Fill(ds);
            }
            catch (DataException e)
            {
                Console.WriteLine(e.Message);
            }
            return ds;
        }

        public int ExecuteNonQuery(string sql)
        {
            command.CommandText = sql;
            int result = -1;

            try
            {
                result = command.ExecuteNonQuery();
            }
            catch (DataException e)
            {
                Console.WriteLine(e.Message);
                
            }
            return result;
        }

        public object ExecuteScalar(string sql)
        {
            command.CommandText = sql;
            object o = null;
            try
            {
                o = command.ExecuteScalar();
            }
            catch (DataException e)
            {
                Console.WriteLine(e.Message);
            }
            return o;
        }
        #endregion

        #region Transaction
        public void BeginTransaction()
        {
            command.Transaction = connection.BeginTransaction();
        }

        public void CommitTransaction()
        {
            command.Transaction.Commit();
        }

        public void RollbackTransaction()
        {
            command.Transaction.Rollback();
        }
        #endregion
    }

1.建立SQL CE的連接(SqlCeConnection)只需要指定數據庫文件路徑,在這個類,我hardcode了文件路徑,在實際應用中,可以在構造函數進行初始化,或者在Open函數中傳遞連接串參數。
2.由於SQL CE當前版本不支持存儲過程,所以SqlCeCommand的CommandType指定為CommandType.Text,只支持執行SQL語句。
3.實現了通用操作方法ExecuteReader,ExecuteDataSet,ExecuteNonQuery和ExecuteScalar。
4.SQL CE支持事務(Transaction)。

使用

 

上圖為使用例子的表結構。

            SqlCeHelper sqlCe = new SqlCeHelper();

            sqlCe.Open();

            sqlCe.BeginTransaction();
            if (sqlCe.ExecuteNonQuery("delete from t") < 0)
            {
                sqlCe.RollbackTransaction();
                return;
            }

            if (sqlCe.ExecuteNonQuery("insert into t (f1, f2) values (1, 'abc')") < 0)
            {
                sqlCe.RollbackTransaction();
                return;
            }

            SqlCeDataReader reader = sqlCe.ExecuteReader("select * from t where f1 = 1");
            while (reader.Read())
            {
                Console.WriteLine("reader: f2:{0}\n", reader["f2"]);
            }
            if (!reader.IsClosed)
            {
                reader.Close();
            }

            if (sqlCe.ExecuteNonQuery("update t set f2 = 'xyz'") < 0)
            {
                sqlCe.RollbackTransaction();
                return;
            }

            DataSet ds = sqlCe.ExecuteDataSet("select * from t");
            foreach (DataRow dr in ds.Tables[0].Rows)
            {
                Console.WriteLine("dataset: f2:{0}\n", dr["f2"]);
            }

            sqlCe.CommitTransaction();
            sqlCe.Close();

使用這個Helper類很簡單,先生成這個類的實例,打開數據庫連接,使用ExecuteReader和ExecuteDataSet進行查詢操作,使用ExecuteNonQuery進行增刪改的操作。在操作過程中,同時可以加入事務處理操作,使用完畢關閉數據庫連接。

參考文獻

System.Data.SqlServerCe Namespace

 

 

作者:Jake LinJake's Blog on 博客園) 
出處:http://procoder.cnblogs.com

本作品由Jake Lin創作,采用知識共享署名-非商業性使用-禁止演繹 2.5 中國大陸許可協議進行許可。 任何轉載必須保留完整文章,在顯要地方顯示署名以及原文鏈接。如您有任何疑問或者授權方面的協商,請給我留言

演練:使用 SQL Server CE 數據庫

本節將指導您完成使用 Microsoft SQL Server 2000 Windows CE Edition (SQL Server CE) 數據庫時需要執行的主要任務。假定您沒有任何 SQL Server CE 數據庫,需要在新的 Microsoft Visual Studio .NET 項目中創建新的數據庫。

該演練包括以下任務:

  • 創建新的 SQL Server CE 數據庫
  • 讀取 SQL Server CE 數據庫數據
  • 更改 SQL Server CE 數據庫中的數據

闡釋以上每個任務步驟的代碼旨在一起運行。不能在任務中運行僅用於特定步驟的代碼。有關完整代碼列表,請參見代碼列表:使用 SQL Server CE 數據庫

創建新的數據庫

SQL Server CE 中的數據庫是存儲結構化數據的表集合。在可以存儲數據庫之前,必須創建數據庫。在創建數據庫之后,可以創建保存數據的表。

在本節中,您將創建一個新的數據庫,然后創建一個表,最后將數據添加到該表中。若要執行這些步驟,請使用 SQL Server CE (System.Data.SqlServerCe) .NET Framework 精簡版數據提供程序的 SqlCeConnectionSqlCeEngine 和 SqlCeCommand 類。

注意   不能在此任務中運行僅用於特定步驟的代碼。有關完整代碼列表,請參見代碼列表:使用 SQL Server CE 數據庫

創建新的 SQL Server CE 數據庫

  1. 啟動 Visual Studio .NET,然后打開一個新項目。
  2. 創建對使用的命名空間的引用。
  3. 創建 WalkThrough 類。
  4. 驗證具有您打算使用的名稱的數據庫是否已存在。
  5. 使用 System.Data.SqlCeEngine 對象創建名為 Test.sdf 的空數據庫。
1.      using System;
2.      using System.IO;
3.      using System.Text;
4.      using System.Data;
5.      using System.Data.SqlServerCe;
6.      using System.Collections;
7.      using System.Windows.Forms;
8.      using System.Data.Common;
1.      public class WalkThrough 
2.      {
3.          static void Main() 
4.          {
5.              SqlCeConnection conn = null;
6.       
7.              try 
8.              {
1.                  if (File.Exists ("Test.sdf") )
2.                      File.Delete ("Test.sdf");

注意   SQL Server CE 中,數據庫名稱的文件擴展名為 .sdf。

1.                  SqlCeEngine engine = new SqlCeEngine ("Data Source = Test.sdf");
2.                  engine.CreateDatabase ();
  1. 連接到這個新數據庫。
1.      conn = new SqlCeConnection ("Data Source = Test.sdf");
2.      conn.Open();

創建新表

  1. 使用 System.Data.SqlCeCommand 創建命令類的實例。
  2. 運行命令 cmd 創建表。用於創建表的指令必須在 cmd.CommandText 所包含的 SQL 代碼中。
1.      SqlCeCommand cmd = conn.CreateCommand();

若要使用 SQL Server CE 的 SQL 編程語言創建表,請使用 CREATE TABLE 語法。有關更多信息,請參見《SQL Server CE 聯機手冊》中的用於 SQL Server CE 的 SQL 參考

1.      cmd.CommandText = "CREATE TABLE TestTbl(col1 int PRIMARY KEY, col2 ntext, col3 money)";
2.      cmd.ExecuteNonQuery();

將數據添加到新表中

  1. 運行命令以添加數據行。與創建表相同,用於添加行的指令也必須在 cmd.CommandText 所包含的 SQL 代碼中。

若要使用 SQL Server CE 的 SQL 編程語言將行添加到表中,請使用 INSERT 語法。有關更多信息,請參見《SQL Server CE 聯機手冊》中的用於 SQL Server CE 的 SQL 參考

1.      cmd.CommandText =  "INSERT INTO TestTbl(col1, col2, col3) VALUES (0, 'abc', 15.66)";
2.      cmd.ExecuteNonQuery();
  1. 創建命令,使用參數將數據多次插入表中。

參數可以更高效地查詢數據庫,因為可以使用一組包含參數的 SQL 語句插入多個值。有關更多信息,請參見《SQL Server CE 聯機手冊》的在查詢中使用參數

1.      cmd.CommandText = "INSERT INTO TestTbl(col1, col2, col3) VALUES (?, ?, ?)";
2.       
3.      cmd.Parameters.Add(new SqlCeParameter("p1", SqlDbType.Int));
4.      cmd.Parameters.Add(new SqlCeParameter("p2", SqlDbType.NText));
5.      cmd.Parameters.Add(new SqlCeParameter("p3", SqlDbType.Money));
6.       
7.      cmd.Parameters["p2"].Size = 50;
8.       
9.      cmd.Prepare();
  1. 執行參數化命令,將數據插入表中。
  2. 清除參數,並檢查已插入表中的數據。
1.      cmd.Parameters["p1"].Value = 1;
2.      cmd.Parameters["p2"].Value = "abc";
3.      cmd.Parameters["p3"].Value = 15.66;
4.      cmd.ExecuteNonQuery();

若要使用 SQL Server CE 的 SQL 編程語言讀取現有數據,請使用 SELECT 語法。有關更多信息,請參見《SQL Server CE 聯機手冊》中的用於 SQL Server CE 的 SQL 參考

1.      cmd.Parameters.Clear();
2.      //Set the command text to a SELECT query.
3.      //
4.      cmd.CommandText = "SELECT * FROM TestTbl";

讀取 SQL Server CE 數據庫數據

讀取數據庫數據是一種常見的任務,通常涉及對表行信息的訪問。為使用 System.Data.SqlServerCe 執行此任務,您需要 SqlCeDataReader 和 SqlCeCommand對象。

注意   有關完整代碼列表,請參見代碼列表:使用 SQL Server CE 數據庫

  1. 調用 SqlCeCommand 對象的 ExecuteReader 方法以創建 SqlCeDataReader 的實例。
  2. 指示數據讀取器 rdr 在行存在時在每行的列中顯示數據。
1.      SqlCeDataReader rdr = cmd.ExecuteReader();
1.      while (rdr.Read())
2.      {MessageBox.Show("col1 = " + rdr.GetInt32(0) + 
3.           "col2 = " + rdr.GetString(1) + 
4.           "col3 = " + rdr.GetSqlMoney(2));
5.      }

更改 SQL Server CE 數據庫中的數據

在創建表后,可以以多種方式修改表中的數據:更改特定數據的屬性,添加和刪除數據行,甚至還可以通過修改表中的列來更改存儲數據的方式。

在本節中,您將更改表項的值,查找更改的表的數據並處理所有錯誤。為執行這些步驟,您將使用在前面的任務中使用的類:SqlCeCommand 和SqlCeDataReader。另外,您將使用 SqlCeException 進行錯誤處理。

注意   不能在此任務中運行僅用於特定步驟的代碼。有關完整代碼列表,請參見代碼列表:使用 SQL Server CE 數據庫

更新 SQL Server CE 表中的數據

  • 設置命令對象以使用 UPDATE 語句。

若要使用 SQL Server CE 的 SQL 編程語言更改行列的值,請使用 UPDATE 語法。有關更多信息,請參見《SQL Server CE 聯機手冊》中的用於 SQL Server CE 的 SQL 參考

1.      cmd.CommandText = "UPDATE TestTbl SET col2 = 'some new value' WHERE col1 = 0";
2.      cmd.ExecuteNonQuery();

讀取 SQL Server CE 表中的數據

  1. 設置命令對象以使用 SELECT 語句,然后通過執行 SqlCeCommand.ExecuteReader 創建數據讀取器的實例。
  2. 使用 SqlCeException 捕獲任何錯誤,然后關閉與數據庫的連接。
1.                  cmd.CommandText = "SELECT * FROM TestTbl";
2.       
3.                  rdr = cmd.ExecuteReader();
4.       
5.                  while (rdr.Read()) 
6.                  {
7.                      MessageBox.Show(" col1 = " + rdr.GetInt32(0) + 
8.                          " col2 = " + rdr.GetString(1) +
9.                          " col3 = " + rdr.GetSqlMoney(2));
10.              }
11.   
12.          }
1.       catch (SqlCeException e) 
2.      {
3.            ShowErrors(e);
4.      }
5.      finally 
6.      {
7.         if(conn.State == ConnectionState.Open)
8.            conn.Close();
9.      }
10.  }
11.   
12.      public static void ShowErrors(SqlCeException e) 
13.      {
14.          SqlCeErrorCollection errorCollection = e.Errors;
15.   
16.          StringBuilder bld = new StringBuilder();
17.   
18.          foreach (SqlCeError err in errorCollection) 
19.          {
20.              bld.Append("\n Error Code: " + err.HResult.ToString("X"));
21.              bld.Append("\n Message   : " + err.Message);
22.              bld.Append("\n Minor Err.: " + err.NativeError);
23.              bld.Append("\n Source    : " + err.Source);
24.                  
25.              foreach (int numPar in err.NumericErrorParameters) 
26.              {
27.                  if (0 != numPar) bld.Append("\n Num. Par. : " + numPar);
28.              }
29.                  
30.              foreach (string errPar in err.ErrorParameters) 
31.              {
32.                  if (String.Empty != errPar) bld.Append("\n Err. Par. : " + errPar);
33.              }
34.   
35.              MessageBox.Show(bld.ToString());
36.              bld.Remove(0, bld.Length);
37.          }
38.      }
39.  }

有關 SQL Server CE 中的錯誤處理的更多信息,請參見《SQL Server CE 聯機手冊》中的錯誤處理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM