2012年1月31日 星期二

SQL 一秒看破 T - SQL 動態條件查詢

相信很多人有這種經驗

一個複雜的查詢 讓使用者很彈性 讓程式設計師很痛苦

你想要給人查 1.商品符合關鍵字 2.價錢介於範圍值 3.產品種類的限制 4.人氣 5.庫存 ... 等條件

簡單,你爺爺我會 T - SQL,就一項條件寫一個 Where ... and ... and ... and ... and ... and ...

判斷的方式用 C嚇 IF ELSE 就搞定了呀

code大概會長這樣

但是芳芳說:自己codeing寫一堆,麻煩做,聰明小孩就交給微軟 xxxTableAdapter 兩行就搞定了

既是強型別,又能直接造方法

但是查詢方法一種要造一個方法來查

 

 

 

 

以下正題。

其實沒那麼恐怖,T - SQL就能搞定,只要寫一個方法

 

 

 

 

先實驗T - SQL



DECLARE @uid int, @rank_id int, @bonus int, @bonusMoreThen int
DECLARE @account nchar(20), @password nchar(20)
DECLARE @email nchar(50), @name nvarchar(50), @nickname nvarchar(50), @phone nvarchar(50), @residence nvarchar(50)
DECLARE @date datetime, @birthday date
DECLARE @gender bit, @employee bit

set @uid = null
set @rank_id = null
set @bonus = null --123
set @bonusMoreThen = null --500

set @account = null
set @password = null

set @email = null
set @name = null
set @nickname = null
set @phone = null
set @residence = null

set @date = null
set @birthday = null

set @gender = null
set @employee = null

select * from account 
where rank_id = IsNull(@rank_id,rank_id)
and bonus = IsNull(@bonus,bonus)
and bonus > IsNull(@bonusMoreThen,1)

and account = IsNull(@account,account)
and password = IsNull(@password,password)

and email = IsNull(@email,email)
and name = IsNull(@name,name)
and nickname = IsNull(@nickname,nickname)
and phone = IsNull(@phone,phone)
and residence = IsNull(@residence,residence)

and date = IsNull(@date,date)
and birthday = IsNull(@birthday,birthday)

and gender = IsNull(@gender,gender)
and employee = IsNull(@employee,employee)


前大半是宣告參數不用管,後面是把14個條件都寫出來

最神奇的是使用了 IsNull()函數

IsNull()函數 接受2個參數,當第一個參數不為Null時 使用第一個參數,當第一個參數為Null時 使用第二個參數

參數不為Null就像是使用者選定了條件來查詢,所以 Where 欄位 = 參數 來查詢特定條件

參數為Null就像是使用者沒給條件就查詢,所以 Where 欄位 = 欄位

這是什麼意思呢,舉例來說就像是 Where 1 = 1 等於這個條件恆為真,所以會查到所有的資料

也可以理解成 Where 欄位 = 任意值 (因為 目前查詢到的值 等於 目前查詢到的值 ex:Where account = account)

因為預設沒設定參數就是不管這行條件,所以讓這行恆為真,再加上所有條件是以AND串連,就等於不管這行條件的意思

 

 

 

 

然後是TableAdapter查詢組態精靈裡面的語法

不用管變數宣告了 微軟幫你搞定了 真那麼好奇可以移至定義 (人生在世不需要什麼都知道)

 

 

 

 

好啦,大成功

以上

2012年1月20日 星期五

Miss Lin & Billy & 三位豪朋友 No4.紀錄

在與老師討論,以及之後小組討論過後,果然不出所料,做了許多改變,在此加以記錄。

 

 

1. 關於命名

由於老師指出,我們專題其實是投資理財方向,而非焦點在股票上,故建議更名,

初步討論過後,目前暫定為:

金融門將 - Finance Keeper

 

 

2. 關於專題方向

原先是以網站取向的專題,目前改成以軟體取向

預計開發一個功能強大的理財分析應用程式,在網站上得以販售

