異世界


2012年7月31日 星期二

委託(delegate)

委託(delegate), 已經在前文 UDP Server (二)SerialPort Class 擴充 (二) 中使用。

在此做一個簡明的說明,作為助憶。

JgeComport Class 該文為例

1. 宣告一個委託的格式(模板) : 委託(delegate)必須有一個簽章,以下簽章使用事件(event)專有格式(並非必要)

public delegate void jgecomEventHandler(object sender, jgecomEventArgs e);

 

2.  宣告一個委託方法的物件: 舊說法為,宣告一個方法的指標。若為事件則稱為 event

public event jgecomEventHandler Received;


3. 執行該委託,以下程式說明: 若該方法指標指向 null 則不執行。若為事件,該處為事件觸發程式

if (Received != null) //. 當事件變數不為 null 則執行之
{
omEventArgs e = new jgecomEventArgs(msg, commName);
Received(this, e);
}
4. 依據委託格式(模板),建立方法。若為事件,則稱為 event 處理器



private void onReceived(object sender, jgecomEventArgs e)
{
switch (e.NAME.ToString())
{
case "COM2":
Byte[] bytes = new Byte[1024];
bytes = JgeComport.StreamToBytes(e.MSG);

string ss = System.Text.Encoding.ASCII.GetString(bytes);
textBox1.AppendText(ss + Environment.NewLine);

textBox1.Text += String.Format("{0}{1}", BitConverter.ToString(bytes), Environment.NewLine); //Environment.NewLine => \r\n
label2.Text = bytes.Length.ToString();
break;
default:
break;
}
}

5. 將事件與事件處理器繫結

MyJgeComport.Received += this.onReceived;


6.執行委託的其他方法

   6.1 將方法與委託進行聯繫,實體化一個 onReceived 方法物件

jgecomEventHandler jHandler = new jgecomEventHandler( this.onReceived; );


   6.2 建立一個方法,該方法接受一個委託物件作為參數

public void DoEventHandler(jgecomEventHandler jeh, object sender, jgecomEventArgs e )
{
MessageBox.Show( e.ToString() );
}


  6.3 執行

DoEventHandler( this.onReceived, this , new jgecomEventArgs(msg, commName) );





一個最典型的委託 為 Invoke 方法 (Delegate, Object[]) 在擁有控制項基礎視窗控制代碼的執行緒上,以指定的引數清單執行指定的委派。
public Object Invoke (
Delegate method,
params Object[] args
)


method

方法的委派,採用和 args 參數中包含者相同的數字和型別的參數。



args

做為引數傳遞至指定方法的物件陣列。如果方法沒有引數,這個參數可能是 Null 參照 (即 Visual Basic 中的 Nothing)。



2012年7月29日 星期日

匿名代理

以下顯示 LIST<T>.FindIndex 的使用方法,當代理函式除了原<T> 物件外又需引入參數將是一大麻煩。

第一個程式使用全域變數解決,但是該函式如果被重複呼叫就可能出現錯誤。

public int mDevID;
public int mMsgID;

/* 搜尋 AlarmList,並回傳第一個符合的 Index,否則為 -1 */
public int ExistLog(int devID, int msgID)
{
mDevID = devID;
mMsgID = msgID;

return AlarmList.FindIndex(ProductExistLog);
}

/* AlarmList 搜尋用代理程式 for ExistLog() */
private bool ProductExistLog(NmsLog e)
{
return (e.MsgID == this.mMsgID) && (e.DevID == this.mDevID);
}

 

以匿名代理函式解決:
public int ExistLog(int devID, int msgID)
{
return AlarmList.FindIndex(
delegate(NmsLog e)
{
return (e.MsgID == devID) && (e.DevID == msgID);
}
);
}

以 Lambda 語法 改寫 匿名代理: 以 e 做為參數 傳遞給 "=>" 符號後面的運算式

public int ExistLogEx(int devID, int msgID)
{
return AlarmList.FindIndex( e => (e.MsgID == devID) && (e.DevID == msgID) );
}

2012年7月22日 星期日

C# 如何建立MS Access 資料庫

使用ADOX在 C# 程式建構一個MS Access 資料庫,。

1. 首先加入參考

image

image

image

 

2.

using ADOX;

 

3. 加入以下Function
public static bool CreateAccessDB(string dbName)
{
try
{
Catalog cat = new Catalog();
string strCreateDB = "";

strCreateDB += "Provider=Microsoft.Jet.OLEDB.4.0;";
strCreateDB += "Data Source=" + dbName + ";";
strCreateDB += "Jet OLEDB:Engine Type=5";
cat.Create(strCreateDB);
return true;
}
catch (Exception)
{
throw;
}
}



