2014年12月8日 星期一

「C#」C#連接Postgresql




C#連接Postgresql 需要額外的Npgsql 幫忙。以下是Npgsql的簡介取自其官網。

Npgsql  is a .Net Data Provider for Postgresql. It allows any program developed for .Net framework to access database server. It is implemented in 100% C# code. Works with Postgresql 9.x and above.

中文翻譯如下(小弟自翻):

Npgsql是一個.Net的Postgresql資料供應器。它充許任何以.NET Framework開發的程式來存取Postgresql資料庫系統。它的原始碼100%由C#實作。支援PostgreSQL 9.x以上的版本。



一、首先請到官網下載Npgsql,但請注意您所運作的.NET Framework 版本。如下所示

net20 表示.NET Framework 2.0  ,

net35表示.NET Framework 3.5

net40表示 .NET Framework 4.0

net45表示.NET Framework 4.5





































如果不確定目標Framework.可以用此方式查看,首先在Properties 點二下。















接下來會出現以下畫面,注意目標Framework的地方。







二、解壓縮zip (在本篇我選用4.0)






















三、在Visual Studio中加入參考


左邊選擇瀏覽




















點擇下圖中的二個檔案即可。



























成功參考後會出現剛才加入的二個dll檔案。






四、連接範例程式碼如下

首先要記得Using Npgsql的東西進來

using Npgsql;
接下來說明連接字串所表示的意義
Server=您的IP;Port=5432;User Id=使用者名稱;Password=使用者密碼;Database=要連接的資料庫;
最後是完整的程式碼─讀取Demo資料庫中的shop_sale資料表。
NpgsqlConnection conn = 
    new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=user;Password=1234;Database=Demo;");
conn.Open();

NpgsqlCommand command = 
    new NpgsqlCommand("select * from shop_sale", conn);
          
try
{
    NpgsqlDataReader reader = command.ExecuteReader();

    while (reader.Read())
    {
        string shop = reader["shop"].ToString(); ;
        string no = reader["no"].ToString(); ;

        Console.WriteLine(shop + "\t" + no);
    }
}

finally
{
    conn.Close();
}
想知道更詳細的內容,請參考這個網址

2014年12月7日 星期日

「C#」DataView.RowFilter 特殊字元處裡

最近在使用C#的DataView.RowFilter過濾姓名時遇到特殊字元的問題,以下做個筆記.
由於個資法上路了,常常會見到姓名被保護成張*豐或是劉O華之類的情況.

今天如果我要找出陳*的姓名,一開始如此這樣寫:

DataView.RowFilter="name Like '陳*%' " . 

當然會GG啦,不能用*在Filter中,據GOOGLE大神告知我,你必須要寫成。

DataView.RowFilter="name Like '陳[*]%' " .

這樣就可以順利過濾出陳* 開頭的名字。

有興趣的朋友可以參照這個網址,裡面寫的很清楚。

DataView RowFilter Syntax [C#]


經過測試後發現,只有 like 才會需要把* 替換成 [*] ,= 或 <> 其實可以直接用 陳* 查詢。





2014年12月4日 星期四

[Postgresql] 用2個PK來避免有相同組合


如果今天我們我一張表格要紀錄每一間店的銷售以及店號,要避免重覆的情況發生。我們可以利用以下語法建立表格,限制no以及shop 的組合不能重覆。

CREATE TABLE shop_sale

(

  id serial NOT NULL,

  no character(10) NOT NULL,

  shop character(10) NOT NULL,

  edittime time without time zone,

  CONSTRAINT demo_pkey PRIMARY KEY (no,shop )

)


今天我們新增二筆A001店的交易,是OK的。
INSERT INTO shop_sale(
             no, shop, edittime)
    VALUES ('1031204001', 'A001', statement_timestamp());


INSERT INTO shop_sale(
             no, shop, edittime)
    VALUES ('1031204002', 'A001', statement_timestamp());
接下來我們新增二筆A002店的交易,也是OK的。
INSERT INTO shop_sale(
             no, shop, edittime)
    VALUES ('1031204001', 'A002', statement_timestamp());


INSERT INTO shop_sale(
             no, shop, edittime)
    VALUES ('1031204002', 'A002', statement_timestamp());
接下來我們意外再次新增一筆A002店的1031204001交易,就會出現錯誤了。



錯誤: 重複的鍵值違反唯一限制 "demo_pkey"

DETAIL: Key "(no, shop)=(1031204002, A002 )" 已存在

********** Error **********

錯誤: 重複的鍵值違反唯一限制 "demo_pkey"

SQL state: 23505

Detail: Key "(no, shop)=(1031204002, A002 )" 已存在