另外還預計能以插件的形式販售其他輔助小工具,來使主程式的價值得以附加延長

網站的部分則以介紹該軟體和理財相關資訊為主,當然網站本身也有相應的後台管理程式

 

 

3. 未來一周的規劃

不在何日就在今天,比利先生見識到 chart 和 linq 的強大威力,被其震懾的五體投地,發誓這周不將這兩項武器研究的出神入化,就要每人發紅包

沒有意外的話這周會完成網站的後台程式,主要的部分,小弟不才上課沒在上課在想專題的時候已經完成大半

剩下的部分待各員將自己主要負責區塊的 查詢 新增 修改 刪除 等ADO.NET 細目補完

持續以航空母艦式的模式進行專題(註)

各員已有聯絡方式等資料,必要時以Skype輔以Teamviewer進行遠端視訊會議

有需要找小弟的話FB MSN Skype等處 留言 或 訊息 都會予以回覆


另外,資料庫砍掉重練大改,如下圖

2012年1月18日 星期三

ADO.NET 關於bindingSource

這是一個蠢問題

但是卻是困擾數天的問題-.-

照慣例瞎打,很直覺DataSource配DataSource,很直覺

為什麼這個該死的Navigator不能往下!!!

雖然是雞肋功能,但是我叫程式走直線,豈能讓他橫著走

原來這是個陷阱 -.- 而且竟然都沒有出錯的紅毛蟲

2012年1月15日 星期日

AttachDbFileName - 使用相對路徑


AttachDbFileName - 使用相對路徑
專案中用一個帶著走的DB,在connection string 的attachdbfilename 需要用|DataDirectory|表示是對應到該專案的目錄下,但如果專案不是web 呢?查證之後如下

App.config 對應專案的Bin 資料夾下。

Web.config 對應App_Data 資料夾下。

範例如下

data source=.\SQLEXPRESS;attachdbfilename=|DataDirectory|\DB\tTest.mdf;integrated security=True;user instance=True;

2012年1月8日 星期日

Miss Lin & Billy & 三位豪朋友 No2.紀錄

專題題目:
股懂玩家–理財資訊網

專題大綱:
1. 後端應用程式特色:自動化與流暢化
● 財務資料庫可與公開資訊觀測站同步更新。
● 可自定義操作面板。
● 以最少的控制項完成操作。
● 簡化操作快速編輯。
2. 前端網站特色:
● 數據圖表視覺化。
● 個人化的會員功能。
● 財經情報資訊多元匯流整合。
● 強化商城交易流程。
● 強化論壇互動功能。

功能: Window平台管理系統功能
1. 會員及員工資料管理維護。
2. 財務數據建檔自動化(直接抓取政府機構網頁直接寫入資料庫)。
3. 商城商品管理維護。
4. 論壇與情報資訊管理維護。
5. 進階查詢(智慧查詢系統)。
6. 網站流量統計&數據管理分析(圖表輔助)。 Web服務功能
1. 圖表大師:財務數據圖表化
● 依查詢條件將數據轉圖表。
2. 決策大師:交易策略統計客觀化
● 提供歷史資訊回測參考。
● 會員虛擬交易功能。
3. 情報大師:有用資訊即時化
● 政府資訊即時專區。
● 金融機構資訊專區。
● 部落客資訊專區。
● 管理者發文區。
4. 投資論壇:彈性化的言論自由區
● 多層次論壇(文章+回覆+留言)。
● 強化檢索功能。
5. 購物商城
● 數位化、影音化及週邊商品。
● 二手以物易物平台。

SWTO分析
優勢(Strengths)
(1) 對軟體開發具有高度熱誠與理想性。
(2) 背後擁有資策會強大師資與最新技術資源。
劣勢(Weakness)
(1) 專業技術能力尚嫌不足。
(2) 對程式以外的金融知識有待累積。
機會(Opportunities)
(1) 市場目前無同質產品競爭。
威脅(Threats)
(1) 市場接受度待考驗。

