2019年8月20日 星期二

MSSQL 進行資料庫還原時出現 3154 的錯誤解決方法

http://jian-zhoung.blogspot.com/2014/10/sqlserver-3154.html

資料庫名稱記得自己key上去..即可

或者下這段code.

https://dotblogs.com.tw/lbhbill/2013/08/15/114599

AES又叫做Rijndael演算法(LegalBlockSizes)

http://svc.011.idv.tw/ShareAll/KM/What/%E5%8A%A0%E5%AF%86%E6%96%B9%E6%B3%95%E6%AF%94%E8%BC%83%E8%A1%A8.html


  // Rfc2898DeriveBytes 類別可以用來從基底金鑰與其他參數中產生衍生金鑰。
                // 使用 MD5 來 Hash 出 Rfc2898 需要的 Salt。
                //Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(key, this.HashByMD5(key));

https://dotblogs.com.tw/supershowwei/2016/01/11/135230

RijndaelManaged 類別 (AES又叫Rijndael)

https://dotblogs.com.tw/yc421206/archive/2012/04/18/71609.aspx

     

2019年8月19日 星期一

MD5 C#

c# net 使用MD5.Create和MD5CryptoServiceProvider有什麼區別?



https://www.cnblogs.com/healer007/p/5062189.html


=======================================================================

  public static class Md5
    {
        /// <summary>
        /// 將content轉成Md5
        /// </summary>
        /// <param name="content">輸入的內容</param>
        /// <returns>Md5的結果</returns>
        public static string getMD5String(this string content)
        {
            var sb = new StringBuilder();
            try
            {
                var md5 = new MD5CryptoServiceProvider();
                // 加密後是一個字節類型的數組,這裡要注意編碼UTF8/Unicode等的選擇 
                byte[] bytValue = Encoding.UTF8.GetBytes(content);
                byte[] bytHash = md5.ComputeHash(bytValue);
                md5.Clear();
                // 通過使用循環,將字節類型的數組轉換為字符串,此字符串是常規字符格式化所得
                for (int i = 0; i < bytHash.Length; i++)
                {
                    // 將得到的字符串使用十六進制類型格式。格式後的字符是小寫的字母,如果使用大寫(X)則格式後的字符是大寫字符
                    sb.Append(bytHash[i].ToString("X").PadLeft(2, '0'));
                }
            }
            catch (Exception ex)
            {
               // Log.writeLogToFile(Log.LogFileType.ErrorMessage, "Md5.getMD5String(): " + ex.GetBaseException() + "," + ex.Message);
            }
            return sb.ToString();
        }

    }

PadLeft==>C# String 前面不足位數補零的方法

https://www.itread01.com/content/1544340274.html

int i=10;
方法1:Console.WriteLine(i.ToString("D5"));
方法2:Console.WriteLine(i.ToString().PadLeft(5,'0'));//推薦
方法3:Console.WriteLine(i.ToString("00000")); 
在 C# 中可以對字串使用 PadLeft 和 PadRight 進行輕鬆地補位。
PadLeft(int totalWidth, char paddingChar) //在字串邊用 paddingChar 補足 totalWidth 長度
PadRight(int totalWidth, char paddingChar) //在字串邊用 paddingChar 補足 totalWidth 長度
示例:
h = h.PadLeft(2, '0');
注意第二個引數為 char 型別,所以用單引號,也可以用 Convert.ToChar(string value) 把字串轉換成 char 型別。如果字串長度大於 1,則使用 str.ToCharArray()[index]。 

2019年8月10日 星期六

static 詳解用法及問題

static 詳解用法及問題

從很久很久以前就看到static這傢伙存在於我的程式碼中了

如今我還是不知道他到底是什麼東西,所以我決定來了解他,並且記錄起來

以前對於 static 總是一知半解 只知道哦.....他是一個...........靜態的.......東西?
直到今天看到同事在改工廠方法的作業時提到很多人使用了 static ,於是我就問了為什麼要不加 static 比較好? 他就反問我為什麼要加 static?
在問這個之前我只知道
因為現在在寫測試時,會因為 static 會造成耦合而難以進行 分離單元測試
有時候如果在 class 共用變數時可以用 static
但實際也不了解 static 的存在是為了什麼,到底何時需要用到 static 這個修飾詞

於是乎我就先到了 MSDN 找了他的定義

使用 static 修飾詞來宣告靜態成員,而靜態成員屬於類型本身,而不是特定物件。 static 修飾詞可以與類別、欄位、方法、屬性、運算子、事件和建構函式搭配使用,但不能與索引子、完成項或類別以外的類型搭配使用。 如需詳細資訊,請參閱靜態類別和靜態類別成員

