2010年11月19日 星期五

[c#]設定檔 config 的使用(2)

前一篇說到使用 dataset 當做工具來讀取設定。
另外一個是開發的時候,在專案中加入 App.config 這個檔案。

我先用 winform 專案來解釋。

要記得將 System.configuration 加入專案參考中。
如此就會有神奇工具可以用,就是

System.Configuration.ConfigurationManager

只要將 App.config 裡面內容填入

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
  <add key="source1" value="appsetting.release.config" />
  <add key="source2" value="appsetting.dev.config" />
  <add key="target" value="appsetting.config" />
</appSettings>
</configuration>

以下神奇工具的使用就會得到上面紅色的字!

string f1 = System.Configuration.ConfigurationManager.AppSettings["source1"];

也就是 /configuration/appSettings/add 元素的 key / value 在操作。
如果 key 不存在的話,會回傳 null 。

當你建置這個專案,執行檔執行的時候,並不是把 App.config 這個檔案當做設定檔來讀,而是「執行檔名稱.exe.config」。例如某個執行檔名字是「MyFirstExe.exe」,設定檔名字就是「MyFirstExe.exe.config」。

所以你的執行檔在發佈的時候,記得要帶著「執行檔名稱.exe.config」一起發佈。

還有類似的神奇工具在其他種類的專案中,下次再研究。

2010年11月14日 星期日

[c#]設定檔 config 的使用 (1)

從 vb6 時代,用慣了 ini,就算換到了點網時代,也還是用 ini。
不想換的原因也很簡單,就是懶得再去搞定那些已經寫好的設定檔讀取的舊程式碼。

其實,現在的點網好心的給我們一些功能,所以可以輕鬆使用 xml 當做設定檔。現在有兩招,第一招是同事發現的:

(1)用 dataset 當做操作者:
首先把設定檔寫好如下

<Setting>
  <SetPath>
    <Test1>C:\Test</Test1>
    <Test2>D:\Test</Test2>
    <Test3>E:\Test</Test3>
    <Test4>F:\Test</Test4>
  </SetPath>
</Setting>

取值的 function 如下,可以拿到 Test3 的值 E:\Test

DataSet ds = new DataSet();
ds.ReadXml(pathToXmlSetting);
if (ds.Tables["SetPath"].Rows.Count > 0)
  return ds.Tables["SetPath"].Rows[0]["Test3"].ToString().Trim();
else
  return "";

會這樣寫是要避開設定檔沒寫好的防呆措施。

2010年11月5日 星期五

[google]google I/O

以前只看名字,以為這是 google 對於 I/O 的一些軟體。
我大錯特錯。
原來這是 google 舉辦的 conference 的名字。
在這個 conference 裡,介紹 google 的成果,推廣他們開發工具,推廣他們的應用產品,推廣他們對於網路的理念。
我仍然很佩服他們能把商業做得這麼不露痕跡。
尤其我經歷過搜尋網站把網站排名秤斤論兩的販賣的年代,我因為它總是給我大家所認為對的資料,而不是花錢買曝光率的網站而一直用到現在。
他們維持著給與使用者想要的資料的原則,並且努力著提供好用的平台,降低門檻讓每個人都能成為內容的提供者,而不惜花大錢投資研究或買下其他公司。
是的,當然有可能這樣的公司會做壞事。希望他們能堅持下去。
離題了。
這個 conference 的影片我正在消化中,最讓我印象深刻的是 2009 送與會者手機,2010 也送與會者手機。好想參加啊,不曉得要不要錢?

2010年11月4日 星期四

[aspnet]按下按鈕後,出現下載視窗

這是常常看到的功能,但是我就是花了一、兩個小時在試它。

protected void Button1_Click(object sender, EventArgs e)
{
    Response.ContentType = "text/xml";
    Response.AppendHeader("Content-Disposition", "attachment; filename=newfile.xml");
    Response.TransmitFile(Server.MapPath(@"App_Data\" + "newfile.xml"));
    Response.End();
}

以上的程式是把網站中,存在的檔案送出去。

protected void Button1_Click(object sender, EventArgs e)
{
    Response.ContentType = "text/xml";
    Response.AppendHeader("Content-Disposition", "attachment; filename=newfile.xml");
    Response.BinaryWrite(System.Text.Encoding.UTF8.GetBytes("text test"));
    Response.End();
}

而以上的程式是把網站中,已知的字串用UTF-8編碼當做XML檔案送出去。

兩個程式裡,只要走到Response.End();就離開了。在後面寫什麼程式都執行不到。

2010年10月27日 星期三

[excel][access]excel抓access資料

工作上難免收到 access 的資料庫,要把部份資料抓進來。不要說用人工處理成千上萬筆的資料很痛苦,就連一兩百筆資料要核對就夠累人了。

打開 excel 然後,進到俗稱 VBA 編輯器去,在
工具>>設定引用項目

Microsoft ActiveX Data Objects 6.0 Library
勾起來。是的,我要用 ADO。

首先建立 connection
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & AccessFileFullPath & ";")

再來開啟 Recordset
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "select * from mytable", cn, adOpenStatic, adLockReadOnly

接下來把資料帶出來,最簡單循序的方法如下,每一個 recordset 可以用 index 取該 column 的值,或用 column name 來取值。
Do While rs.EOF = False
iid = rs(0).Value
sname = rs("CityName").Value
rs.MoveNext
Loop

至於 recordset 開啟時的參數有何不同功效,有待改日或高人指點。

2010年10月21日 星期四

[webdav]可惜有限制

原本打算,有了webdav,就可以把網路芳鄰給丟到一邊了。因為這兩個看起來功能真的都一樣,而且好像webdav還可以支援到外部ip,不是很讚嗎?

不過,我遇到一個限制,就是單一檔案傳送,不能超過2G,現在很多好看的檔案都超過2G,叫我怎麼辦呢?

不曉得這個限制是我設定的問題還是apache webdav在compile設參數的問題,亦或是spec天生的限制。

之前看設定檔上面寫LimitXMLRequestBody最大值是2G,我也試過0,也是失敗。

[xml]xml formatter

常常遇到別人寄來的xml沒有縮排,因為都是用機器產生的。
如果要看,雖然可以用瀏覽器來看,但是要手動改幾個內容,還是會找不到位置。
隨手用dot net寫一個,自己用一用,記錄下來以免忘了。

xdoc = new XmlDocument();
xdoc.Load(inputname);
XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;
xws.Encoding = System.Text.Encoding.UTF8;
XmlWriter xw = XmlWriter.Create(outputname, xws);
xdoc.WriteTo(xw);
xw.Flush();
xw.Close();

就這幾行,把inputname及outputname指定了,就搞定了。