成 員 組長:魏功豪 組員:林秀娟、游適豪、張家豪、莊宏儒

2012年1月7日 星期六

C# 皮克丘霸克斯的移動

繼上次我"意思到了"做出龍抓手游標之後

"我期待"能移動pictureBox了

今次終於動了

而且簡單到匪夷所思


http://www.youtube.com/watch?v=o0Wvn-9BXVc

截圖老半天游標都無法入鏡 而且也沒法表現出真的能"動" 只好祭出HTC的蒐證功能


 private MouseEventArgs MouseStartPos = null;
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
            if (e.Button == MouseButtons.Left) {
                MouseStartPos = e;
                pictureBox1.Cursor = new Cursor(new Bitmap(Resources.Catch).GetHicon());
            }
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e) {
            pictureBox1.Cursor = new Cursor(new Bitmap(Resources.Palm).GetHicon());
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {                
            if (pictureBox1.Capture && e.Button == MouseButtons.Left) {
                pictureBox1.Top = e.Y + pictureBox1.Location.Y - MouseStartPos.Y;
                pictureBox1.Left = e.X + pictureBox1.Location.X - MouseStartPos.X;
                pictureBox1.Cursor = new Cursor(new Bitmap(Resources.Catch).GetHicon());
            }
        }


pictureBox1.Cursor = new Cursor(new Bitmap(Resources.Catch).GetHicon())

是將資源裡的圖片轉換成滑鼠遊標的意思

2012年1月5日 星期四

Miss Lin & Billy & 三位豪朋友 No1.紀錄

1. 決定方向及主題

  • 投資理財網

2. 觀察現況和既有問題

  • 持續進行

3. 構思可能可行性的功能(For DB設計)

  • 持續進行 DB設計完成前要完成主要功能的決定

4. 版型 介面 UI 收集參考

  • 持續進行

5. 專題的進行模式

  • 航空母艦式(註1)

單體
  1. 收集資訊(繁雜 基礎的 元素收集)
  2. 個人構想(靈感 天馬行空 點子)
  3. 階段任務進行(依照討論後的指派)
       ↑
反覆討論
       ↓

團體
  1. 整合歸納 {個人構想(靈感 天馬行空 點子) +  收集資訊(繁雜 基礎的 元素收集) }
  2. 檢視進度 {個人 階段任務進行程度}
  3. 篩選意見決定方向
  4. 任務指派

註1:

航空母艦式如圖演示

單體為小飛機 範圍廣布 快速 機動 靈活 (多元意見的源頭)

團體為航空母艦 具有明確方向性 整體大而穩固的架構 具力量性 威脅性 壓迫眾生

2012年1月2日 星期一

使用者都是白癡嗎為什麼我每次都要驗證textbox的值是不是整數或者有沒有超出範圍之寫個一勞永逸的類別

相信很多人在做作業時心中都有如標題

身為城市人不走鄉民路,用程式的方法一勞永逸

 

 

 

 

 

 

 

 

使用方法:

把doVerification.cs丟進專案

並且using CustomClass 就能直接使用

doVerification.doRegex()

doVerification.doRange()

這2個方法

方法需要的參數如說明

1:using CustomClass
doVerification.doRegex()需要2個參數
2:判斷的目標 型態為 string
3:驗證的方式 型態為列舉
	pattern.isPositiveInteger  //匹配正整數
	pattern.isNegativeInteger  //匹配負整數
	pattern.isInteger          //匹配整數
	pattern.NonNegativeInteger //匹配非負整數(正整數 + 0)
	pattern.NonPositiveInteger //匹配非正整數(負整數 + 0)
doVerification.doRange()需要5個參數
4:判斷的目標 型態為 string
5:起點值 型態為 int
6:目標是與起點的關係 型態為列舉
	isMoreThan                 //大於
	isMoreThanOrEqualTo        //大於等於
7:終點值 型態為 int
8:目標是與終點的關係 型態為列舉
	isLessThan                 //小於
	isLessThanOrEqualTo        //小於等於

使用結果:

abc警告非整數

-5不合範圍

5合範圍

 

 

如此一來以後只要面對要判斷textbox.Text是否數字且在範圍內的時候

就只要使用這2個方法而不必每次都再寫一遍

 

 

 

 

以下為程式碼

 

 

 

 



using System.Text.RegularExpressions;
using System.Text;
using System.Windows.Forms;

namespace CustomClass {
    public enum pattern {
        isPositiveInteger,
        isNegativeInteger,
        isInteger,
        NonNegativeInteger,
        NonPositiveInteger
    }
    public enum startType {
        isMoreThan,        
        isMoreThanOrEqualTo        
    }
    public enum endType {
        isLessThan,
        isLessThanOrEqualTo
    }    
    public class doVerification {
        public const string isPositiveInteger = @"^[1-9]\d*$";   //匹配正整數
        public const string isNegativeInteger = @"^-[1-9]\d*$";  //匹配負整數
        public const string isInteger = @"^-?[1-9]\d*|0$";         //匹配整數
        public const string NonNegativeInteger = @"^[1-9]\d*|0$";//匹配非負整數(正整數 + 0)
        public const string NonPositiveInteger = @"^-[1-9]\d*|0$";//匹配非正整數(負整數 + 0

        public static bool doRegex(string target, pattern pat) {
            string patternStr;
            switch (pat) {
                case pattern.isPositiveInteger:
                    patternStr = isPositiveInteger;
                    break;
                case pattern.isNegativeInteger:
                    patternStr = isNegativeInteger;
                    break;
                case pattern.isInteger:
                    patternStr = isInteger;
                    break;
                case pattern.NonNegativeInteger:
                    patternStr = NonNegativeInteger;
                    break;
                case pattern.NonPositiveInteger:
                    patternStr = NonPositiveInteger;
                    break;
                default:
                    patternStr = isInteger;
                    break;
            }
            Regex regex = new Regex(patternStr);
            return regex.IsMatch(target);
        }

        public static bool doRange(string target, int start, startType st, int end, endType et) {
            if (st == startType.isMoreThanOrEqualTo && et == endType.isLessThanOrEqualTo) {
                if (int.Parse(target) >= start && int.Parse(target) <= end) {
                    return true;
                } else {
                    return false;
                }
            }
            if (st == startType.isMoreThan && et == endType.isLessThan) {
                if (int.Parse(target) > start && int.Parse(target) < end) {
                    return true;
                } else {
                    return false;
                }
            }
            if (st == startType.isMoreThanOrEqualTo && et == endType.isLessThan) {
                if (int.Parse(target) >= start && int.Parse(target) < end) {
                    return true;
                } else {
                    return false;
                }
            }
            if (st == startType.isMoreThan && et == endType.isLessThanOrEqualTo) {
                if (int.Parse(target) > start && int.Parse(target) <= end) {
                    return true;
                } else {
                    return false;
                }
            }
            return false;                
        }
    }
}




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 CustomClass;            //引用自訂類別

namespace MyHomework._0102 {
    public partial class FrmTest : Form {
        public FrmTest() {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e) {
            int start = 0;
            int end = 10;
            bool isPositiveInteger = doVerification.doRegex(textBox1.Text, pattern.isInteger);
           
            if (isPositiveInteger) {
                if (doVerification.doRange(textBox1.Text, start, startType.isMoreThanOrEqualTo, end, endType.isLessThanOrEqualTo)) {
                    MessageBox.Show(string.Format("{0} < {1} <= {2} 為 True", start, textBox1.Text, end));
                } else {
                    MessageBox.Show(string.Format("{0} < {1} <= {2} 為 False", start, textBox1.Text, end));
                }
            } else {
                MessageBox.Show("is not Integer");
            }
        }
    }
}