2012年7月21日 星期六

SQLite 動手做(一)

以SQL語法直接建立資料庫,語法若不孰悉可以使用 FireFox 瀏覽器的擴充套件 sqlite-manager 作為輔助。

SQLite.NET 的dll 對於x86 與64Bit 有區分須小心。若參考錯誤執行時會產生Error。

image

 

1. 資料庫 : jNmsDB.sqlite

2. 資料表:

nmsGroup

ColumeID

Name

Type

NotNull

DefaultVAlue

Primary Key

0

GroupID

INTEGER

1

 

1

1

GroupName

CHAR[20]

1

192.168

 

2

Remark

TEXT

0

 

 

nmsStation

ColumeID

Name

Type

NotNull

DefaultVAlue

Primary Key

0

StationID

INTEGER

1

 

1

1

IP_Section

INTEGER

1

1

 

2

StationName

INTEGER

1

 

 

3

GroupID

INTEGER

1

 

 

4

Remark

TEXT

0

 

 

nmsDevice

ColumeID

Name

Type

NotNull

DefaultVAlue

Primary Key

0

DeviceID

INTEGER

1

 

1

1

StationID

INTEGER

1

 

 

2

DeviceName

CHAR[20]

1

 

 

3

IP

TEXT

1

“192.168.1.1”

 

4

PingEnable

BOOLB

1

 

 

5

MsgID

INTEGER

1

 

 

6

AlarmSummery

BOOLB

1

 

 

7

ValueAlarm

BOOLB

1

 

 

8

IcmpAlarm

BOOL

1

 

 

9

IcmpAlarmCnt

integer

1

 

 

10

Remark

TEXT

0

 

 

nmsMessage

ColumeID

Name

Type

NotNull

DefaultVAlue

Primary Key

0

MsgID

INTEGER

1

 

1

1

MSG

TEXT

1

“ ”

 

2

Level

INTEGER

1

 

 

3

Remark

TEXT

0

 

 

nmsDI

ColumeID

Name

Type

NotNull

DefaultVAlue

Primary Key

0

VarID

INTEGER

1

 

1

1

VarName

TEXT

1

 

 

3

Remark

TEXT

0

 

 

nmsBit

ColumeID

Name

Type

NotNull

DefaultVAlue

Primary Key

0

MappingID

INTEGER

1

 

1

1

VarID

INTEGER

1

0

 

2

BitNo

INTEGER

1

0

 

3

DevID

INTEGER

1

0

 

4

MsgID

INTEGER

1

0

 

5

LogEnabled

BOOL

1

 

 

6

Remark

TEXT

0

 

 

3. 實驗結果

image

4. SourceCode

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SQLite;
using System.IO;

