2014年1月27日 星期一

【指令】讓代理程式在Server上跑

tell amgr run "資料庫路徑" '代理程式名稱'

資料庫路徑:用雙引號包起來。

代理程式名稱:不能用雙引號,如果有(),也不能加上去。

2014年1月26日 星期日

MySql的Foreign Key

當關聯父資料表的主鍵紀錄行被刪除或修改時,子資料表中紀錄行的處理方式:
CASCADE - 會將有所關聯的紀錄行也會進行刪除或修改。
SET NULL - 會將有所關聯的紀錄行設定成 NULL。
NO ACTION - 有存在的關聯紀錄行時,會禁止父資料表的刪除或修改動作。
RESTRICT - 與 NO ACTION 相同。


參考網站:http://jax-work-archive.blogspot.tw/2007/10/innodb-mysql-foreign-key.html

2014年1月17日 星期五

使用Font類繪製文本(DrawString())

參考連結至:

http://blog.csdn.net/wwwiii520/article/details/2072010

利用Font的類別來定義文的的大小、樣式。

代碼如下:

public partial class Stringformat : Form
    {
        public Stringformat()
        {
            InitializeComponent();

            SetStyle(ControlStyles.Opaque, true);
            Point p = new Point(0, 0);
            Size s = new Size(500, 300);
            //Bounds = new Rectangle(0, 0, 500, 300);
            Bounds = new Rectangle(p, s);//窗體大小及相對於父客體的位置(0,0)
        }
        protected override void OnPaint(PaintEventArgs e)//重定義基類OnPaint()方法
        {
            Graphics g = e.Graphics;
            int y = 0;
            g.FillRectangle(Brushes.White, ClientRectangle);//繪制窗體背景色
            Rectangle rect = new Rectangle(0, y, 400, Font.Height);
            //g.FillRectangle(Brushes.Blue, rect);//墳兗一個矩形
            g.DrawRectangle(Pens.Blue, rect);//繪製一個矩形
            g.DrawString("This text is left justified.", Font, Brushes.Black, rect);
            y += Font.Height + 20;
            //Font.Dispose();//沒有創建對象,無須釋放資源

            Font afont = new Font("Arial", 16, FontStyle.Bold | FontStyle.Italic);
            rect = new Rectangle(0, y, 400, afont.Height);
            g.DrawRectangle(Pens.Blue, rect);
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Far;
            g.DrawString("This text is right justified.", afont, Brushes.Blue, rect,sf);
            y += afont.Height + 20;
            afont.Dispose();//創建了對象,須釋放資源

            afont = new Font("Courier Ncw", 12, FontStyle.Underline|FontStyle.Bold);
            rect = new Rectangle(0, y, 400, afont.Height);
            g.DrawRectangle(Pens.Blue, rect);
            sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;
            g.DrawString("This text is centered, and unederlined.", afont, Brushes.Blue, rect, sf);
            y += afont.Height + 20;
            afont.Dispose();

            afont = new Font("Times New Roman", 12);
            rect = new Rectangle(0, y, 400, afont.Height * 3);
            g.DrawRectangle(Pens.Blue, rect);
            string longString = "This text is much longer, and drawn ";
            longString += "into a rectangle that is higher than ";
            longString += "one line,so that it will wrap. It is ";
            longString += "very easy to wrap text using GDI+.";
            g.DrawString(longString, afont, Brushes.Black, rect);
            afont.Dispose();
        }
    }

C# : 使用 DataSet 管理從 MySQL 查詢出來的資料

此文引用自:http://godstamps.blogspot.tw/2012/02/c-dataset-mysql.html