OK,看完了這一段我只知道 static 是一個修飾詞 讓他成為靜態成員或靜態類別成員,媽呀 我還是不知道他到底是什麼鬼東西 於是我看了他後面所提到的文件靜態類別和靜態類別成員

看完了這一個文件我知道了 static 基本上與非靜態類別相同,不同之處的就是他不能使用 new 關鍵字來建立類別類型的變數
不過這對我理解 static 存在到底是為了什麼 還有為什麼不加 static 比較好一點幫助也沒有

於是我又開始找了一些資料 發現了 這一篇文章  ,他舉了許多的例子都蠻有趣的但是易於理解,有興趣可以進去看一看,我在這裡就使用我自己理解的表達方式來用code做紀錄

假設我今天要一個帳戶的class而我的Money使用了靜態類別static,其他的年齡 (Age) 則不加入 static 修飾詞
而我今天寫了一段Code是這個樣子
我用 Account 宣告了兩個人 所以分別有 dz 和 lin ,今天DZ賺了十塊錢
所以理所當然的 dz.Money + 10塊錢 
後來 lin 決定花 10 塊錢買糖果,所以lin.Money - 10
後來 DZ 去查了他的帳戶卻發現他的帳戶剩下了0塊錢!!!
下圖就是執行結果
DZ看到帳戶餘額時整個就是黑人問號
如果像是年齡,我沒有加入 static 修飾詞,則不會共用這一個 Age 的變數,用以下的Code來進行展示
我現在的歲數是18歲嘛 大家都知道(?),而lin的歲數是21歲,今天我過了生日 所以長了1歲,理所當然的 lin的年齡也不會因為我長了一歲而加了1
如果我的Age加了 static 修飾詞 就會變成大家共有這個變數,我長了1歲,lin也會長了1歲,這根本不合理RRRRRRRRRRRRR
所以無論是年齡還是帳戶的錢 都不適合使用 static 這個修飾詞 (除非大家都共用這一個變數

從以上這些程式碼就可以看得出來靜態和非靜態上意義的不同
那何時會需要用到 static 會比較好呢?

簡單以物件導向的方式來解釋用到 static 這個修飾詞時和不使用 static 這個修飾詞時意義上的差異

假設今天有一個公開類別名稱叫做 人類 有個方法叫做賺錢
如果賺錢這個方法是靜態方法 則大家賺的錢就是大家的
如果是非靜態方法  則大家自己賺的錢就是自己的

而為什麼盡量不要使用static呢? 主要會造成的問題是 (引用於 C# Test Legacy Code(4)Unit Test with Static Functions)

  • 無謂地佔住記憶體過久
  • 直接耦合造成無法獨立進行單元測試
  • 無法享用物件導向設計的好處(繼承的重用與擴充、介面的可抽換性、多型的擴充性)
    • 尤其在 Dao 中將 connection 資源宣告成 static 存放更是一件災難,一旦到線上多人一起使用,就會冒出一堆 connection 佔用/使用中的 exception,更可怕的是往往這種 legacy code 還會把 exception 吃掉,假裝天下太平

以上是我對於 static 修飾詞的整理與了解,如果有任何錯誤的地方 麻煩各位大大跟我說 感謝 <(_ _)>

Sqlite用法


Sqlite


  1. C# 判斷檔案是否存在

判斷檔案是否存在
如何判斷檔案是否存在,可以透過
File.Exists 方法 : 判斷指定的檔案是否存在。
http://msdn.microsoft.com/zh-tw/library/system.io.file.exists(VS.80).aspx
在 MSDN 中有提出依些要注意的事情

Exists 方法不應用於路徑驗證,這個方法僅會檢查 path 中指定的檔案是否存在。將無效路徑傳遞至 Existsl 會傳回 false。
請注意,在您呼叫 Exists 方法並對檔案執行其他作業 (例如,Delete) 的期間內,其他處理序有可能對檔案進行某些動作。建議的程式設計作法是在如範例所示的 Try...Catch 區塊中,包裝 Exists 方法,以及您對檔案採取的作業,這有助於縮小潛在衝突的範圍。Exists 方法只能協助確保檔案可供使用,但不保證一定可用。
允許用 path 參數來指定相對或絕對路徑的資訊。相對路徑資訊會被解譯為與目前的工作目錄相對。若要取得目前的工作目錄,請參閱 GetCurrentDirectory。
如果 path 描述目錄,這個方法會傳回 false。判斷檔案是否存在之前,移除 path 參數後端的空白字元。

以下來判斷 test.txt 檔案是否存在

  1. C# 嵌入資料庫SQLite的簡單用法

引用百度百科的說法:SQLite,是一款輕型的資料庫,是遵守ACID的關係型數據庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域專案。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式設備中,可能只需要幾百K的記憶體就夠了。它能夠支援Windows/Linux/Unix等等主流的作業系統,同時能夠跟很多程式語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC介面,同樣比起Mysql、PostgreSQL這兩款開源的世界著名資料庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生於2000年5月。 至2015年已經有15個年頭,SQLite也迎來了一個版本 SQLite 3已經發佈。具體下載位址:

引用命名空間:
using System.Data.SQLite;
using System.Data.SQLite.Generic;
using System.Data.Common;

        /// <summary>
        ///【測試方法】 簡答的測試SQLite資料庫及表的創建過程
        /// </summary>
        [TestMethod()]
        public void Test()
        {
            string strConnectionString = string.Empty,/*SQLite連接字串,剛開始沒有,暫時留空*/
                   strDataSource = @"D:test.db";//SQLite資料庫檔存放物理位址
            //用SQLiteConnectionStringBuilder構建SQLite連接字串
            System.Data.SQLite.SQLiteConnectionStringBuilder scBuilder = new SQLiteConnectionStringBuilder();
            scBuilder.DataSource = strDataSource;//SQLite資料庫位址
            scBuilder.Password = "123456";//密碼
            strConnectionString = scBuilder.ToString();
            using (SQLiteConnection connection = new SQLiteConnection(strConnectionString))
            {
                //驗證資料庫檔是否存在
                if (System.IO.File.Exists(strDataSource) == false)
                {
                    //創建資料庫檔
                    SQLiteConnection.CreateFile(strDataSource);
                }
                //打開資料連接
                connection.Open();
                //Command
                SQLiteCommand command = new SQLiteCommand(connection);
                command.CommandText = "CREATE TABLE tb_User(ID int,UserName varchar(60));INSERT INTO [tb_User](ID,UserName) VALUES(1,'A')";// "CREATE TABLE tb_User(ID int,UserName varchar(60));";
                command.CommandType = System.Data.CommandType.Text;
                //執行SQL
                int iResult = command.ExecuteNonQuery();
                //可省略步驟=======關閉連接
                connection.Close();
            }
        }
  1. CommandType屬性
使用CommandType屬性,以最佳化的評估結果CommandText屬性。
如果CommandType屬性值設為預設值為adCmdUnknown,您可能會感覺到的效能,因為 ADO 必須進行呼叫提供者,以判斷CommandText屬性是 SQL 陳述式、 預存程序中或資料表名稱。 如果您知道您正在使用的命令類型,則設定CommandType屬性會指示 ADO,直接移至相關的程式碼。 如果CommandType屬性不符合命令中的型別CommandText屬性,您呼叫時發生錯誤Execute方法。

  1. sqlite 資料庫加密

C#使用SQLite出錯:無法載入 DLL“SQLite.Interop.dll”,找不到指定的模組


在.net中使用sqlite資料庫需要引用SQLite.Interop.dll引用,
一般添加兩資料夾就可以了
64的和32位的裡面分別包含了SQLite.Interop.dll
https://images2015.cnblogs.com/blog/922426/201705/922426-20170502184457320-1447707367.png
測試裡也加上
https://images2015.cnblogs.com/blog/922426/201705/922426-20170502184526976-1943177344.png
但是有時雖然已經添加了引用還是出現“無法載入
DLL“SQLite.Interop.dll”,
找不到指定的模組”的錯誤
是因為引用沒有複製到本第所有找不到
https://images2015.cnblogs.com/blog/922426/201705/922426-20170502184816273-459916805.png

在屬性裡把每個引用都複製到本地就可以正常的使用了

2019年8月7日 星期三

winform的gif動畫設定 c#(使用資源檔.resx 檔案方式)

 public MainFrm()
        {
            InitializeComponent();
            # region gif動畫設定
            //1.gif動畫,Picturebox只能用image屬性
            //2.圖檔路徑要放在bin的位置
            //3.Picturebox的sizemode要設為StretchImage
            // Bitmap bit = new Bitmap("B.gif");
            // this.picSignal.Image = bit;
            //4.也可以用資源檔的方式加入
            this.picSignal.Image = Resource1.B;
            #endregion
        }


1.pictureBox裡面的圖片自動縮放來符合picturebox的size

https://zhidao.baidu.com/question/311331881


2.C# 讓視窗背景顯示GIF動畫

http://ray19841984.blogspot.com/2017/01/c-gif.html


3.[C#][VB.NET]將圖片加入資源檔和調用它

https://dotblogs.com.tw/chou/archive/2009/09/30/10852.aspx

http://kailotus.blogspot.com/2015/07/cpropertiesresources.html