namespace TestSQLite
{
public partial class Form1 : Form
{
private SQLiteConnection sql_con;
private SQLiteCommand sql_cmd;
private SQLiteDataAdapter DB;
private DataSet DS = new DataSet();
private DataTable DT = new DataTable();
private BindingSource BS = new BindingSource();


public Form1()
{
InitializeComponent();

this.cmbTable.Items.AddRange(new object[] {
"nmsGroup",
"nmsStation",
"nmsDevice",
"nmsMessage",
"nmsDI",
"nmsBit "});
}

string DbName = "jNmsDB_1.sqlite";
string TableName = "nmsGroup";

public void NmsDBCreate(string DbName)
{
SetConnection(DbName);
sql_con.Open();

try
{
#region New DB File
string sql = " CREATE TABLE \"nmsMessage\" (\"MsgID\" INTEGER PRIMARY KEY NOT NULL UNIQUE , \"MSG\" TEXT NOT NULL DEFAULT \"\", \"Level\" INTEGER NOT NULL DEFAULT 0, \"Remark\" TEXT)";
this.ExecuteNonQuery(sql);

sql = " CREATE TABLE \"nmsBit\" (\"MappingID\" INTEGER PRIMARY KEY NOT NULL UNIQUE , \"VarID\" INTEGER NOT NULL DEFAULT 0, \"bitNo\" INTEGER NOT NULL DEFAULT 0, \"DevID\" INTEGER NOT NULL DEFAULT 0, \"MsgID\" INTEGER NOT NULL DEFAULT 0, \"LogEnabled\" BOOL NOT NULL , \"Remark\" TEXT)";
this.ExecuteNonQuery(sql);

sql ="CREATE TABLE \"nmsDI\" (\"VarID\" INTEGER PRIMARY KEY NOT NULL UNIQUE , \"VarName\" TEXT NOT NULL UNIQUE , \"Remark\" TEXT)";
this.ExecuteNonQuery(sql);

sql ="CREATE TABLE \"nmsDevice\" (\"DeviceID\" INTEGER PRIMARY KEY NOT NULL UNIQUE , \"StationID\" INTEGER NOT NULL , \"DeviceName\" TEXT NOT NULL UNIQUE , \"IP\" TEXT NOT NULL UNIQUE DEFAULT \"192.168.1.1\", \"PingEnable\" BOOL, \"MsgID\" INTEGER NOT NULL , \"AlarmSummery\" BOOL NOT NULL , \"ValueAlarm\" BOOL NOT NULL , \"IcmpAlarm\" BOOL NOT NULL , \"IcmpAlarmCnt\" INTEGER NOT NULL DEFAULT 0, \"Remark\" TEXT NOT NULL )";
this.ExecuteNonQuery(sql);

sql = "CREATE TABLE \"nmsStation\" (\"StationID\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , \"IP_Section\" INTEGER NOT NULL DEFAULT 1, \"StationName\" TEXT NOT NULL UNIQUE DEFAULT Taipei, \"GroupID\" INTEGER NOT NULL , \"Remark\" TEXT)";
this.ExecuteNonQuery(sql);

sql = "CREATE TABLE \"nmsGroup\" (\"GroupID\" INTEGER PRIMARY KEY NOT NULL ,\"GroupName\" CHAR[20] NOT NULL DEFAULT (192.168) ,\"Remark\" CHAR[20])";
this.ExecuteNonQuery(sql);
#endregion
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
sql_con.Close();
}

}
private void SetConnection(string DbName)
{
if (!File.Exists(DbName)) { File.Create(DbName); }
sql_con = new SQLiteConnection(string.Format("Data Source={0};Version=3;New=False;Compress=True;", DbName));
}
private void LoadData(string DbName, string TAbleName)
{
SetConnection(DbName);
sql_con.Open();

try
{
sql_cmd = sql_con.CreateCommand();
string CommandText = string.Format("select * from {0}", TAbleName);
DB = new SQLiteDataAdapter(CommandText, sql_con);
DS.Reset();
DB.Fill(DS);
DT = DS.Tables[0];
Grid.DataSource = DT;

BS.DataSource = DT;
Group_Navigator.BindingSource = BS;
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
sql_con.Close();
}
}
private void ExecuteNonQuery(string txtQuery)
{
SetConnection(DbName);
sql_con.Open();

sql_cmd = sql_con.CreateCommand();
sql_cmd.CommandText = txtQuery;

sql_cmd.ExecuteNonQuery();
sql_con.Close();
}
private void Update(ref SQLiteDataAdapter db, ref DataTable dt )
{
SQLiteCommandBuilder sqCommandBuilder = new SQLiteCommandBuilder(db);
db.AcceptChangesDuringUpdate = true;
db.InsertCommand = sqCommandBuilder.GetInsertCommand();
db.UpdateCommand = sqCommandBuilder.GetUpdateCommand();
db.DeleteCommand = sqCommandBuilder.GetDeleteCommand();

db.Update(dt.DataSet, dt.TableName);
}

#region 測試區
private void button1_Click_1(object sender, EventArgs e)
{
DbName = txtDbName.Text;
NmsDBCreate(DbName);
}
private void btnLoadTable_Click(object sender, EventArgs e)
{
LoadData(DbName, cmbTable.Text);
}
private void btnSaveData_Click(object sender, EventArgs e)
{
this.Update(ref DB, ref DT);
}
#endregion

private void txtDbName_TextChanged(object sender, EventArgs e)
{
DbName = this.txtDbName.Text;
}
}
}


5. 在使用 FireFox 瀏覽器的擴充套件 sqlite-manager中檢視成果


image

SQLiter 網站

1. SQLite 網站內可獲得最新資訊、下載資源等...  http://www.sqlite.org/

2. 一個很有條理的入門範例(英文) http://www.codeproject.com/Articles/22165/Using-SQLite-in-your-C-Application

