windows phone資料庫開發

l_serein發表於2012-10-30

http://wenku.baidu.com/view/020f7bd528ea81c758f57889.html

目錄
1、Windows Phone資料庫開發指南
2、Windows Mobile上使用WINCE自帶資料庫
3、XML on Windows Mobile C#
4、關於如何在ppc模擬器中讀取本地xml檔案的辦法
5、設定 Windows 窗體 DataGridView 控制元件中的資料格式
6、移動平臺資料庫開發心得
7、用SQL Anywhere建立Windows Mobile資料庫
8、用Sybase移動資料庫開發CRM系統幾個關鍵問題的技術實現
9、智慧裝置開發環境的配置過程
4 / 42
Windows Phone 資料庫開發指南
移動解決方案系統結構的各個部分正在快速地變為現實,並逐漸融合。更重要的是,許多
公司越來越清楚地意識到移動解決方案能夠帶來很高的效率和新的商業機會。消費者也開始在
日常生活中使用各種移動裝置。移動裝置硬體,特別是各種新式的 Pocket PC,正在引領時尚
潮流,不斷滿足企業使用者和消費者的需要。將各種事物緊密聯絡的關鍵是:新的軟體和開發工
具。
在過去幾年中,我使用了Visual Studio .NET、Smart Device Extensions 和SQL Server
™CE 2.0。將這些軟體元件應用到各種 Pocket PC(如 Pocket PC Phone Edition)上,不但提
高了開發效率,而且還促進了許多新的移動應用程式的開發。
Windows Phone 移動應用資料庫開發主要分為線上和離線資料庫兩種訪問方式。從開發
角度來說,離線資料庫就是本地資料庫就是把資料庫放在本地,不需要連線網路應用程式就可
以訪問手機上的資料庫中的資料;線上資料庫就是在遠端機房的應用伺服器上搭建系統資料庫,
手機終端應用程式通過Web Service 介面來訪問遠端伺服器上的資料。
Windows Phone 手機終端資料訪問網路拓撲圖結構如下:
專線
路由接入區安全保護區
筆記本
移動終端
無線APN專線
無線APN專線
PDA終端
安全TF卡
安全SIM卡
防火牆
應用服務區
USB專用加密卡
數字證照
USB KEY
安全認證
管理系統
(含RA與認證服務)
手機
GPRS/CDMA
安全接入系統
移動應用
伺服器
維護終端
手機
短訊息
安全接入系統
IP安全接入系統
交換機
CA數字
證照系統
運營商
APN網路
Windows Phone資料訪問鏈路
行動式電腦
Windows Phone 手機應用程式線上資料庫訪問簡單說明如下:
第一步、在移動應用伺服器上安裝SQLSERVER 或者ORACLE 資料庫,並建立資料庫和表
以及新增測試資料等。
第二步、開發Web Service 服務程式,釋出並部署至移動應用伺服器。
第三步、新建Windows Phone 手機應用程式,新增Web 引用,呼叫移動應用伺服器上的
Web Service 資料介面在手機終端介面實現對遠端資料庫伺服器上資料的管理功能。
Windows Phone 手機應用程式離線資料庫主要包括:SQLCE 和SQLite。
SQLServerCE(SQLCE)是一款輕量級本地資料庫引擎,為移動裝置上偶爾連線的資料訪問提
供瞭解決方案。例如,工商管理人員在執行巡查任務前,可以用Windows Phone 移動裝置把臺式
計算機中的資料庫(SQLServer)拷到Windows Phone 的資料庫(SQLCE)上;在執行任務時,可以在
移動裝置上修改記錄;完成任務後,可以把移動裝置上的資料庫上傳到臺式計算機中的資料庫,使
這兩個資料庫之前的資料保持同步。
下面用一個簡單事例詳細講解下SQLCE 的基本步驟:
// 當前應用程式工作目錄路徑
public static string path = @"\Program Files\soft";
//本地資料庫連線字串
5 / 42
public static string SqlceExcue = "Persist Security Info=False;Data Source=" + path + @"\ SOFTDB.sdf;password=";
//sqlce 庫路徑
public static string SqlceExcueDB = path + @"\SOFTDB.sdf";
第一步、建立SOFTDB.sdf資料庫
/// <summar y>
/// 生成資料庫
/// </summary>
/// <returns></returns>
private bool createSqlCeDB()
{
// 確定資料庫存在,如果新資料庫被建立了就返回true,否則返回false。
if (File.Exists(Constant.SqlceExcueDB))
File.Delete(Constant.SqlceExcueDB);
if (File.Exists(Constant.SqlceExcueDB) == false)
{
SqlCeEngine engine = new SqlCeEngine(Constant.SqlceExcue);
engine.CreateDatabase();
engine.Dispose();
return true;
}
else
{
return false;
}
}
第二步、建立資料表EMERGENCYINFO
StringBuilder TSql = new StringBuilder();
TSql.Append("CREATE TABLE [EMERGENCYINFO] (");
TSql.Append(" [ID] [numeric](20, 0) NOT NULL ,");
TSql.Append(" [EMGID] [nchar] (20) NULL ,");
TSql.Append(" [OCCURTIME] [nchar] (20) NULL ,");
TSql.Append(" [EXPLAIN] [nchar] (300) NULL ,");
TSql.Append(" [TYPENAME] [nchar] (2) NULL ,");
TSql.Append(" [REPORTGJJ] [nchar] (2) NULL ,");
TSql.Append(" [REPORTSJJB] [nchar] (2) NULL ");
TSql.Append(" ) ");
SqlCeConnection conn = new SqlCeConnection(Constant.SqlceExcue);
try
{
conn.Open();
SqlCeCommand sqlCreateTable = conn.CreateCommand();
sqlCreateTable.CommandText = TSql.ToString();
sqlCreateTable.ExecuteNonQuery();
}
catch (SqlCeException Exte)
{
}
finally
{
conn.Close();
}
第三步、往表EMERGENCYINFO插入資料
要把遠端伺服器的資料推送到手機終端方式很多,為了能夠更多元化的實現資料同步功能,
6 / 42
這裡採用Web Service資料介面直接從遠端伺服器獲取SQLSERVER或者ORACLE資料庫的資料集。
/// <summary>
/// 讀取指定伺服器上的資料庫資料
/// </summary>
/// <param name="tableName"></param>
/// <returns>DataSet</returns>
private DataSet getDataSet(string tableName)
{
string strSql = "";
DataSet dst = new DataSet();
try
{
MPP.WebService mws = new MPP.WebService();
mws.Url = Constant.GetWebUrl;
strSql = "select * from " + tableName;
dst = mws.QueryData(strSql, Constant.oracleConnString);
}
catch { }
return dst;
}
//拼插入語句:
ArrayList arr = new ArrayList();
string vals = "";
arr.Add("ID,EMGID,OCCURTIME,EXPLAIN,TYPENAME,REPORTGJJ,REPORTSJJB");
vals = dr["ID"].ToString() + ",'"
+ dr["EMGID"].ToString() + "','"
+ dr["OCCURTIME"].ToString() + "','"
+ dr["EXPLAIN"].ToString() + "','"
+ dr["TYPENAME"].ToString() + "','"
+ dr["REPORTGJJ"].ToString() + "','"
+ dr["REPORTSJJB"].ToString() + "'";
arr.Add(vals);
//執行新增操作
DataTable dt = dst.Tables[0];
if (dt.Rows.Count == 0) return;
SqlCeConnection conn = new SqlCeConnection(Constant.SqlceExcue);
try
{
conn.Open();
conn.BeginTransaction();
SqlCeCommand sqlCreateTable = conn.CreateCommand();
//匯入資料
for (int j = 0; j < dt.Rows.Count; j++)
{
string inssql = "insert into " + tname + "(" + arr[0].ToString() + ") values( " + arr[1].ToString() + ")";
sqlCreateTable.CommandText = inssql;
sqlCreateTable.ExecuteNonQuery();
}
}
catch (Exception ex)
{
}
finally
7 / 42
{
conn.Close();
}
第四步、SQLCE資料庫的簡單操作語句
/// <summary>
/// 執行SQLCE查詢,返回DataSet
/// </summary>
/// <param name="SQL">SQL語句</param>
/// <returns ds>DataSet物件.</returns>
public static DataSet GetDataSet(string sql)
{
using (DataSet dt = new DataSet())
{
SqlCeConnection conn = new SqlCeConnection(Constant.SqlceExcue);
try
{
SqlCeCommand cmd = new SqlCeCommand(sql, conn);
SqlCeDataAdapter adptr = new SqlCeDataAdapter(cmd);
adptr.Fill(dt);
cmd.Dispose();
}
catch (SqlCeException et)
{
}
finally
{
conn.Close();
}
return dt;
}
}
/// <summary>
/// 執行SQLCE的SQL語句,返回是否成功
/// </summary>
/// <param name="SQL">SQL語句</param>
/// <returns ds>bool物件.</returns>
public static bool ExeSqlCe(string sqlString)
{
bool result = false;
SqlCeConnection ssceconn = new SqlCeConnection(Constant.SqlceExcue);
try
{
ssceconn.Open();
SqlCeCommand sqlInsertRow = ssceconn.CreateCommand();
sqlInsertRow.CommandText = sqlString;
sqlInsertRow.ExecuteNonQuery();
ssceconn.Close();
result = true;
}
catch (SqlCeException ext)
{
}
finally
8 / 42
{
ssceconn.Close();
}
return result;
}
/// <summary>
/// 執行SQLCE查詢,返回指定行數的DataSet
/// </summary>
/// <param name="SQL">SQL語句</param>
/// <returns ds>DataSet物件.</returns>
public static DataSet GetDataList(string start, string max, string sql, string tableName)
{
using (DataSet dt = new DataSet())
{
SqlCeConnection conn = new SqlCeConnection(Constant.SqlceExcue);
try
{
SqlCeCommand cmd = new SqlCeCommand(sql, conn);
SqlCeDataAdapter adptr = new SqlCeDataAdapter(cmd);
adptr.Fill(dt, Convert.ToInt32(start), Convert.ToInt32(max), tableName);
cmd.Dispose();
}
catch (SqlCeException et)
{
}
finally
{
conn.Close();
}
return dt;
}
}
注:要在手機終端上直接操作SQLCE資料庫,手機終端必須安裝sqlce30.dev.CHS.ppc.wce4.armv4.CAB,該安裝檔案可以在VS安裝目下找到。
9 / 42
Windows Mobile上使用WINCE自帶資料庫 (轉載自http://database.51cto.com 2009-04-08 09:17 施炯 cnblogs ) 通過資料庫,可以方便地儲存和檢索資料,極大地提高工作效率。在Windows CE .NET 4.2上,自帶了一個資料庫,具體我們可以參考MSDN上的網頁:Microsoft Windows CE .NET 4.2 Database Reference。由於它最多隻支援4種排序索引,這種資料庫適合儲存的資料量較小、資料結構相對簡單的情況。它支援的資料型別包括2/4位元組有/無符號整數、日期時間、Unicode字串、CEBLOB、布林和8位元組有符號值。 資料庫的主要操作包括以下幾個方面: 裝配資料庫卷:BOOL CeMountDBVol( PCEGUID pceguid, LPWSTR lpszDBVol,DWORD dwFlags); 解除安裝資料庫卷:BOOL CeUnmountDBVol(PCEGUID pceguid); 建立資料庫:CEOID CeCreateDatabaseEx( PCEGUID pceguid, CEDBASEINFO *lpCEDBInfo); 開啟資料庫: HANDLE CeOpenDatabaseEx( PCEGUID pceguid, PCEOID poid,LPWSTR lpszName, CEPROPID propid, DWORD dwFlags,CENOTIFYREQUEST *pReq); 寫資料庫: CEOID CeWriteRecordProps(HANDLE hDbase, CEOID oidRecord, WORD cPropID, CEPROPVAL *rgPropVal), 讀資料庫: CEOID CeReadRecordPropsEx( HANDLE hDbase, DWORD dwFlags,LPWORD lpcPropID, CEPROPID *rgPropID, LPBYTE *lplpBuffer,LPDWORD lpcbBuffer, HANDLE hHeap); 刪除記錄:BOOL CeDeleteRecord(HANDLE hDatabase, CEOID oidRecord); 移動指標:CEOID CeSeekDatabaseEx(HANDLE hDatabase,DWORD dwSeekType, DWORD dwValue, WORD wNumVals, LPDWORD lpdwIndex); 使用方法 1.首先在主對話方塊的標頭檔案中(這裡我們建立了一個基於對話方塊的工程),我們來宣告部分變數,用於儲存資料庫檔名和資料庫名;定義一個資料庫表結構;以及人員資訊庫的欄位標識,我們通過MAKELONG巨集來組合欄位資料庫型別和標識。相關程式碼如下: Code //定義資料庫檔名 const LPTSTR DBFILENAME = _T("\\My Documents\\Workerinfo.db");
10 / 42
//定義資料庫名 const LPTSTR DBTABLENAME = _T("Worker"); //定義員工資料庫表結構 typedef struct{ TCHARszID[10];//子機ID號 TCHARszName[20]; //員工姓名 TCHAR szWorkNum[10]; //工號 TCHAR szDepartment[20]; //部門號 }REC_WORKER,*PREC_WORKER; //定義子機ID號欄位標誌 #define PID_NOMAKELONG(CEVT_LPWSTR,1) //定義員工姓名欄位標誌 #define PID_NAMEMAKELONG(CEVT_LPWSTR,2) //定義工號欄位標誌 #define PID_WorkNumMAKELONG(CEVT_LPWSTR,3) //定義員工部門欄位標誌 #define PID_DepartmentMAKELONG(CEVT_LPWSTR,4) 2.為主對話方塊新增三個私有成員變數,用於儲存庫檔案卷標識、資料庫控制程式碼以及資料庫物件標識。程式碼片斷如下: private: CEGUID m_ceGuid; //儲存資料庫檔案標誌 HANDLE m_hDB;//儲存資料庫控制程式碼 CEOID m_ceOid;//儲存資料庫物件標誌 3.在主對話方塊中給出裝配資料庫卷、解除安裝資料庫卷、建立資料庫、開啟資料庫、寫資料庫、讀資料庫、關閉資料庫等等操作。這裡就不羅列了。 例項工程是一個WM6平臺上的WINCE資料庫,基於對話方塊的應用程式,程式執行效果如下圖所示:
11 / 42
圖1:程式執行圖 另外,我們可以在裝置的“My Documents”目錄下,找到“Workerinfo.db”檔案,正如我們在標頭檔案中所設定的路徑,如下圖2所示:
12 / 42
圖2:資料庫檔案的路徑
13 / 42
XML on Windows Mobile C#
(轉載自http://hi.baidu.com/simliving/blog/item/57d0b98b8a0d0d749f2fb4dc.html)
摘要
Windows Mobile 上的XML 相關類,並利用它們高效地操作XML 檔案( 流)
Keywords
.Net Compact Framework, Windows Mobile, XML
兩年以前張欣同學曾經做過一期Webcast 談到了這相關的內容,詳見:
http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032328201&EventCategory=3&culture=zh-CN&CountryCode=CN
本文主要涉及一些Webcast 裡面沒有說到的東西, 關於XML 本身的語法和用法我就不在此贅述了,首先,我們來看一看.NET Compact Framework 的System.XML 這個名稱空間下,為我們操作XML 提供了哪些型別支援:
類名
說明
XmlReader
抽象類,提供了快速,單向,只讀的讀取XML 檔案流操作
XmlWriter
抽象類,為生成一個XML 檔案流提供了介面
XmlTextReader
繼承於XmlReader ,用於格式良好的XML 文字處理
XmlTextWriter
XmlWriter 的一個實現類
XmlNodeReader
公共類,用於處理記憶體中的XML DOM Tree
XmlNodeWriter
公共類,用於在記憶體中產生XML DOM Tree
XmlDocument
一個XML DOM Tree 的模板類
呃,先來看那個名字跟其他幾個類不太一樣的吧:XmlDocument.
XmlDocument 用於把XML 檔案載入到記憶體中間。呼叫Load() 方法即可將XML 檔案作為一個資料樹載入到記憶體。Load() 方法提供了幾個過載,你可以通過檔名,任意流,或從XmlReader 繼承的類以及System.IO.StreamReader 和TextReader 來Load 。這裡需要區別一下的是另一個方法LoadXml() ,它是用來載入Xml 字串
14 / 42
的,而不是檔案!
下面的例子是從XmlTextReader 去Load 一個XML 檔案:
XmlDocument xmldoc = new XmlDocument(); XmlTextReader xmlRdr = new XmlTextReader(@""Storage Card"books.xml"); xmlRdr.WhiteSpaceHandling = WhiteSpaceHandling.None; xdoc.Load(xmlRdr);
這裡提到了XmlTextReader 這個類,可以說XmlTextReader 是XmlReader 在細粒度控制方面的一個實現。XmlTextReader 包含了當前節點的位置資訊。呼叫它的Read() 方法,講從檔案中讀取下一個節點的資訊,讀取順序是“ 深度優先” 的。通常,在讀取資料之初,我們會呼叫MoveToContent() 去跳過一些非資料的元素段,直接到達根節點處,呼叫Skip() 方法會跳過當前界點的所有分節點,這在檢索節點的時候可能會用得到,可以跳過一些不必要的子節點而節約一點效能,但是對裝置上小規模的XML 檔案,這個效果往往不是太明顯。不過顯然可以理解,這種不需要載入整個檔案的單向的讀寫方式,要比使用XmlDocument 物件要快得多~
說到效能,對於資源有限的裝置來說,這顯然是不可忽略的一點,在操作XML 的時候,我們也應考慮到這一點,在使用XmlReader 和XmlWriter 的時候,可以使用XmlReaderSettings 和XmlWriterSettings 來調整效能,例如使用IgnoreWhiteSpace 來忽略空白字元,或著使用IgnoreComments 來忽略註釋行等等,
另外需要注意的是,如果我們使用XmlReader 來讀取的時候要避免使用Schema ,因為在單向讀取的時候,Schema 的校驗會損失一部分效能,而用DataSet 來讀取的時候,儘量使檔案包含Schema 來確定表結構,這樣讀起來會比較快,不需要編譯器來為Dataset 建立架構。
從細粒度方面考慮,可以用MoveToAttribute() 來設定XmlReader 的訪問點,訪問各個屬性。例如 :
複製程式碼 public void ShowAttributes(XmlReader reader) { if (reader.HasAttributes) { Console.WriteLine("Attributes of <" + reader.Name + ">"); for (int i = 0; i < reader.AttributeCount; i++) { reader.MoveToAttribute(i); Console.WriteLine(reader.Name + "::" + reader.Value); } reader.MoveToElement(); //屬性訪問完畢後讓reader返回到元素節點上來
15 / 42
} }
XmlNodeReader 和XmlNodeWriter 對XmlNode 提供了快速非快取的訪問方式,可以直接從Xml 的Stream 獲取資訊。
好,再來看一個例子
複製程式碼 <bookstore> <book Section=" XML" PublicationDate="2004" ISBN="0-7645-7077-3"> <title>Beginning XML, 3rd Edition</title> <author> <first-name>David</first-name> <last-name>Hunter</last-name> </author> <price>39.99</price> </book> <book Section=" Java" PublicationDate="2004" ISBN="0-7645-6874-4"> <title>Ivor Horton's Beginning Java 2, JDK 5 Edition</title> <author> <first-name>Ivor</first-name> <last-name>Horton</last-name> </author> <price>49.99</price> </book> <book Section=" Database" PublicationDate="2005" ISBN="0-7645-7950-9"> <title>Beginning MySQL</title> <author> <first-name>Robert</first-name> <last-name>Sheldon</last-name> </author> <author> <first-name>Geoff</first-name> <last-name>Moes</last-name> </author> <price>39.99</price> </book> </bookstore>
1) 使用XmlTextReader
這個XML 檔案包含了幾本書(book) 的相關資訊,書有分元素title ,author ,prize 和屬性Section ,PublicationDate ,ISBN 。我現在想做的事情就是把這個XML 檔案的內容按照我預定的格式列印出來,並存放到一個output.txt 文字檔案裡面:
首先,我們定義兩個用於讀寫的reader 和writer ,
XmlTextReader reader = null;
16 / 42
StreamWriter writer = null;
在處理函式裡面,首先我們做一個初始化:
writer = newStreamWriter(@""Storage Card"output.txt",false); reader = newXmlTextReader(@""Storage Card"books.xml");
當reader 在讀的時候
複製程式碼 while (reader.Read()) { //XmlNodeType這個列舉讓我們方便的對不同型別的節點進行相應的操作 switch (reader.NodeType) { caseXmlNodeType.XmlDeclaration: FormatOutput(writer, reader, "XmlDeclaration"); break; caseXmlNodeType.ProcessingInstruction: FormatOutput(writer, reader, "ProcessingInstruction"); break; caseXmlNodeType.DocumentType: FormatOutput(writer, reader, "DocumentType"); break; caseXmlNodeType.Comment: FormatOutput(writer, reader, "Comment"); break; caseXmlNodeType.Element: FormatOutput(writer, reader, "Element"); break; caseXmlNodeType.Text: FormatOutput(writer, reader, "Text"); break; caseXmlNodeType.Whitespace: break; } }
以下是FormatOutput 函式:
複製程式碼 private static void FormatOutput(StreamWriter writer, XmlReader reader, String nodeType) { //用tab使輸出的層次分明一點 for (int i = 0; i < reader.Depth; i++) { writer.Write('t'); } //這裡並沒有做過多的判斷,但是作為Element的節點並沒有Value if (reader.Name != String.Empty) writer.WriteLine(reader.Prefix + nodeType + "<" + reader.Name +
17 / 42
">:" + reader.Value); else writer.WriteLine(reader.Prefix + nodeType + ": " + reader.Value); // 顯示當前節點的屬性名和值,同樣用tab做了格式控制 while (reader.MoveToNextAttribute()) { for (int i = 0; i < reader.Depth; i++) writer.Write('"t'); writer.WriteLine("Attribute: " + reader.Name + "= " + reader.Value); } }
程式介面;
輸出效果 : XmlDeclaration<xml>:version='1.0' Attribute: version= 1. Comment: Some of Wrox books in the book database Element<bookstore>: Element<book>: Attribute: Section= XML Attribute: PublicationDate= 2004 Attribute: ISBN= 0-7645-7077-3 Element<title>: Text: Beginning XML, 3rd Edition Element<author>: Element<first-name>: Text: David Element<last-name>: Text: Hunter
18 / 42
Element<price>: Text: 39.99 Element<book>: Attribute: Section= Java Attribute: PublicationDate= 2004 Attribute: ISBN= 0-7645-6874-4 Element<title>: Text: Ivor Horton's Beginning Java 2, JDK 5 Edition Element<author>: Element<first-name>: Text: Ivor Element<last-name>: Text: Horton Element<price>: Text: 49.99 Element<book>: Attribute: Section= Database Attribute: PublicationDate= 2005 Attribute: ISBN= 0-7645-7950-9 Element<title>: Text: Beginning MySQL Element<author>: Element<first-name>: Text: Robert Element<last-name>: Text: Sheldon Element<author>: Element<first-name>: Text: Geoff Element<last-name>: Text: Moes Element<price>: Text: 39.99
2) 使用DataSet
跟在PC 機上一樣,在面臨複雜資料互動,需要充分利用資料間的相互關係的時候,單向執行的XmlReader 就有些不夠用了,因為它不儲存“ 流過去” 的資訊,做過ADO.NET 的人對DataSet 應該不會陌生,跟XmlReader 不同,DataSet 就是一個常駐記憶體的關係型資料庫。DataSet 裡面的資料即可以來自關係型資料庫又可以來自XML 檔案( 流) 。下面的意思演示瞭如何從DataSet 載入XML 並在DataGrid 上面顯示出來:
複製程式碼 1 DataTable dt1 = null;
19 / 42
2 DataTable dt2 = null; 3 DataSet ds = null; 4 int CurrentTable ; 5 public Form2() 6 { 7 InitializeComponent(); 8 } 9 10 private void LoadData() 11 { 12 int loadTimeSpan; 13 14 XmlDocument doc = new XmlDocument(); 15 try 16 { 17 int t1= System.Environment.TickCount; 18 //將XML檔案讀入記憶體 19 doc.Load(@"\Storage Card\books.xml"); 20 int t2 = System.Environment.TickCount; 21 loadTimeSpan = t2 - t1; 22 MessageBox.Show("LoadDocTimeSpan:"+loadTimeSpan); 23 } 24 catch (XmlException ex) 25 { 26 MessageBox.Show(ex.Message); 27 return; 28 } 29 Cursor.Current = Cursors.WaitCursor; 30 //通過XmlNodeReader把XmlDocument中的資料填充到dataSet中去 31 XmlNodeReader reader = new XmlNodeReader(doc); 32 int DataSetFillSpan; 33 ds = new DataSet(); 34 int t3 = System.Environment.TickCount; 35 ds.ReadXml(reader); 36 int t4 = System.Environment.TickCount; 37 DataSetFillSpan = t4 - t3; 38 reader.Close(); 39 40 //因為XML檔案裡面存在Book和Author的一對多的主從表 41 dt1 = ds.Tables[0]; 42 dt2 = ds.Tables[1]; 43 //設定預設顯示的表 44 DG_Book.DataSource = ds.Tables[0].DefaultView; 45 CurrentTable = 0; 46 Cursor.Current = Cursors.Default; 47 MessageBox.Show("Fill dataset timeSpan:"+DataSetFillSpan); 48 } 49 50 private void Form2_Load(object sender, EventArgs e) 51 { 52 LoadData(); 53 } 54 55 /// <summary> 56 /// 顯示特定行的資訊
20 / 42
57 /// </summary> 58 /// <param name="bookIndex">行號</param> 59 private void DisplayDataRow(int bookIndex) 60 { 61 String line = String.Empty; 62 DataTable dt = CurrentTable == 0 ? dt1 : dt2; 63 64 DataRow dr = dt.Rows[bookIndex]; 65 66 int col = 0; 67 foreach (object value in dr.ItemArray) 68 { 69 line += (dt.Columns[col].ColumnName + ": " + 70 value.ToString() + "\r\n"); 71 col++; 72 } 73 MessageBox.Show(line); 74 } 75 76 private void menuItem3_Click(object sender, EventArgs e) 77 { 78 int bookIndex = DG_Book.CurrentRowIndex; 79 DisplayDataRow(bookIndex); 80 } 81 82 private void menuItem4_Click(object sender, EventArgs e) 83 { 84 SwitchTable(); 85 } 86 87 private void menuItem5_Click(object sender, EventArgs e) 88 { 89 SwitchTable(); 90 } 91 92 /// <summary> 93 /// 在兩個表之間切換顯示 94 /// </summary> 95 private void SwitchTable() 96 { 97 if (CurrentTable == 0) 98 { 99 DG_Book.DataSource = dt2.DefaultView; 100 CurrentTable = 1; 101 this.Text = "Author Table:"; 102 } 103 else 104 { 105 DG_Book.DataSource = dt1.DefaultView; 106 CurrentTable = 0; 107 this.Text = "Book Table:"; 108 } 109 } 110 111 private void menuItem1_Click(object sender, EventArgs e) 112 {
21 / 42
113 //關閉的時候輸出帶Schema的XML檔案 114 if (ds != null) 115 { 116 ds.WriteXml(@"\Storage Card\bookstore.xml", XmlWriteMode.WriteSchema); 117 //ds.WriteXmlSchema(@"\Storage Card\bookstore.xsd"); 118 } 119 Application.Exit(); 120 }
程式效果:
最後有一點是要強調的是,在使用DataSet 的時候,一定要考慮的資料量的大小,可能超過2K 以上的資料載入的時候速度就有點不能忍受了。我在模擬器上測試用的不到1k 的資料生成XmlDocument 用了1.5 秒,填充DataSet 用了8 秒多,當然在裝置上還是要比這快一些。
22 / 42
關於如何在PPC模擬器中讀取本地XML檔案的辦法
(轉載自http://www.cnblogs.com/longqi293/archive/2008/11/03/1325121.html) 最近本人在練習使用ppc讀取xml文件時遇到一個不大不小的問題,就是在ppc模擬器上,如果不經過如下設定,是不能正確訪問本地的檔案的,總是提示出錯,在此寫出經驗心得,以便大家不被這個問題困擾了。 1、 首先,我們準備一個xml檔案,放到“我的文件”中,然後——〉開啟模擬器——〉File——〉configuration——〉shared Fold——〉選擇“我的文件”(這裡可隨便)。 經過第一步之後,在模擬器裡,共享的這個資料夾就變成儲存卡了,也即此資料夾的地址是storage Card了。 2、然後,新建一個智慧裝置專案(我在這裡是Windows Mobile 6),設計如下介面:
23 / 42
然後,從工具欄拖入一個OpenFileDialog控制元件,之後雙擊OpenFile按鈕,進入程式碼編寫。 1、 程式碼如下: private void menuItem2_Click(object sender, EventArgs e) { openFileDialog1.ShowDialog(); try { string file = openFileDialog1.FileName.ToString();//從openFileDialog中讀取xml文件 StreamReader sr = new StreamReader(file); XmlTextReader xtr = new XmlTextReader(sr); while (xtr.Read()) { listBox1.Items.Add("NodeType:" + xtr.NodeType.ToString());//為了驗證是否讀取而寫的,可根據實際情況更改 } MessageBox.Show(file); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } 執行後的圖象如下:
24 / 42
開啟檔案 我的xml檔案是test1.xml,選中後出現下圖
25 / 42
同時顯示該檔案的路徑,可以看到,是”Storage Card”。 至此,我們完成了讀取本地xml檔案的操作。
26 / 42
設定 Windows 窗體 DataGridView 控制元件中的資料格式
(轉載自http://msdn.microsoft.com/zh-cn/library/f9x2790s(v=VS.90).aspx)
下面的過程演示如何使用 DataGridView 控制元件的 DefaultCellStyle 屬性設定單元格值的基本格式,以及如何設定控制元件中特定列的基本格式。有關資料的高階格式設定的資訊,請參見 如何:自定義 Windows 窗體 DataGridView 控制元件中的資料格式設定。
設定貨幣和日期值的格式
•設定 DataGridViewCellStyle 的 Format 屬性。下面的程式碼示例使用列的 DefaultCellStyle 屬性設定特定列的格式。 UnitPrice 列中的值以特定於當前區域性的貨幣格式顯示(負值用括號括起來)。 ShipDate 列中的值以特定於當前區域性的短日期格式顯示。有關 Format 值的更多資訊,請參見格式化型別。
this.dataGridView1.Columns["UnitPrice"].DefaultCellStyle.Format = "c";
this.dataGridView1.Columns["ShipDate"].DefaultCellStyle.Format = "d";
自定義 null 資料庫值的顯示
•設定 DataGridViewCellStyle 的 NullValue 屬性。下面的程式碼示例使用 DataGridView.DefaultCellStyle 屬性在所有包含等於 DBNull.Value 的值的單元格中顯示“沒有項”。
this.dataGridView1.DefaultCellStyle.NullValue = "no entry";
在基於文字的單元格中啟用換行
•將 DataGridViewCellStyle 的 WrapMode 屬性設定為 DataGridViewTriState 列舉值之一。下面的程式碼示例使用 DataGridView.DefaultCellStyle 屬性設定整個控制元件的換行模式。
this.dataGridView1.DefaultCellStyle.WrapMode =
DataGridViewTriState.True;
指定 DataGridView 單元格的文字對齊方式
•將 DataGridViewCellStyle 的 Alignment 屬性設定為 DataGridViewContentAlignment 列舉值之一。下面的程式碼示例使用列的 DefaultCellStyle 屬性設定特定列的對齊方式。
this.dataGridView1.Columns["CustomerName"].DefaultCellStyle
.Alignment = DataGridViewContentAlignment.MiddleRight;
示例
--------------------------------------------------------------------------------
private void SetFormatting()
{
this.dataGridView1.Columns["UnitPrice"].DefaultCellStyle.Format = "c";
this.dataGridView1.Columns["ShipDate"].DefaultCellStyle.Format = "d";
27 / 42
this.dataGridView1.Columns["CustomerName"].DefaultCellStyle
.Alignment = DataGridViewContentAlignment.MiddleRight;
this.dataGridView1.DefaultCellStyle.NullValue = "no entry";
this.dataGridView1.DefaultCellStyle.WrapMode =
DataGridViewTriState.True;
}
編譯程式碼
--------------------------------------------------------------------------------
這些示例要求:
•一個名為 dataGridView1 的 DataGridView 控制元件,該控制元件包含名為 UnitPrice 的列、名為 ShipDate 的列和名為 CustomerName 的列。
•對 System、System.Drawing 和 System.Windows.Forms 程式集的引用。
可靠程式設計
--------------------------------------------------------------------------------
為了獲得最大可伸縮性,應該在使用相同樣式的多個行、列或單元格中共享 DataGridViewCellStyle 物件,而不是單獨設定每個元素的樣式屬性。有關更多資訊,請參見 縮放 Windows 窗體 DataGridView 控制元件的最佳做法。
28 / 42
移動平臺資料庫開發心得
(轉載自:編輯:西安交通大學微軟技術俱樂部 黃海鵬 來源: 微軟技術俱樂部電子期刊 )
最近在PPC平臺下開發了一個軟體,在開發過程中對於移動平臺下的資料庫使用有了一定的心得,小記與此,請高手斧正。
一、引言
PPC 的開發其實與Windows平臺下的WinForm開發並沒有太大的區別,所使用的開發環境為Microsoft .NET Compact Framework(CF)。.NET Compact Framework(CF)是.NET Framework的子集,其最主要的優點是與.NET Framework類庫具有相同的靈活性。同時所有.NET Framework下的類和方法均能在.NET Compact Framework(CF)中使用。因此開發PPC應用程式與開發WinForm程式並沒有太大的區別,需要注意的是以下幾點:
1.作為.NET Framework的子集,.NET Compact Framework並沒有匯入所有的引用,因此在使用一些名稱空間時會出現問題,比如下面要提到的SqlClient和SqlServerCE。因此在使用前需要檢視自己所要使用的名稱空間是否已經匯入專案中,方法是:在Visual Studio下,開啟專案後,點選工具欄的專案?新增引用?點選.NET選項卡,將相應的匯入專案即可。
2.使用PPC開發專案,需要使用模擬器,因此需要正確安裝模擬器。在Visual Studio 2003下,預設能使用的模擬器只有一個,但是安裝了比較完整的網路協議。Visual Studio 2005下能使用的模擬器較多,但卻沒有安裝相應的網路協議,可能是出於安全的考慮,但卻給應用開發帶來了不便。如果使用PPC環境開發網路應用程式,便需要安裝虛擬網路卡驅動程式,在微軟的官網上可以下載。
3.同時,使用PPC開發網路應用程式,需要使用ActiveSync與模擬器連線,在安裝好虛擬網路卡驅動程式的前提下,才能使模擬器擁有網路功能。測試模擬器是否連線好的一個簡易方法就是用模擬器的IE上一下頁面試試~~。當然,用PPC開發網路應用程式所需要配置的內容還遠不止如此,有相應需要的可以在網上搜一下相應的內容,也可以和我交流。
二、ADO.NET
使用微軟的平臺開發資料庫應用程式,肯定要使用ADO.NET進行資料處理的,然而在PPC的特殊應用平臺下,為了程式執行的速度和效率,微軟還提供了另一種截然不同的資料處理方式--SQL Server CE。
1. SQL Server CE 2.0的全名是SQL Server 2000 Windows CE Edition version 2.0,他
29 / 42
伴隨著.NET Compact Framework於2002年末推出。作為ACCESS NetFront的替代品,SQL Server CE是一個是執行在Pocket PC以及其他Windows CE平臺上的一個很簡化的SQL Server 2000/7.0。既可以作為PPC本地資料庫程式,也可與遠端的SQL Server 2000/2005進行資料更新和同步。
2.在程式開發中使用SQL Server CE的優點是非常明顯的,作為一個本地的資料庫,可以將遠端資料庫伺服器中的資料庫內容下載到本地後,進行本地下的資料庫增刪改查的操作,在必要時再提交給遠端資料庫伺服器進行更新。其實現本質與ADO.NET的dataset有著一定的一致性,對於遠端資料庫伺服器的壓力會有極大的降低和改善。
3.在程式開發中使用SQL Server CE的缺點是:配置SQL Server CE的步驟比較繁瑣。使用SQL Server CE連線遠端SQL Server資料庫時,需要使用IIS伺服器通過HTTP或者HTTPS傳輸協議,因此,需要安裝配置好IIS,同時,要求SQL Server資料庫配置好本地釋出。也就是說,使用SQL Server CE通過RDA(Remote Data Access)與遠端SQL Server資料庫進行連線,便要求SQL Server資料庫和IIS都安裝配置無誤。但很遺憾的是,能保證這兩個麻煩的傢伙不出一點問題,並不是一件容易的事情,至少對於初學者而言(本人在配置過2臺伺服器,其中一臺IIS不可用,一臺資料庫不能用,大概是人品比較差,呵呵)。
4.因此,在開發程式的時候,我們的專案小組選擇了另一種資料庫處理方式:Sql Client。其實,Sql Client是在WinForm開發以及Web開發中使用最普遍的ADO.NET方法。作為.NET Framework的子集,.NET Compact Framework同樣支援.NET Framework下的Sql Client――在專案小組為配置SQL Server CE伺服器而頭疼的時候,Sql Client方法為我們提供了另一條解決之路,雖然這並不是很好的解決方案。
5.與SQL Server CE不同,Sql Client的資料庫並不能儲存與PPC中,換句話說,在PPC中使用SQL Client之是與遠端的伺服器進行資料傳輸和交換,因此對於網路的要求比較高,移動裝置網路速率較低的現狀下,方案是否可行還需要一定的測試。同樣的,對於伺服器的壓力也相對較大――只是相對而言,Web應用對於伺服器要求與之相仿。
6.無論是SQL Client還是SQL Server CE,在程式設計時總會出現各種各樣的錯誤。因此,在必要的位置使用try{}catch{}語句時非常必要的,提一個初學者易犯的錯誤,在使用catch 時,不應該使用Exception異常類,而應該使用SqlException異常類,前者對於Sql操作異常只會給出SqlException的提示,而後者能給出詳細而具體的異常提示,為你除錯程式提供良好的幫助。
7.最後,說點別的。對於一個專案而言,正確的模組劃分和任務分工是非常重要的,對於專案開發中遇到的問題,急著去問別人是不應該的,也是不禮貌的, Google,MSDN,CSDN等地方都是我們尋找答案的最佳場所。對於一個技術人員而言,個人並不僅僅體現在掌握的知識上,同樣體現在他對於陌生問題的處理能力上。如何快速的為自己所不瞭解的問題提供解決方案,是所有
30 / 42
技術開發人員的必修課。專案開發是快樂的,希望大家能多多的與我分享專案開發的經驗和樂趣。
31 / 42
用SQL Anywhere建立Windows Mobile資料庫
(轉載自http://news.newhua.com/news1/program_database/2009/217/092171436781DKJ639595GDDC2HE4812FDKE25356659C231IKCB6AJ.html)
SQL Anywhere是一套完整的資料庫應用和伺服器,它可以執行在很多平臺上,包括Windows Mobile。使用Visual Studio開發者可以開發執行在Windows Mobile裝置上的資料庫應用。
當為移動裝置做開發時,我曾遇到的最大的問題之一是資料儲存。這裡有兩個問題,第一:我經常跟使用SQL資料庫的伺服器同步化;第二:由於許多裝置不能天然地支援SQL(Android平臺除外,因為它有SQLite),所以我希望在我的移動應用中使用與之相關的資料庫。
大概一年前,我開始在我的另一個專案中使用Sybase的SQL Anywhere產品,這玩意給我留下了很深的印象。SQL Anywhere實際上是一套工具,內含有幾個桌面版本,還有一個執行在Windows Mobile上的版本。除此之外還有一個Ultralite版本,可以執行在小一點的Windows CE裝置和Palm OS上;還有Ultralite J版本——J是代表Java,它可以執行在BlackBerry和J2SE(Java 2 Platform Standard Edition)上。
Windows Mobile版本最酷的一點是,開發者在執行Windows Mobile的移動裝置上可以通過SQL擁有完全相關的資料庫存取。使用者完全可以在移動裝置上儲存列表,然後在伺服器上與之同步。對我們來說,這確實是我們想要的功能。
Sybase最近釋出了SQL Anywhere.的version 11。本文我將介紹在Windows Mobile 6裝置上(尤其是一個升級到Windows Mobile 6的HTC/AT&T 8525)配置SQL Anywhere。
Sybase是誰?
大概半年前,我跟我的一個朋友聊天時提到我正在試用Sybase的一個產品,他很驚奇地問道“Sybase?他們沒什麼進步啊。”的確如此,但是儘管他看起來在資料庫領域已經落後於像Oracle、Microsoft SQL Server之類的競爭對手,但Sybase仍然是個很強的角色。
我所說的這款產品——SQL Anywhere,出自Sybase的一個名為iAnywhere的子公司,iAnywhere成立於2000年五月,至今已推出了多套產品。
SQL Anywhere還包含了一個免費的Developer版本,本文我也用到了。
Windows Version and Windows Mobile Edition
為了使用Windows Mobile版本,開發者實際需要安裝整個SQL Anywhere的Windows桌面版本,然後在Windows Mobile上安裝Windows Mobile edition。
整個Windows version包括一套開發工具、一個執行在Windows Mobile的.NET組裝。開發者可以在熟悉的Visual Studio環境中使用c#。
幾個小問題
之前我的電腦曾安裝了Visual Studio 2008,但是SQL Anywhere安裝器需要Visual Studio的
32 / 42
2005版本做一些附加安裝。而且由於我習慣地將惱人的Vista User Account Control關閉,上週我暫時開了下卻忘記關了。當Visual Studio安裝的時候,我不斷地收到提示告訴我應當在管理員許可權下執行。而且由於SQL Anywhere安裝器自動啟動Visual Studio,我無法控制。(今年晚些時候,SQL Anywhere的README檔案談到了在Visual Studio 2008的情況下如何處理。很顯然,SQL Anywhere安裝器是在Visual Studio 2008之前釋出的。看來Sybase應當修復這個問題了。)
我遇到的另一個問題是文件。SQL Anywhere的文件是可用的,但是需要單獨下載,這需要你登陸其公司的官方網頁然後使用使用者名稱和密碼登陸。雖然註冊是免費的,但從軟體的使用性來說這仍是個不小的麻煩。這裡你必須這麼做:安裝軟體後會開啟README,然後滾動到相應位置找到Documentation,將連結複製到網路瀏覽器,下載後安裝。這裡,開發者應該指向:C:\Program Files\SQL Anywhere 11\Documentation\en\HTMLHelp 然後開啟sqlanywhere_en11.chm 檔案。當開發者終於做完這些的時候,會發現好幾個“Getting Started”文件。
將SQL Anywhere配置到我的Windows Mobile裝置也是個麻煩事,同樣的也不是功能問題而是不知道怎麼怎麼做,不過通過Sybase網站的論壇我迅速地解決好了。在目錄:C:\Program Files\SQL Anywhere 11\CE\Deployment ,裡面有一個程式叫做cedeploy.exe。(我不知道它是什麼,在Google上搜尋“cedeploy.exe”只得到七頁結果,而且沒有官方的。幸而這個問題只是一時的問題,知道怎麼解決就可以了)
在移動裝置上的配置實際上很流暢。有一個公用的CAB檔案,我拷貝到了我的裝置上,執行這個檔案,就可以順利地安裝軟體了。
Building in Visual Studio
如果你熟悉建立資料庫應用,那麼用Visual Studio為Windows Mobile應用建立SQL Anywhere就很簡單。我個人是建立在:C:\Users\Public\Documents\SQL Anywhere 11\Samples\SQLAnywhere\CE\ado_net_sample。
這個例子演示了iAnywhere.Data.SQLAnywhere的名字空間(namespace),它包含了.NET資料庫開發常用的幾種類,例如,名字空間包含SAConnection, SADataAdapter,和SADataReader等類。如果開發者曾在.NET上做過資料庫開發,會明顯到看到這些類和重用資料庫類的區別。
除此之外,開發者可以使用資料邊界(data-bound)的控制如DataGrid,換言之,如果你有了基礎,在Windows Mobile裝置上使用SQL Anywhere不需要學習太多。
構建例項應用很順利,由於我使用的是Visual Studio 2008,Visual Studio會因為SQL Anywhere需要的是Visual Studio 2005而做轉換,不過這種轉換也很順利。
我編譯了這個專案沒有發現任何錯誤。我試著在模擬器上執行,但由於libraries不在模擬器上所以發現了許多runtime錯誤。坦白說,我不確定這些問題是因為SQL Anywhere在安裝時要求的是Visual Studio 2005而我用的是2008,還是因為其他問題。但是除了對此問題的追根問底,我決定直接在現實的裝置上執行。過去,我發現在現實的裝置上執行和在模擬器上執行沒有什麼區別,所以有時我直接跳過模擬器這一步。
我沒有采用在Visual Studio上使用配置,我直接在儲存卡上的Windows Mobile複製了執行程式。在裝置上,我從文件管理程式執行執行程式並執行順利。
33 / 42
我點選“connect”按鈕,出現錯誤顯示無法連結到資料庫,想起來了,因為我沒有啟動伺服器,我的錯。所以我關了應用,到SQL Anywhere目錄下啟動伺服器。伺服器相當配合,我點選按鍵來瀏覽樣例資料庫,為資料庫提供連結名,並最終執行。從資料庫的啟動伺服器提供一個小的控制檯顯示log資訊,到最終結束這個控制檯顯示資料庫一切就緒聽候差遣.
34 / 42
用Sybase移動資料庫開發CRM系統幾個關鍵問題的技術實現
(轉載自http://bbs.chinaunix.net/viewthread.php?tid=1011725)
應用介紹:汽車移動銷售,就是銷售人員通過移動裝置,如PDA、智慧手機,將銷售應用系統安裝於移動裝置上,實現移動辦公、移動銷售,移動裝置通過GPRS等無線網路與銷售中心進行聯絡,銷售所需要的各種資訊可以根據需要下載到移動裝置上,銷售人員收集的客戶資訊、銷售訂單資訊等可以根據需要上傳到銷售中心。
開發環境:
資料庫:SQL Anywhere 9
開發工具:SYBASE PocketBuilder 2.0
模擬環境:Microsoft Windows Mobile 5.0 MSFP Emulator Images
模擬平臺:Pocket PC 2003 SE 模擬程式
問題1:如何實現模糊查詢、同音字查詢?比如知春路寫成支椿路的話照樣能夠檢索出來怎麼實現。
分析:我們在查詢資訊時(如按某一人名查詢、按某一地名查詢),經常會遇到只知道發音不知道具體是哪個漢字的情況,為此我們提供同音字的模糊查詢,可大大方便使用者的查詢,只要輸入相同拼音的漢字,即可查出某資訊(如人員姓名、單位地址等)。為實現此功能,資料庫中除儲存漢字資訊外,還自動儲存漢字對應的漢語拼音資訊(不用人工處理,通過資料庫中的觸發器自動完成)。這樣在查詢時,通過資料庫的自定義函式取得漢字所對應的漢語拼音,再與資料庫中儲存的漢語拼音資訊相匹配進行檢索。
具體實現關鍵程式碼:
1.客戶模糊查詢(可輸入客戶名稱、客戶地址進行同音字的查詢)
string cname,cmobile,caddress,thissql,cnamecode,caddresscode
cname=string(trim(sle_name.text))
cmobile=string(sle_mobile.text)
caddress=string(trim(sle_address.text))
//通過函式取得漢字對應的漢語拼音
cnamecode=f_pinyin(cname)
caddresscode=f_pinyin(caddress)
thissql="(1=1)"
if rb_1.checked then //如果選擇“同音字模糊查詢”
if len(cname)<>0 then
thissql=thissql+" and (customer_customername_pinyin like '" + cnamecode +"')"
end if
if len(cmobile)<>0 then
thissql=thissql + " and (customer_mobile like '" + cmobile +"')"
end if
if len(caddress)<>0 then
thissql=thissql + " and (customer_address_pinyin like '"+ caddresscode +"')"
end if
//精確查詢
elseif rb_2.checked then
if len(cname)<>0 then
thissql=thissql+" and (customer_customername_pinyin like '%" + cnamecode +"%')"
end if
35 / 42
if len(cmobile)<>0 then
thissql=thissql + " and (customer_mobile like '%" + cmobile +"%')"
end if
if len(caddress)<>0 then
thissql=thissql + " and (customer_address_pinyin like '%"+ caddresscode +"%')"
end if
end if
//模糊查詢
tab_1.tabpage_3.dw_1.settransobject(sqlca)
tab_1.tabpage_3.dw_1.setfilter(thissql)
//tab_1.tabpage_3.dw_1.setfilter( "customer_customer_id=customer_customer_id[1]")
tab_1.tabpage_3.dw_1.filter( )
//today
string stoday = String(now(),"yyyymmdd")
tab_1.tabpage_3.dw_1.retrieve(stoday)
if tab_1.tabpage_3.dw_1.rowcount()=0 then
messagebox("系統提示","沒有符合條件的記錄")
sle_name.text=""
sle_mobile.text=""
sle_address.text=""
return
end if
tab_1.selecttab(3)
2、 取漢字所對應的漢語拼音的函式
integer li_len,li_loc
string ls_hz,ls_py_code,ls_output
li_loc=1
ls_output=''
li_len=len(inputstring)
ls_output=''
do while li_len > 0
ls_hz=mid(inputstring,li_loc,1)
//從資料庫讀取漢字所對應的漢語拼音
select trim(pinyin) into :ls_py_code from char_pinyincode where hanzi_char=:ls_hz order by pinyin;
if isnull(ls_py_code) then
ls_py_code=''
end if
if ls_py_code='' then
ls_output=ls_output+"_"+ls_hz
else
ls_output=ls_output+"_"+ls_py_code
end if
li_len=li_len - 1
li_loc=li_loc + 1
loop
if mid(ls_output,1,1)='_' then
ls_output=right(ls_output,len(ls_output)-1)
end if
li_len=len(ls_output)
return ls_output
36 / 42
問題2:如何實現圖片的動態儲存?如從資料庫讀取圖片內容並顯示到圖片控制元件中
分析:將圖片的內容儲存在資料庫中,在需要瀏覽圖片時,從資料庫中讀取圖片資訊直接顯示在圖片中。這樣做的好處是,方便對圖片資源的備份(隨資料庫的備份一塊進行),圖片不佔用額外的儲存空間;若將圖片儲存在磁碟上,會由於儲存路徑發生變化而找不到圖片資源,通過資料庫儲存就避免了該問題。
具體實現關鍵程式碼:
selectblob car_pic_total into :photo from auto_stock
WHERE (car_brand like :carbrand) AND (car_type like :cartype) AND (car_color like :carcolor)
using sqlca;
if not isnull(photo) then
//將二進位制內容與圖片控制元件相關聯
tab_stock.tabpage_2.p_2.setpicture(photo)
end if
問題3、如何實現手持裝置與伺服器的資料同步?
分析:通過 MobiLink 來實現手持裝置與伺服器的資料同步。由於開始時設定資訊考慮不全面,在某些裝置上不能成功與伺服器進行資料進行。後經過程式完善,可以實現在各種手持裝置與伺服器的資料同步。
具體實現關鍵程式碼:
string cmd, path
string exe_name
string connect_string, other_arguments
long rc, idx
// ASA key
if -1 = RegistryGet(ASA_REGPATH, "Location", path) then
MessageBox("Error", "Cannot find ASA path.")
return -1
end if
// append "\win32" to path if running on desktop
if iEnv.ostype = windowsnt! then
path = path + "\win32"
connect_string = " -c ~"dsn=" + is_desktop_dsn +"~""
else
connect_string = " -c ~"dsn=" + is_ce_dsn +"~""
end if
exe_name = path + "\dbmlsync.exe"
uf_generate_sync_class_name()
if NOT IsNull(is_quiet) and Len(is_quiet) > 0 then
other_arguments = " " + is_quiet
else
other_arguments = ""
end if
if NOT IsNull(is_logging) and Len(is_logging) > 0 then
other_arguments += is_logging
end if
other_arguments += " -k "
if NOT IsNull(is_additional_args) and Len(is_additional_args) > 0 then
other_arguments += is_additional_args
end if
37 / 42
if NOT IsNull(is_extended_args) and Len(is_extended_args) > 0 then
other_arguments += ' -e ~"' + is_extended_args + '~"'
end if
integer iPos
iPos=pos(lower(connect_string),"dsn=filedsn=")
if iPos > 0 then
connect_string=left(connect_string,iPos -1 )+right(connect_string,len(connect_string) - iPos -4 +1)
end if
//通過呼叫資料同步元件的方法,進行資料同步,
rc = pb_run_dbmlsync(exe_name, is_publication_name, is_mluser, is_mlpassword, connect_string, other_arguments, is_sync_class_name )
return rc
以上是我們的心血結晶,無償與各位分享,只希望多些志同道合的朋友,希望與Sybase及iAnywhere產品有興趣的朋友們多多交流 。
各位大仙們還有什麼更好的實現方法,也希望能共同分享、探討!:)
38 / 42
智慧裝置開發環境的配置過程
(轉載於http://news.e800.com.cn/articles/2008/627/1214531390137_1.html)
現在就來介紹開發SQL Server 2005 Compact Edition移動裝置端應用應具備的基本條件吧!通常我們都是使用Visual Studio 2005 Professional及更高的版本進行智慧裝置程式的開發(Visual Studio 2005 Express目前並不支援)。在安裝Visual Studio 2005的過程中,只需要將圖1中的“智慧裝置可程式設計技術”單選框選中,安裝完畢後就可以利用Visual C#開發託管程式碼的智慧裝置程式了。
圖1 選擇“智慧裝置可程式設計技術”
我們在開發特定平臺的智慧裝置程式時,往往需要事先安裝相應的SDK(軟體開發包)。比如說要開發針對Windows Mobile 6.0的應用程式,就要先安裝Windows Mobile 6 SDK,否則Visual Studio 2005是不會出現Windows Mobile 6智慧裝置開發這個選項的。為此,我們在安裝完Visual Studio 2005後,就需要安裝ActiveSync軟體,這樣才能繼續完成特定平臺的SDK安裝,這個先後次序希望大家一定要注意。 ActiveSync可以同時支援PPC和微軟智慧手機(Smartphone),使用它可以很方便地在PC與PPC或智慧手機間進行資料的同步。ActiveSync不僅可以同步檔案,電子郵件及日程等,更有著許多額外的功能如同步SMS等。另外,Windows Mobile裝置的使用者還可以通過連線PC來訪問網際網路。ActiveSync可以說是PC與移動裝置間的一座橋樑。 現在最新的ActiveSync版本為4.5,該軟體的中文版可以在該連結下載:http://download.microsoft.com/download/7/e/c/7ecbd388-7fb5-4e3e-b57f-12eaf7eb6136/setup.msi 當ActiveSync安裝完畢後,會提示你重新啟動計算機才能完成相應的設定。ActiveSync的介面如圖2所示:
39 / 42
圖2 ActiveSync 4.5簡體中文版
前文提到過,當我們需要開發特定平臺的Windows Mobile應用程式時,需要安裝相應的SDK。在本專題中將採用Windows Mobile 6.0作為開發的平臺,因為Windows Mobile 6.0裝置的ROM中已經內建了.Net Compact Framework 2.0 SP1和SQL Server 2005 Compact Edition,加上近幾個月來中國市場上已經有越來越多的產品採用了Windows Mobile 6.0系統,相信不用多久Windows Mobile 6.0就會取代Windows Mobile 5.0,成為主流的作業系統。當然,在本專題中的所有程式也都可以在無需任何修改的條件下在Windows Mobile 5.0上執行。這是因為Windows Mobile 6.0和Windows Mobile 5.0都是基於Windows CE 5.0的,只不過Windows Mobile 6.0在原來5.0的基礎上新增了一些新的特性,例如Vista風格等。 Windows Mobile 6.0的SDK最新版可以包含兩個版本,一個是針對Pocket PC和Pocket PC Phone Edition開發的Professional版本,另外一個則是針對Smartphone開發的Standard版本。在本專題中,我們主要是針對Pocket PC Phone Edition這種平臺進行開發的,相對與Pocket PC它具備了通話的功能,而且硬體效能較之Smartphone有很大的提高,所以一般條件下安裝Windows Mobile 6.0 Professional SDK即可。 Windows Mobile 6.0 Professional SDK的下載地址如下:http://download.microsoft.com/download/f/2/3/f232f773-7edc-4300-be07-d3b76a5b3a91/Windows%20Mobile%206%20Professional%20SDK%20Refresh.msi Windows Mobile 6.0 Standard SDK的下載地址如下: http://download.microsoft.com/download/f/2/3/f232f773-7edc-4300-be07-d3b76a5b3a91/Windows%20Mobile%206%20Standard%20SDK%20Refresh.msi 在Windows Mobile 6.0 Professional SDK安裝完畢後,大家可以通過“開始”-“所有程式”-“Windows Mobile 6 SDK”-“Line of Business Extras”-“Mobile Line of Business Solution Accelerator”下載一個類似物流系統的移動行業解決方案,我將在本專題的最後部分對該專案進行詳細的分析和講解。該移動行業講解方案的部分功能模組如3所示:
40 / 42
圖3 “Mobile Line of Business Solution Accelerator”的登入模組和建立新訂單模組
你也可以在該連結直接下載“Mobile Line of Business Solution Accelerator”的示例程式碼:http://download.microsoft.com/download/7/e/6/7e635836-bf36-436b-b8cc-0b16c74ba9b7/MobileLineofBusinessSolutionAccelerator.msi 預設狀態下,安裝Windows Mobile 6.0 Professional SDK會自動安裝Windows Mobile 6.0的英文裝置模擬器,而中文的裝置模擬器是需要我們單獨下載的進行安裝的,Windows Mobile 6.0中文模擬器如圖4所示。 Windows Mobile 6 Professional 中文映象的下載地址:http://download.microsoft.com/download/0/1/2/012bfbba-9fe5-4e68-86c9-d434446d97dd/0804/Windows%20Mobile%206%20Professional%20Images%20(CHS).msi Windows Mobile 6 Standard中文映象的下載地址:http://download.microsoft.com/download/0/1/2/012bfbba-9fe5-4e68-86c9-d434446d97dd/0804/Windows%20Mobile%206%20Standard%20Images%20(CHS).msi
41 / 42
圖4 Windows Mobile 6中文模擬器的“今日”介面
當Windows Mobile 6.0 SDK安裝完畢後,我們就可以通過Visual Studio 2005來開發針對Windows Mobile 6.0的智慧裝置程式了。如圖5所示,在“智慧裝置”欄中我們會發現多了“Windows Mobile 6 Professional“這一項,而且通過右側的模板,我們可以建立五種不同型別的專案。
圖5 在Visual Studio 2005中建立Windows Mobile 6.0智慧裝置程式
接下來我們要安裝的是SQL Server 2005 Compact Edition的SDK,該SDK包含用於在桌上型電腦上開發和部署應用程式的SQL Server 2005 Compact Edition 執行時(必須安裝),而且對於不同型別處理器的移動裝置,其對應的SQL Server 2005 Compact Edition元件安裝包也是不同的。除此之外,SDK中還包含了的SQL Server 2005 Compact Edition的幫助文件,這大概是當前學習SQL Server 2005 Compact Edition的唯一權威資料了。 在筆者當前寫作的階段,SQL Server 2005 Compact Edition SDK的下載頁面依然是無法開啟的,這種狀況大概已經持續了半年左右。下面我將給出SQL Server 2005 Compact Edition SDK直接下載地址: SQL Server 2005 Compact Edition SDK中文:http://download.microsoft.com/download/0/9/4/094d27fe-8d7f-4b0b-8130-
42 / 42
555ed2c8b366/SSCE31SDK-CHS.msi SQL Server 2005 Compact Edition SDK英文:http://download.microsoft.com/download/e/5/b/e5b19eb6-4141-4dba-a1fb-e95693c1538f/SSCE31SDK-ENU.msi SQL Server 2005 Compact Edition SDK安裝完畢後,就可以在其安裝目錄的“\v3.1\SDK\bin\Desktop”子資料夾中找到一個名為“SQLServerCE31-zh-CHS.msi”的檔案,該檔案就是用於在桌上型電腦上開發和部署應用程式的SQL Server 2005 Compact Edition 執行時。因為使用到SQL Server 2005 Compact Edition的智慧裝置託管程式需要引用“System.Data.SqlServerCe”名稱空間,而該名稱空間又是由“System.Data.SqlServerCe.resources.dll “檔案提供的,為此必須在計算機上安裝SQL Server 2005 Compact Edition 執行時。 “v3.1\SDK\Docs\zh-CHS”子資料夾中的“SSCE31BOL-CHS.msi”檔案就是SQL Server 2005 Compact Edition幫助文件,因為其內容非常詳細,因此建議安裝。在“\v3.1\SDK\bin\wce500”子資料夾中,包含了針對不同型別處理器的SQL Server 2005 Compact Edition元件安裝包,如圖6所示。至於如何將SQL Server 2005 Compact Edition的各個元件安裝到移動裝置上,將在下一小節詳細介紹。
圖6 針對7種不同處理器的SQL Server 2005 Compact Edition元件安裝包

相關文章