在【C# : 對 MySQL 查詢資料】一文中查詢多筆資料所使用到的 MySqlDataReader 會與資料庫建立持續性的連線,所以在查詢完資料後必須明確的 Close();有時候我們會使用多句不同的查詢語句查詢出資料並長時間交互使用資料內容,而且這些資料並不會馬上被更新或是不需要更新,那麼每次都重新查詢或是使這些 MySqlDataReader 都一直維持連線,好像怎麼樣都不是很理想,這時候我們就可以考慮使用 DataSet 建立資料塊。
首先,利用 MySqlDataAdapter 來查詢資料並為查出的資料定義一個名稱整塊填入 DataSet 中做為 DataTable,之後可以利用所定義的名稱從 DataSet 取出 DataTable 並在 DataTable 指定列及欄位取得所需要的資料;而且也可為 DataTable 新增、修改、刪除資料,最終再整理 MySQL 語句將結果更新回資料庫中,如此將可對資料庫避免一些不必要讀寫的次數。大致的用法如下...

//開啟連線
MySqlConnection conn = new MySqlConnection("server=127.0.0.1;user=root;database=test;port=3306;password=1111;");
conn.Open();

//建立 DataSet
DataSet dataSet = new DataSet();

//使用 MySqlDataAdapter 查詢資料,並將結果存回 DataSet 當做名為 test1 的 DataTable
string sql = "SELECT * FROM test_table1 WHERE 1";
MySqlDataAdapter dataAdapter1 = new MySqlDataAdapter(sql, conn);
dataAdapter1.Fill(dataSet, "test1");

//使用 MySqlDataAdapter 查詢資料,並將結果存回 DataSet 當做名為 test2 的 DataTable
dataAdapter2 = new MySqlDataAdapter("SELECT * FROM test_table2 WHERE 1", conn);
dataAdapter2.Fill(dataSet, "test2");

// test1 的 DataTable
DataTable dataTable = dataSet.Tables["test1"];

//列出 test1 的第 4 筆資料
Console.WriteLine("id={0} , name={1}", dataTable.Rows[3]["id"], DataTable.Rows[3]["name"]);

//列出 test1 的總筆數
Console.WriteLine("總筆數:{0}", dataTable.Rows.Count);

//逐筆列出 test1 的資料
foreach(DataRow row in dataTable.Rows){
    Console.WriteLine("id={0},name={1}", row["id"], row["name"]);
}

//建立新一列的資料
DataRow newRow = dataTable.NewRow();
newRow["id"] = 999;
newRow["name"] = "testName999";

//在 test1 中新增一筆資料
dataTable.Rows.Add(newRow);

//刪除 test1 中的 第 4 筆資料
dataTable.Rows[3].Delete();

//修改 test1 中第 1 筆資料的 name 欄位內容
dataTable.Rows[0]["name"] = "newName";

//利用 MySqlCommandBuilder 使 dataAdapter1 能夠實行新增、修改、刪除
new MySqlCommandBuilder(dataAdapter1);

//將 test1 內容的變動更新回資料庫
dataAdapter1.Update(dataSet, "test1");

一個 DataSet 可以存放多個 DataTable,而每個 DataTable 資料的變更可以透過 MySqlDataAdapter 連接更新回資料庫,這樣可以很方便的管理多批資料,不過要特別注意的是複雜語句查出的資料可能會無法正確處理,如 JOIN、GROUP BY ... 等。

以上範例可以簡單的應用在 Windows Form 應用程式的 DataGridView ...

假設有的 DataGridView 實作為 dataGridView1,延續上面範例的 DataSet ...

//指定資料來源
dataGridView1.DataSource = dataSet;

//指定列出 test1 DataTable 內容
dataGridView1.DataMember = "test1";

這樣在顯示視窗的 DataGridView 內容就會依照 test1 DataTable 資料欄位將內容資料以列表的方式顯示出來,可以直接在列表中新增、修改、刪除資料,不過如果想將變更的內容更新回資料庫,可能就要再加一個按鈕,使它在點擊之後執行以下這兩句,才會更新,否則只是表單上表面看到的變動而已,資料庫並不會有任何更改。

new MySqlCommandBuilder(dataAdapter1);
dataAdapter1.Update(dataSet, "test1");