搜尋此網誌

2014年10月22日 星期三

如何過濾及排序DataTable並複製到新的DataTable

1.前言
將DataTable經由過濾,排序得到新的資料表。

2.說明
提供兩個方法,一種是將DataTable轉成DataView,利用DataView的RowFilter及Sort方法得到所需資料,然後再將DataView轉成DataTable。
另一種方法是利用DataTable.Select().CopyToDataTable()方式得到資料表。

private DataTable DataTableFilterSort(DataTable oTable, string filterExpression, string sortExpression)
{
    DataView dv = new DataView();
    dv.Table = oTable;
    dv.RowFilter = filterExpression;
    dv.Sort = sortExpression;
    DataTable nTable = dv.ToTable();
    return nTable;
}

private DataTable DataTableFilterSort(DataTable oTable, string filterExpression, string sortExpression)
{
    DataTable nTable = oTable.Select(filterExpression, sortExpression).CopyToDataTable();
    return nTable;
}

3.應用

DataTable oTable = GetDataTable("cars");
DataTable nTable = DataTableFilterSort(oTable, "SPEED='10'", "DIST asc");
dataGridView1.DataSource = nTable;

2014年10月20日 星期一

判斷字串中是否有中文字

Demo Code Ver. :.NET Framework 4.0

最近做一個小功能,要判斷傳入字串是否含有中文,再作後續的動作。這邊記錄判斷邏輯的寫法,程式的邏輯

為當傳入參數只要是字串中有任何一個中文字都會回傳True

謝謝Allen kuo指正,小弟這邊有一個地方沒有考慮到,應該還要多考慮一個中文的Unicode範圍,這樣才會精準

Unicode字元範圍

3400~4DFFh:中日韓認同表意文字擴充A區,總計收容6,582個中日韓漢字。
4E00~9FFFh:中日韓認同表意文字區,總計收容20,902個中日韓漢字。
A000~A4FFh:彝族文字區,收容中國南方彝族文字和字根。
AC00~D7FFh:韓文拼音組合字區,收容以韓文音符拼成的文字。
F900~FAFFh:中日韓兼容表意文字區,總計收容302個中日韓漢字。
FB00~FFFDh:文字表現形式區,收容組合拉丁文字、希伯來文、阿拉伯文、中日韓直式標點、小符號、半角符號、全角符號等。

public static bool isChinese(string strChinese)
{
    bool bresult = true;
    int dRange = 0;
    int dstringmax=Convert.ToInt32("9fff", 16);
    int dstringmin=Convert.ToInt32("4e00", 16);
    for (int i = 0; i < strChinese.Length; i++)
    {
        dRange = Convert.ToInt32(Convert.ToChar(strChinese.Substring(i, 1)));
        if (dRange >= dstringmin && dRange <dstringmax )
        {
            bresult = true;
  break;
        }
        else
        {
            bresult = false;
        }
    }

    return bresult;
}

驗證結果程式

Console.WriteLine(isChinese("中文").ToString());
Console.WriteLine(isChinese("Chinese").ToString());

Console.WriteLine(isChinese("AA中").ToString());



必須要考慮到unicode範圍才會正確





2014年10月19日 星期日

C# 讀取和寫入.TXT

進行寫入動作

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        // Create an instance of StreamWriter to write text to a file.
        // The using statement also closes the StreamWriter.
        using (StreamWriter sw = new StreamWriter("TestFile.TXT"))   //小寫TXT    
        {
            // Add some text to the file.
            sw.Write("This is the ");
            sw.WriteLine("header for the file.");
            sw.WriteLine("-------------------");
            // Arbitrary objects can also be written to the file.
            sw.Write("The date is: ");
            sw.WriteLine(DateTime.Now);
        }
    }
}

讀取動作

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        try { // Create an instance of StreamReader to read from a file.
            // The using statement also closes the StreamReader.
            using (StreamReader sr = new StreamReader("TestFile.TXT"))     //小寫TXT
            {
                String line;
                // Read and display lines from the file until the end of
                // the file is reached.
                while ((line = sr.ReadLine()) != null)
                {
                    Console.WriteLine(line);
                }
            }
        }
        catch (Exception e)
        {
            // Let the user know what went wrong.
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }
    }
}

CLR在過去60秒一直無法從COM內容

原因為程式碼有大量的迴圈運算

因此編譯器"提醒"說會長時間沒有回應(因為要算很久)

按下"繼續"即可

或是想將ContextSwitchDeadlock的提醒關掉

可以從 偵錯(D) > 例外狀況(X) > Managed Debugging Assistants

將 ContextSwitchDeadlock 的勾勾去掉


2014年10月17日 星期五