3. 很棒的 Utility Class [C# SQLiteHelper類似SqlHelper類實現存取Sqlite數據庫]

4.  SQLite Namespace

2012年7月20日 星期五

SQLite 輕量可攜的資料庫

SQLite是一個簡易的資料庫系統,開放原始碼,可以直接把SQLite綁在程式裡使用,FireFox及Android等軟體也都有內建SQLite。SQLite不需要安裝,看起來就只是一個檔案而已,也可以使用memory模式,讓它存在記憶體中而不需要建立一個檔案存放。

SQLite支援的SQL指令:http://www.sqlite.org/lang_corefunc.html

C#要連接SQLite可以使用open source的System.Data.SQLite,它是一個基於ADO.Net所做與SQLite的溝通介面,目前支援到.net framework 3.5。可於sourceforge下載其dll來使用,就可以了。

下方的範例是介紹如何在Csharp下使用ADO.NET連接與操作SQLite,包含了自動產生SQLite檔案與DataGridView使用class binding datasource方法。

…(參考資料來源: http://blog.yslifes.com/archives/972)

 

============================================================================================================

Linq To SQLite

前幾天小章大發了一篇 [Entity Framework] SQLite 與 Entity Framework

剛好最近我也有用到SQLite,但我是用Linq To SQLite,而不是Entity Framework

雖然這兩個東西很像,但由於DBML Designer沒有提供生成SQLite資料庫的DBML的功能,

因此必須要靠第三方的元件來生出DBML。雖然比較麻煩,但提供給大家另一個選擇。

首先必須安裝SQLite的Provider

Latest file releases for the ADO.NET 2.0 Provider for SQLite

安裝完之後,就可以利用Visual Studio來建立資料庫的schema,

或是用 Navicat for SQLite 這套工具來幫助管理資料庫(有免費的中文版,還不錯)。

資料庫建完之後,接著要去下載這套 dblinq2007 ,用來生出dbml。

…(參考資料來源: http://www.dotblogs.com.tw/lastsecret/archive/2011/05/04/24191.aspx)

 

============================================================================================================
SQLite 自動遞增數值
張貼者:2008/12/9 上午12:43Yichang Wu   [ 已更新 2008/12/9 上午12:44 ]

Create Table 時參數

`noid`   INTEGER   PRIMARY   KEY   AUTOINCREMENT
SQLite 預設會有個 rowid , 但不能存取
加入一個新的 `id` INTEGER   PRIMARY   KEY   AUTOINCREMENT
rowid 就會不見(隱藏!?)

參考:Google關鍵字搜尋 ..... 忘了記。

SQLite DateTime 字串處理
張貼者:2008/12/9 上午12:40Yichang Wu   [ 已更新 2008/12/9 上午12:42 ]

msdn上對iso 8601的描述:(http://msdn.microsoft.com/zh-cn/library/ms187819.aspx)
DateTime 字串示例:
* 2008-12-01T16:18:13
* 2008-12-01T16:18:13.487
用data_time.ToString("s");這種方法轉換成iso 8601標準字符串格式
如下:
string sql="insert into [table] (date_time)" values('" + date_time.ToString("s" ) + "'";

參考:

http://hi.baidu.com/hopesoft/blog/item/4c29e7f83f320b09d9f9fd96.html

C# 使用 System.Data.SQLite
張貼者:2008/12/9 上午12:32Yichang Wu   [ 已更新 2008/12/9 上午12:34 ]

System.Data.SQLite
http://sqlite.phxsoftware.com/
檔案下載後, 解壓縮, 從中取得 System.Data.SQLite.dll
以下範例來自:
http://www.javaeye.com/topic/114055
using

using System.Data.SQLite;


Connection和Command:



private SQLiteConnection conn; 
private SQLiteCommand cmd;


連接db:



conn = new SQLiteConnection("Data Source=c:\\test.db");  
conn.Open();  

INSERT / UPDATE:



cmd = conn.CreateCommand();  
cmd.CommandText = "INSERT INTO user(email,name) VALUES ('email','name')";  
cmd.ExecuteNonQuery();  
 
 
 
cmd.CommandText = "UPDATE userSET name = 'Codelicious' WHERE ID = 1";  
cmd.ExecuteNonQuery();  


SELECT:




cmd.CommandText = "SELECT ID, name FROM user";  
SQLiteDataReader reader = cmd.ExecuteReader();  
if (reader.HasRows)  
             {  
                 while (reader.Read())  
                {  
                    Console.WriteLine("ID: " + reader.GetInt16(0));  
                     Console.WriteLine("name: " + reader.GetString(1));  
                 }  
             }  


SQLite Manager

firefox 也開始改用sqlite 做為內部的資料庫引擎 ,也因此firefox有一個延伸的add-on :  https://addons.mozilla.org/en-US/firefox/addon/5817
功能跟sqlite browser一樣 或者說 是sqlite browser的網頁版


image

image

 

 

…(參考資料來源: 隨記 SQLite)

2012年7月18日 星期三

How To 以下拉選單選擇 GridView的Cell資料

如何將 DataGridView 中的資料以ComboBox 選擇?

image

1. 將GridView的 Columns 做以下選擇

先決條件是GridView 使用的 DataSource,需與ComboBox 的DataSource 有關連的欄位,將該欄位名稱分別設定於下圖的 DataPropertyName及ValueMember。

image

.NET 資料物件關係圖

DataSet、TableAdapter、BindingSource和BindingNavigator對象之間的關係

 

image

2012年7月17日 星期二

DateTime 的運算

DateTime 與TimeSpan

DateTime 和 TimeSpan 實值型別的差別在於 DateTime 表示時間的一瞬間,而 TimeSpan 則表示時間間隔。 例如,這表示您可以將兩個 DateTime 的執行個體相減,以取得表示兩個執行個體之間時間間隔的 TimeSpan 物件。 或者,您可以將正的 TimeSpan 加上目前的 DateTime,以取得表示未來日期的 DateTime 值。

您可以從 DateTime 物件中加入或減去時間間隔。 時間間隔可以是正數或負數、可以用類似刻度或秒數的單位來表示,也可以表示為 TimeSpan 物件。

 

DateTime 可做增減,如下方法:

名稱

說明

Add

傳回新的 DateTime,這是將這個執行個體的值加上指定之 TimeSpan 值的結果。

AddDays

傳回新的 DateTime,這是將這個執行個體的值加上指定之天數的結果。

AddHours

傳回新的 DateTime,這是將這個執行個體的值加上指定之時數的結果。

AddMilliseconds

傳回新的 DateTime,這是將這個執行個體的值加上指定之毫秒數的結果。

AddMinutes

傳回新的 DateTime,這是將這個執行個體的值加上指定之分鐘數的結果。

AddMonths

傳回新的 DateTime,這是將這個執行個體的值加上指定之月數的結果。

AddSeconds

傳回新的 DateTime,這是將這個執行個體的值加上指定之秒數的結果。

AddTicks

傳回新的 DateTime,這是將這個執行個體的值加上指定之刻度數的結果。

AddYears

傳回新的 DateTime,這是將這個執行個體的值加上指定之年數的結果。

 

標準日期和時間格式字串

Console.WriteLine(thisDate.ToString("d"));
Console.WriteLine("The current date and time: {0:MM/dd/yy H:mm:ss zzz}",thisDate2);



































































格式規範


說明


範例


"d"


簡短日期模式。

詳細資訊:簡短日期 ("d") 格式規範


6/15/2009 1:45:30 PM -> 6/15/2009 (en-US)

6/15/2009 1:45:30 PM -> 15/06/2009 (fr-FR)

6/15/2009 1:45:30 PM -> 2009/06/15 (ja-JP)


"D"


完整日期模式。

詳細資訊:完整日期 ("D") 格式規範


6/15/2009 1:45:30 PM -> Monday, June 15, 2009 (en-US)

6/15/2009 1:45:30 PM -> 15 июня 2009 г. (ru-RU)

6/15/2009 1:45:30 PM -> Montag, 15. Juni 2009 (de-DE)


"f"


完整日期/時間模式 (簡短時間)。

詳細資訊:完整日期簡短時間 ("f") 格式規範


6/15/2009 1:45:30 PM -> Monday, June 15, 2009 1:45 PM (en-US)

6/15/2009 1:45:30 PM -> den 15 juni 2009 13:45 (sv-SE)

6/15/2009 1:45:30 PM -> Δευτέρα, 15 Ιουνίου 2009 1:45 μμ (el-GR)


"F"


完整日期/時間模式 (完整時間)。

詳細資訊:完整日期完整時間 ("F") 格式規範


6/15/2009 1:45:30 PM -> Monday, June 15, 2009 1:45:30 PM (en-US)

6/15/2009 1:45:30 PM -> den 15 juni 2009 13:45:30 (sv-SE)

6/15/2009 1:45:30 PM -> Δευτέρα, 15 Ιουνίου 2009 1:45:30 μμ (el-GR)


"g"


一般日期/時間模式 (簡短時間)。

詳細資訊:一般日期簡短時間 ("g") 格式規範


6/15/2009 1:45:30 PM -> 6/15/2009 1:45 PM (en-US)

6/15/2009 1:45:30 PM -> 15/06/2009 13:45 (es-ES)

6/15/2009 1:45:30 PM -> 2009/6/15 13:45 (zh-CN)


"G"


一般日期/時間模式 (完整時間)。

詳細資訊:一般日期完整時間 ("G") 格式規範


6/15/2009 1:45:30 PM -> 6/15/2009 1:45:30 PM (en-US)

6/15/2009 1:45:30 PM -> 15/06/2009 13:45:30 (es-ES)

6/15/2009 1:45:30 PM -> 2009/6/15 13:45:30 (zh-CN)


"M"、"m"


月/日模式。

詳細資訊:月 ("M"、"m") 格式規範


6/15/2009 1:45:30 PM -> June 15 (en-US)

6/15/2009 1:45:30 PM -> 15. juni (da-DK)

6/15/2009 1:45:30 PM -> 15 Juni (id-ID)


"O"、"o"


來回日期/時間模式。

詳細資訊:來回 ("O"、"o") 格式規範


6/15/2009 1:45:30 PM -> 2009-06-15T13:45:30.0900000


"R"、"r"


RFC1123 模式。

詳細資訊:RFC1123 ("R"、"r") 格式規範


6/15/2009 1:45:30 PM -> Mon, 15 Jun 2009 20:45:30 GMT


"s"


可排序日期/時間模式。

詳細資訊:可排序 ("s") 格式規範


6/15/2009 1:45:30 PM -> 2009-06-15T13:45:30


"t"


簡短時間模式。

詳細資訊:簡短時間 ("t") 格式規範


6/15/2009 1:45:30 PM -> 1:45 PM (en-US)

6/15/2009 1:45:30 PM -> 13:45 (hr-HR)

6/15/2009 1:45:30 PM -> 01:45 م (ar-EG)


"T"


完整時間模式。

詳細資訊:完整時間 ("T") 格式規範


6/15/2009 1:45:30 PM -> 1:45:30 PM (en-US)

6/15/2009 1:45:30 PM -> 13:45:30 (hr-HR)

6/15/2009 1:45:30 PM -> 01:45:30 م (ar-EG)


"u"


國際可排序日期/時間模式。

詳細資訊:國際可排序 ("u") 格式規範


6/15/2009 1:45:30 PM -> 2009-06-15 20:45:30Z


"U"


國際完整日期/時間模式。

詳細資訊:國際完整 ("U") 格式規範


6/15/2009 1:45:30 PM -> Monday, June 15, 2009 8:45:30 PM (en-US)

6/15/2009 1:45:30 PM -> den 15 juni 2009 20:45:30 (sv-SE)

6/15/2009 1:45:30 PM -> Δευτέρα, 15 Ιουνίου 2009 8:45:30 μμ (el-GR)


"Y", "y"


年月模式。

詳細資訊:年月 ("Y") 格式規範


6/15/2009 1:45:30 PM -> June, 2009 (en-US)

6/15/2009 1:45:30 PM -> juni 2009 (da-DK)

6/15/2009 1:45:30 PM -> Juni 2009 (id-ID)


 








































   建


   說


DateTime(Int64)


DateTime 類別的新執行個體初始化為刻度的指定數目。


DateTime(Int64, DateTimeKind)


DateTime 結構的新執行個體初始化為指定的刻度數以及 Coordinated Universal Time (UTC) 或本地時間。


DateTime(Int32, Int32, Int32)


DateTime 結構的新執行個體初始化為指定的年、月和日。


DateTime(Int32, Int32, Int32, Calendar)


DateTime 結構的新執行個體初始化為指定之月曆的指定之年、月和日。


DateTime(Int32, Int32, Int32, Int32, Int32, Int32)


DateTime 結構的新執行個體初始化為指定的年、月、日、時、分和秒。


DateTime(Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind)


DateTime 結構的新執行個體初始化為指定之年、月、日、時、分、秒以及 Coordinated Universal Time (UTC) 或本地時間。


DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Calendar)


DateTime 結構的新執行個體初始化為指定之月曆的指定之年、月、日、時、分和秒。


DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32)


DateTime 結構的新執行個體初始化為指定的年、月、日、時、分、秒和毫秒 (Millisecond)。


DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32, DateTimeKind)


DateTime 結構的新執行個體初始化為指定之年、月、日、時、分、秒、毫秒以及 Coordinated Universal Time (UTC) 或本地時間。


DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Calendar)


DateTime 結構的新執行個體初始化為指定之月曆的指定之年、月、日、時、分、秒和毫秒。


DateTime(Int32, Int32, Int32, Int32, Int32, Int32, Int32, Calendar, DateTimeKind)


DateTime 結構的新執行個體初始化為指定之日曆的指定之年、月、日、時、分、秒、毫秒以及 Coordinated Universal Time (UTC) 或本地時間。


 
























































屬性


  說       明


Date


取得這個執行個體的日期部分。


Day


取得由這個執行個體表示的月份天數。


DayOfWeek


取得由這個執行個體表示的一週天數。


DayOfYear


取得由這個執行個體表示的一年天數。


Hour


取得這個執行個體所表示日期的小時部分。


Kind


取得值,指出這個執行個體表示的時間是根據本地時間、Coordinated Universal Time (UTC),或兩者皆非。


Millisecond


取得這個執行個體所表示日期的毫秒部分。


Minute


取得這個執行個體所表示日期的分鐘部分。


Month


取得這個執行個體所表示日期的月份部分。


Now


取得 DateTime 物件,此物件會設定為這部電腦上目前的日期和時間,以本地時間表示。


Second


取得這個執行個體所表示日期的秒數部分。


Ticks


取得表示這個執行個體日期和時間的刻度數目。


TimeOfDay


取得這個執行個體的一天時間。


Today


取得目前的日期。


UtcNow


取得 DateTime 物件,此物件會設定為這部電腦上目前的日期和時間,以 Coordinated Universal Time (UTC) 表示。


Year


取得這個執行個體所表示日期的年份部分。


 


































  運


  說


Addition


將指定的時間間隔加上指定的日期和時間,產生新的日期和時間。


Equality


判斷 DateTime 的兩個指定之執行個體是否相等。


GreaterThan


判斷某個指定的 DateTime 是否大於另一個指定的 DateTime


GreaterThanOrEqual


判斷某個指定的 DateTime 是否大於或等於另一個指定的 DateTime


Inequality


判斷 DateTime 的兩個指定之執行個體是否不相等。


LessThan


判斷某個指定的 DateTime 是否小於另一個指定的 DateTime


LessThanOrEqual


判斷某個指定的 DateTime 是否小於或等於另一個指定的 DateTime


Subtraction(DateTime, DateTime)


將另一個指定的日期和時間減去指定的日期和時間,並傳回時間間隔。


Subtraction(DateTime, TimeSpan)


將指定的日期和時間減去指定的時間間隔,並傳回新的日期和時間。


 


資料參考來源 : MSDN http://msdn.microsoft.com/zh-tw/library/8kb3ddd4.aspx

2012年7月14日 星期六

List<T> 的擴充方法

擴充方法讓您能將方法「加入」至現有型別,而不需要建立新的衍生型別 (Derived Type)、重新編譯,或是修改原始型別。 擴充方法是一種特殊的靜態方法,但是需將它們當成擴充型別上的執行個體方法 (Instance Method) 來呼叫。 對於以 C# 和 Visual Basic 撰寫的用戶端程式碼,呼叫擴充方法或是在型別中實際定義的方法,兩者之間並沒有明顯的差別。

擴充方法的第一個參數指定方法進行作業的型別,而這個參數的前面需加上 this 修飾詞 (Modifier)。 使用 using 指示詞,將命名空間 (Namespace) 明確匯入至原始程式碼時,擴充方法才會進入範圍中。

 

下列範例是 List<T> 的擴充方法,可以將List<T> 轉成XML存檔,或由XML檔載入到List<T>中。

範例已經做過局部修改,原始來源 :  MVC 閒暇實作 [將 List<T> 儲存為DataSet 的XML]

 

該擴充方法僅能使用轉換基本型態,若有套疊的List<T>或 [],無法轉換。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Data;
using System.Reflection;
using System.IO;
 
namespace nmsEventLog.Extension
{    
    /// <summary>
    /// 資訊來源:http://www.dotblogs.com.tw/gelis/archive/2012/04/15/71535.aspx
    /// </summary>
    /// 
    /// 擴充方法必須定義為靜態方法,但使用執行個體方法語法進行呼叫。 
    /// 擴充方法的第一個參數指定方法進行作業的型別,而這個參數的前面需加上 this 修飾詞 (Modifier)。 
    /// 使用 using 指示詞,將命名空間 (Namespace) 明確匯入至原始程式碼時,擴充方法才會進入範圍中。 
    /// 
    public static class ListExtensionMethod
    {
        /// <summary>
        /// 將 List<T> 轉換為 DataSet 並存為XML檔案.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        public static int SaveToDisk<T>(this List<T> list, string XmlPath)
        { 
            int result = 0;
            DataTable dt = new DataTable();
            if (list.Count > 0)
            {
                Type obj = list.Take(1).Single().GetType();     //若有資料,
                PropertyInfo[] pInfo = obj.GetProperties();
                dt.TableName = obj.Name;
  
                foreach (PropertyInfo info in pInfo)
                {
                    if (info.MemberType == MemberTypes.Property)
                    {
                        dt.Columns.Add(new DataColumn(info.Name));
                    }
                }
            }
            else
                return result;
  
            foreach (var p in list)
            {
                PropertyInfo[] pPty = p.GetType().GetProperties();
  
                DataRow dr = dt.NewRow();
 
                foreach (PropertyInfo pp in pPty)
                {
                    if (pp.MemberType == MemberTypes.Property)
                    {        
                        dr[pp.Name] = pp.GetValue(p, null);
                    }
                }
                dt.Rows.Add(dr);
                result++;
            }
            dt.WriteXml(XmlPath);
  
            return result;
        }
  
        /// <summary>
        /// 從磁碟讀取 DataSet 的 XML 檔案.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        public static List<T> LoadFromDisk<T>(this List<T> list, string XmlPath)
        {
            List<T> t = new List<T>();
  
            DataSet ds = new DataSet();
            ds.ReadXml(XmlPath);
            DataTable dt = ds.Tables["ATable"]; 
            //dt.ReadXml(XmlPath);
            foreach (DataRow dr in dt.Rows)
            {
                T p = Activator.CreateInstance<T>();
                foreach(DataColumn col in dt.Columns)
                {
                    Type pType = p.GetType();
                    PropertyInfo pInfo = pType.GetProperty(col.ColumnName);
                    if (pInfo.PropertyType == typeof(System.Int32))
                    {
                        pInfo.SetValue(p, Convert.ToInt32(dr[col.ColumnName]), null);
                    }
                    else
                    {
                        pInfo.SetValue(p, dr[col.ColumnName], null);
                    }
                }
                t.Add(p);
            }
            return t;
        }
  }
 
}


 


實際調用注意:
1. using nmsEventLog.Extension;
2. public void xmlLoadGroupList() { GroupList.LoadFromDisk(Path.Combine(xmlPath,"xGroupList.xml")); }



using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ComponentModel;
using System.Net.NetworkInformation;
using System.Threading;
using System.Reflection;
using System.IO;
using System.Xml;
using nmsEventLog.Extension;
 
 
namespace NmsLogLog
{
    class nms
    {                
        /// <summary>
        /// 資料紀錄區
        /// </summary>
        #region < 資料紀錄區 >
        public List<NmsGroup> GroupList = new List<NmsGroup>();
        public List<NmsStation> StationList = new List<NmsStation>();
        public List<NmsDevice> DeviceList = new List<NmsDevice>();
        public List<NmsMessage> MsgList = new List<NmsMessage>();
        public List<NmsVar> VarList = new List<NmsVar>();
        public List<NmsLog> AlarmList = new List<NmsLog>();
        public List<NmsLog> HistoryList = new List<NmsLog>();
 
        #region <XmlDB Load & Save >
        private string sToday = DateTime.Today.ToString("yyy_MM_dd");
        public string xmlPath { get; set; }
        //..Load
        public void xmlLoadGroupList() { GroupList.LoadFromDisk(Path.Combine(xmlPath,"xGroupList.xml")); }
        public void xmlLoadStationList() { StationList.LoadFromDisk(Path.Combine(xmlPath, "xStationList.xml")); }
        public void xmlLoadDeviceList() { DeviceList.LoadFromDisk(Path.Combine(xmlPath, "xDeviceList.xml")); }
        public void xmlLoadMsgList() { MsgList.LoadFromDisk(Path.Combine(xmlPath, "xMsgList.xml")); }
        public void xmlLoadVarList() { VarList.LoadFromDisk(Path.Combine(xmlPath, "xNmsVar.xml")); }
        public void xmlLoadAlarmList() { AlarmList.LoadFromDisk(Path.Combine(xmlPath, "xAlarmList.xml")); }
        public void xmlLoadHistoryList() { HistoryList.LoadFromDisk(Path.Combine(xmlPath, string.Format("{0}_HistoryList", DateTime.Today.ToString()))); }
        //..Save
        public void xmlSaveGroupList() { GroupList.SaveToDisk(Path.Combine(xmlPath, "xGroupList.xml")); }
        public void xmlSaveStationList() { StationList.SaveToDisk(Path.Combine(xmlPath, "xStationList.xml")); }
        public void xmlSaveDeviceList() { DeviceList.SaveToDisk(Path.Combine(xmlPath, "xDeviceList.xml")); }
        public void xmlSaveMsgList() { MsgList.SaveToDisk(Path.Combine(xmlPath, "xMsgList.xml")); }
        public void xmlSaveVarList() { VarList.SaveToDisk(Path.Combine(xmlPath, "xNmsVar.xml")); }
        public void xmlSaveAlarmList() { AlarmList.SaveToDisk(Path.Combine(xmlPath, "Log", "xAlarmList.xml")); }
        public void xmlSaveHistoryList() { HistoryList.SaveToDisk(Path.Combine(xmlPath, "Log", string.Format("{0}_HistoryList.xml", sToday))); }
 
        #endregion // <XmlDB Load & Save >
        #endregion //< 資料紀錄區 >
    }
}