我的環境是 winpython 2.7 spyder
由於安裝pip install py2exe 結果他的版本只能用在python 3.3 以上
google了很久有人提供此方式
pip install http://sourceforge.net/projects/py2exe/files/latest/download?source=files
但只能抓到32位元版本py2exe
最後直接在系統上安裝一個 python
直接安裝py2exe 即可
然後使用c:\python27\python.exe 去編譯我的setup.py 檔案
至於如何使用setup.py 參考這篇blog:
http://koko.ntex.tw/wordpress/build-python-exe-using-py2exe/
程式筆記
meteor 卡在starting app
今天開始裝了meteor ,從官網上下載
經由此網頁
https://forums.meteor.com/t/meteor-stuck-at-starting-your-app/25592/6
得到解決方案
輸入set MONGO_URL=' '
就可正常執行
安裝1.4 版之後
要重開機,path 才會啟用
但照官網教學
經由此網頁
https://forums.meteor.com/t/meteor-stuck-at-starting-your-app/25592/6
得到解決方案
輸入set MONGO_URL=' '
就可正常執行
C# 中的訪問權限
修飾關鍵字 | 訪問權限 |
---|---|
public | 可以被任意程式碼存取 |
private | 只能在同一個類別中被存取 |
protected | 只能在同一個類別中及其繼承的類別中存取 |
internal | 只能在同一個namespace 中存取 |
protected internal | 只能在同一個namespace 中可存取之外,還可被繼承的類別中存取 |
public :
沒有存取限制,被public修飾後可被任意存取
internal:
只能在同一個namespace 中存取,也就是就算加了入參考也無法使用
C#中預設為internal
C#中預設為internal
protected:
只能被目前類別加上繼承的類別存取,在不同namespace 中,只要父類別中有被protected 的,即可被繼承
protected internal:
顧名思義,就是protected + internal。什麼意思呢? 就是保有internal 的特性( 在同一個namespace 中可以存取) 又有procted 的特性(在不同namspace 中,可被繼承的類別存取)
本來internal 是不可以在不同的namespace 中使用的,但是加上protected internal 之後即可在不同的namespace 中被繼承的類別存取。
private :
宣告為private 的只能在自己的類別中存取,此外,private 不可修飾類別類別只能被internal 、public 修飾
考慮到一個問題,如果父類別宣告為internal,而繼承的子類別為public ,這樣發生一個問題
子類別訪問權限> 父類別
父類別限定只能在同一個namspace 中繼承,但子類別卻宣告為public 讓人任意存取
這樣就違反了父類別限定的本意,就像我只能給我班上的人講議,但班上的同學卻在網路上說只要想拿即可來班上任意拿取。
所以這樣是會出現錯誤的,在撰寫時必須注意。
ArrayList 與 List<T>的差別:拆箱與裝箱
先來看ArrayList 與 List<T> 的效率差別
使用ArrayList:
執行時間為:
將以上程式碼替換成List<int>
執行時間為:
可以看到使用List<T> 的速度以這個case來說快了3倍左右
為什麼呢?
這是因為ArrayList 在add 方法時要傳入的值的型態為object
在此就發生了裝箱
何謂裝箱與拆箱?
Boxing(裝箱) 與 UnBoxing(拆箱) 的意義為
使用ArrayList:
static void Main(string[] args) { ArrayList arrList = new ArrayList(); Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 100000; i++) { arrList.Add(i); } sw.Stop(); Console.WriteLine(sw.Elapsed); Console.ReadKey(); }
執行時間為:
將以上程式碼替換成List<int>
static void Main(string[] args) { //ArrayList arrList = new ArrayList(); ListarrList = new List (); Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 100000; i++) { arrList.Add(i); } sw.Stop(); Console.WriteLine(sw.Elapsed); Console.ReadKey(); }
執行時間為:
可以看到使用List<T> 的速度以這個case來說快了3倍左右
為什麼呢?
這是因為ArrayList 在add 方法時要傳入的值的型態為object
在此就發生了裝箱
何謂裝箱與拆箱?
Boxing(裝箱) 與 UnBoxing(拆箱) 的意義為
- 裝箱:將數值型態轉換為參考型態
- 拆箱:將參考型態轉換為數值型態
C#連接資料庫並回傳
C#程式常需要連接到資料庫,在此記錄了幾種方式的回傳方法。
0.2增加一類別,名為SqlHelper
此時因為剛才在App.config 設定的 name="mssqlserver",故可看到此時就調用"mssqlserver" 來存取剛才設定的連線字串。
2.1執行insert/update/delete,回傳影響的資料列數
2.2 回傳單一個值
2.3 回傳SqlDataReader
2.4 回傳DataTable
*前置動作
0.1首先設定App.config
此為winform的設定,若是撰寫Asp.net 則要設定web.config<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name ="mssqlserver" connectionString="Data Source=.\SQLEXPRESS; Initial Catalog=test;Integrated Security=True"/> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> </configuration>其中 name 可以設定為自己想要的名稱,如果有不同的connectionString 也可以在此新增多種,在撰寫程式碼 的時候再選擇要用哪一種connectionString 即可。Initial Catalog 是指定要存儲的資料庫,在此的資料庫名稱為test。
0.2增加一類別,名為SqlHelper
1. 使用創建連接資料庫字串 ConnectionString
private static readonly String connStr = ConfigurationManager.ConnectionStrings["mssqlserver"].ConnectionString;此時需要新增一個System.Configuration的參考才能使用 ConfigurationManager 存取到App.config。
此時因為剛才在App.config 設定的 name="mssqlserver",故可看到此時就調用"mssqlserver" 來存取剛才設定的連線字串。
2. 撰寫幾種sql 查詢後回傳種類
2.1執行insert/update/delete,回傳影響的資料列數
public static int ExecueNonQuery(string sql, CommandType cmdType, params SqlParameter[] pms) { using (SqlConnection con = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand(sql, con)) { //設置目前執行的是「存儲過程? 還是帶參數的sql 語句?」 cmd.CommandType = cmdType; if (pms != null) { cmd.Parameters.AddRange(pms); } con.Open(); return cmd.ExecuteNonQuery(); } } }
2.2 回傳單一個值
public static object ExecuteScalar(string sql, CommandType cmdType, params SqlParameter[] pms) { using (SqlConnection con = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand(sql, con)) { cmd.CommandType = cmdType; if (pms != null) { cmd.Parameters.AddRange(pms); } con.Open(); //MessageBox.Show("Login sussess!"); return cmd.ExecuteScalar(); } } }
2.3 回傳SqlDataReader
public static SqlDataReader ExecuteReader(string sql, CommandType cmdType, params SqlParameter[] pms) { SqlConnection con = new SqlConnection(connStr); using (SqlCommand cmd = new SqlCommand(sql, con)) { cmd.CommandType = cmdType; if(pms!=null) { cmd.Parameters.AddRange(pms); } try { con.Open(); return cmd.ExecuteReader(CommandBehavior.CloseConnection); } catch { con.Close(); con.Dispose(); throw; } } }
2.4 回傳DataTable
public static DataTable ExecuteDataTable(string sql, CommandType cmdType, params SqlParameter[] pms) { DataTable dt = new DataTable(); //use SqlDataAdapter ,it will establish Sql connection.So ,it no need to create Connection by yourself. using (SqlDataAdapter adapter = new SqlDataAdapter(sql, connStr)) { adapter.SelectCommand.CommandType = cmdType; if (pms != null) { adapter.SelectCommand.Parameters.AddRange(pms); } adapter.Fill(dt); return dt; } }
3. 調用Sqlhelper 實現比對
假設帳號及密碼都用明文儲存,則可透過以下方式連接資料庫比對
namespace UsingSqlHelper { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btn_Login_Click(object sender, EventArgs e) { //sql 查詢語句, string sql="select count(*) from users where loginId=@uid and loginPwd=@pwd"; SqlParameter[] pms = new SqlParameter[] { //設定變數,帳號去除空白字元 new SqlParameter("@uid",txtB_ID.Text.Trim()), new SqlParameter("@pwd",txtB_PWD.Text) //pwd allowed to use 'space' char }; //因為有聚合函數,回傳的是數值,故可用int轉換 int n =(int)SqlHelper.ExecuteScalar(sql, CommandType.Text, pms); if(n>0) { MessageBox.Show("Login sussess!"); } else { MessageBox.Show("Wrong username or password!"); } } } }
訂閱:
文章 (Atom)