[C#] 計算字串的長度方式

怕之後年紀大會忘記,趕緊記下來先
.NET Framework 中有內建類別(Encoding )取得字串的長度 
想要取得字串中是否含有中文字串的實際長度,有下列作法
Ⅰ、Length:取得目前 String 物件中字元的數目,僅計算字串長度(中文 2 byte,英文 1 byte)
Ⅱ、GetByteCount:計算編碼一組字元所產生的位元組數目(判斷多少位元組會編碼一組 Unicode 字元)
Ⅲ、GetBytes:計算解碼位元組序列所產生的字元數目(執行實際的編碼作業)
PS:記得先參考 System.Text
《範例》

string myString = "讓你媽媽NEW一下";
// Length
Response.Write("Length:" + myString.Length);

// GetByteCount:使用目前系統的編碼方式
Response.Write("GetByteCount:" + Encoding.Default.GetByteCount(myString));

// GetBytes
Response.Write("GetBytes:" + Encoding.Default.GetBytes(myString).Length.ToString());

int myStringCount = 0;
for (int i = 0; i < myString.Length; i++)
{
  byte[] tIntByte = Encoding.Default.GetBytes(myTextBoxText.Substring(i, 1));
                
  // 中文字
  if (tIntByte.Length == 2)
  {
    //To Do Something
  }

  myStringCount += tIntByte.Length;
}
Response.Write("GetBytes(FOR):" + myStringCount.ToString());

《結果》
另外需要注意的一點,如果你是使用 GetBytes 計算字串長度的話
需要注意網頁編碼的方式,有可能因為編碼方式的不同,使用 GetBytes 時會有不同的結果
所以如果取得的字串長度跟你想像中的有差異,可以檢查看看網頁編碼的方式喔!
《範例》
Response.Write("GetBytes(big5):" + Encoding.GetEncoding("big5").GetBytes(myString).Length.ToString());
Response.Write("GetBytes(utf-8):" + Encoding.GetEncoding("utf-8").GetBytes(myString).Length.ToString());
《結果》

2014年10月16日 星期四

全形半形轉換

///<summary>
///字串轉全形
///</summary>
///<param name="input">任一字元串</param>
///<returns>全形字元串</returns>
private static string ToWide(string input)
{
    //半形轉全形:
    char[] c = input.ToCharArray();
    for (int i = 0; i < c.Length; i++)
    {
        //全形空格為12288,半形空格為32
        if (c[i] == 32)
        {
            c[i] = (char)12288;
            continue;
        }
        //其他字元半形(33-126)與全形(65281-65374)的對應關係是:均相差65248
        if (c[i] < 127)
            c[i] = (char)(c[i] + 65248);
    }
    return new string(c);
}

///<summary>
///字串轉半形
///</summary>
///<paramname="input">任一字元串</param>
///<returns>半形字元串</returns>
private static string ToNarrow(string input)
{
    char[] c = input.ToCharArray();
    for (int i = 0; i < c.Length; i++)
    {
        if (c[i] == 12288)
        {
            c[i] = (char)32;
            continue;
        }
        if (c[i] > 65280 && c[i] < 65375)
            c[i] = (char)(c[i] - 65248);
    }
    return new string(c);
}

2014年10月8日 星期三

[Oracle] PL/SQL 的常用函數

nvl(expr1,expr2) - 檢查null,回傳參數1 or 2
ex: select nvl('a','b') from dual  ==> a
      select nvl(null,'b') from dual  ==> b

to_number(string1) - 轉換文字型態為數字(varchar to number)
ex: select to_number('234') from dual  ==> 234

to_date(string1,[foramt_mark],[nls_language]) - 轉換文字型態為日期格式(varchar to date)
ex: to_date('2009/07/09', 'yyyy/mm/dd') ==> 2009/7/9
      to_date('20090709', 'yyyymmdd') ==> 2009/7/9
      to_date('200907'),'yyyymm') ==> 2009/7/1

last_day(date1) - 日期月份的最後一天
ex: select last_day(sysdate) from dual ==> 月底,系統本月的最後一天
      select last_day(add_months(sysdate,1)) from dual ==> 下個月月底
      select last_day(sysdate)+1 from dual ==> 下個月1號

decode(條件, 條件1, 結果1, [條件2, 結果2]... [, default] ) - 條件等於條件1則傳回結果1,條件2則結果2,類似MSSQL 的 Case When應用。
ex:  select decode('C','a1','a2','b1','b2','c1') from dual ==> c1
       UPDATE UPDDATE= decode(PRICE,InputPRICE,UPDDATE,SYSDATE) ==> 我常用的語法,當輸入價格不同時,才更新Update

cast(column_name as DataType) - 變更欄位資料型態與長度
ex:  select cast('1000' as number) from dual
       select cast('abc' as varchar2(100)) from dual

instr(string1,string2) - 查詢字串位置
ex: select INSTR('aaabbbcdddeee','c') from dual ==> 7

2014年10月1日 星期三

賦予table使用者權限

grant select,insert,update,delete on paysys.payccs1 to paysys_role;

create synonym pay.payccs1 for paysys.payccs1;