發表文章

目前顯示的是有「程式理論」標籤的文章

ASP.NET Core 2 使用 HttpClientFactory 讀取中央氣象局 OpenData 的XML 下載

圖片
這是使用 ASP.NET Core 2 來讀取 CWB 的開放資料的 XML 檔,並讓 Client 端下載方式 註冊CWB會員 CWB OpenData 平台(以下稱CWBODP)取用資料必須先註冊會員→ 這裡註冊 然後,登入OpenData平台→ 這裡登入 選擇 『資料選擇說明』頁面 ,在下方可以找到『取得授權碼』,這個頁面下有使用教學 要取得資料代碼可以從 『資料清單』頁面 取得需要的代碼 有了上述資訊後,就可以著手開始做 .NET Core 2 的取用程式了。 CWODP取用 XML 檔案的 URI: http://opendata.cwb.gov.tw/opendataapi?dataid= {資料代碼} &authorizationkey= {授權碼} .NET Core 2 使用 HttpClient 有以下幾種: 一般 HttpClient 方式 直接使用 HttpClientFactory 具名式 Client 型別式 Client 產生式 Client 一般 HttpClient 方式 FileController.cs using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using System.Net.Http; namespace CWBReader.Controllers {     [Route("[controller]")]     public class FileController : Controller     {         [Route("")]         public async Task<string> DownloadFile()         {             using (var client = new HttpClient())             {                 string url = "http://opendata.cwb.gov.tw/opendataapi?dataid=F-C0032-0

C# 存取 Sybase 資料庫

圖片
要讓 dotNet 程式存取 Sybase 資料庫,首先,你必須取得 Sybase PC Client 的幾個DLL檔案: Sybase.Data.AseClient.dll sybdrvado11.dll sybdrvssl.dll 如果是開發者,可能需要先安裝 PC Client <<這裡下載>> ,安裝完後再到 Visual Studio的專案下,把 Sybase.Data.AseClient.dll 加入參考 當要執行時,記得把 sybdrvado11.dll、sybdrvssl.dll 一並複製到執行路徑下(Sybase.Data.AseClient.dll 會自動在編譯時加入到路徑下所以不用特別拷貝) 使用時要引用: using Sybase.Data.AseClient; 程式流程部分 : 1、建立連線 → 2、建立SQL命令 → 3、建立傳遞參數(如果需要) → 4、傳遞參數值(如果有建立傳遞參數) → 5、執行命令 → 6、取得查詢資料 連線資料庫 //連線資料庫 AseConnection aseCon; aseCon = new AseConnection ( "DataSource= ServerIPorName ;Port= 5000 ;Database= Windstone ;UID= sa ;PWD= adminPassw0rd " ); aseCon.Open(); SQL指令準備有兩種處理方式 : 一次性執行或是重複執行。 //一次執行的方式 string employeeNo = "052419" ; DateTime inDate = new DateTime (2016,5,1); AseCommand GetEmplName = new AseCommand ( "SELECT empl_name FROM employee WHERE empl_no = '" + employeeNo + "' and job_date > '" + inDate.toString( "yyyy/MM/dd"

C# INI Profile Read and Write Class

圖片
C# dotNet 程式對INI的設定檔存取,因為 微軟考量到 INI 存取的多程序存取無法達到同步問題,故從 dotNet 取消對 INI 檔案的支援,但是實際上卻還是有許多地方需要用到它。 所以,將它提出製作成一個 Class,方便以後用到: using System; using System.Text; using System.Runtime.InteropServices; using System.IO; namespace Profile.Interop {     class IniFile     {         public string FileName { get ; set ; }         public IniFile()         {             //在預設情況下,會使用執行檔案名稱做為INI的檔案名稱(與執行檔案相同位置)             string path = System.Diagnostics. Process .GetCurrentProcess().MainModule.FileName;             string filename = Path .GetFileNameWithoutExtension(path) + ".ini" ;             string dir = AppDomain .CurrentDomain.BaseDirectory;             FileName = Path .Combine(dir, filename);         }         public IniFile( string fileName)         {             //使用者指定             FileName = fileName;         }         [ DllImport ( "kernel32" )]         private static extern long WritePrivateProfileString( string section,          

C# 免裝Excel 就可以讀取 EXCEL 檔案 - ExcelDataReader (C# Read xls/xlsx/csv without excel using ExcelDataReader)

圖片
在幫公司開發程式的過程中,常常免不了要接收使用者或是客戶上傳的資料檔案, 通常我們程式設計師在解析檔案使用XML、CSV、TXT之類的檔案很好用,但對於使用者來說卻不是很友善的介面,通常會用統計資料的,也決不會是WORD,很多時候都是使用EXCEL或是CALC做出來的檔案。 在台灣大部分都是使用EXCEL做出來的統計檔案占絕大多數,因此處理這些EXCEL檔案便是家常便飯之事了。 而EXCEL產出的檔案,以附檔名類型上來說大致分為 .XLS 或是 .XLSX 這兩類。XLS檔案屬於BIFF格式檔案,它是一種二進位格式(Binary)檔案;XLSX則是比較新的檔案,屬於XML架構的檔案,一般又稱為 OpenXML,因此在處理與解讀上有所不同。 通常要處理 BIFF 檔案或是 OpenXML 檔案都需要有相當的格式研究能力,對於一般設計師來說都不是簡單的事,更不像TXT、CSV、XML這麼容易。 dotNet Framework 處理 EXCEL 當然自有一套方式,不管是LINQ、或是使用 Microsoft.Office.Interop.Excel 或是以 Microsoft.Jet.OLEDB.4.0 資料庫方式操作都避免不了一件事,就是 執行讀取檔案的電腦必須安裝 EXCEL ,但大家都知道 EXCEL本身不是免費的軟體,收費也很高,如果要在使用者端能夠執行,勢必在使用者端要裝上不少授權,光是費用都很驚人,也不是一般的小公司能夠負擔的。 ExcelDataReader - 這是一套在GitHub 上的 OpenSource 套件,它提供了強大的 Reader 功能,重點是免費,與強大的可攜性,它號稱是 Lightweight and fast library written in C# for reading Microsoft Excel files。 基本的讀取不是問題,處理檔案有它就很夠用了。 首先你可以到專案下的 NuGet 去取得套件: 總共有兩個套件要安裝:ExcelDataReader 和 ExcelDataReader.DataSet 要注意的是3.0.0以前的版本只有 ExcelDataReader,沒有 ExcelDataReader.DataSet,這個 DataSet 套件是從 3.0.0後分開的,

[研究]ASP.NET Core 2 關於 DI 使用的變數為什麼是唯讀屬性

圖片
ASP.NET Core 每次在使用 DI 時,通常都會在 接收 DI 服務的變數宣告上使用了 readonly 的形式? 雖然不使用 readonly 也是可以使用,但是這樣做的主要目的是當 DI 服務備要求導入此變數時,可以確保此變數指向的物件(服務),不會被其它程式碼變更。以免發生 exception。 那麼,很奇怪的是,既然是宣告為 readonly ,為什麼又可以被指定內容(如上圖),很明確的原因有2個: 1、readonly 屬性是在建構(Construction)後才生效,所以在 Constructor 時,是可以指定內容的。 2、readonly 屬性是給編譯器進行檢查用,以確保範圍內(Scope)的程式碼不會對此變數進行內容指派的動作,建構函數執行期除外。 參考: Why is this field declared as private and also readonly?

C# 取得 Windows 內所有程序視窗名稱、類別、指標

圖片
Get windows process handle / title name / class name 這篇其實是用來輔助 powerbuilder 寫的,因為大多數的第三方軟體都習慣會透過 FindWindow 這個API來確認己方程式是否已經啟動。 但是通常會不清楚自己開發工具開發的視窗會是哪種 Class Name ,所以利用下面簡單方式把電腦內所有程序的 handle / title name / class name 全部列出來查個清楚。 由於呼叫了 C 元件(COM API)所以需要多使用下面幾種 引用 using System.Runtime.InteropServices; using System.Text; using System.Collections; 程式的部分我將使用一個多行的 TextBox 把資訊列出來: namespace EnumWindows20 {     public partial class Form1 : Form     {         //Define Unmanaged API         public delegate bool EnumedWindow ( IntPtr handleWindow, ArrayList handles);         [ DllImport ( "user32.dll" , CharSet = CharSet.Auto, SetLastError = true)]         [return: MarshalAs(UnmanagedType.Bool)]         public static extern bool EnumWindows ( EnumedWindow lpEnumFunc, ArrayList lParam);         [ DllImport ( "user32.dll" , SetLastError = true, CharSet = CharSet.Auto)]         public static extern int GetClassName ( IntPtr hWnd, StringBuilder lpCl

C# HEX 字串 產生方式 (HEX KEY Gen)

很多時候,需要產生 HEX KEY 來做為唯一值,或是種子密碼來用,一般的情況我們會檢單的使用亂數(Random)來產生 Random rnd = new Random(); int num = rnd.Next(); string hexData = num.ToString("X"); 但是,許多人都知道,如果要產生很長的HEX字串,這個 Ramdom 是不夠力的。 而且也有『不夠亂』的問題存在(受限於Random演算法) 當然如果需要32字元的 HEX 字串,也可以直接使用 GUID 產生方式來獲得: string guidString = Guid.NewGuid().ToString().Replace("-", "").ToUpper(); string hexData = guidString; 但是如果要再更長,夠亂的HEX字串呢? 則可以使用 RNGCryptoServiceProvider 來處理 使用前記得引用 System.Security.Cryptography byte[] bytes = new byte[16]; using (var rng = new RNGCryptoServiceProvider()) {         rng.GetBytes(bytes); } string sBytes = BitConverter.ToString(bytes).Replace("-", ""); string hexData = sBytes; 長度的決定就由 byte 陣列大小來決定,因為一個byte可以生成2個字元的HEX碼, 所以byte[16]可以生成32字元HEX碼,byte[32]可以生成64字元的HEX碼,依此類推。

Microsoft Server 2008 / 2012 工作排程器 無法正常執行 C# [.NET] 程式

圖片
這個問題是我常常遇到的,很多時候寫Server端的程式通常是需要配合排程(工作排程器)執行的。 而這個工作排程器好似從2008以後的版本就跟2003有不少差異。 但就寫程式的工程師而言,有一個非常要注意的地方,那就是『程式執行位置』,底下演示一段程式碼來顯示 正常情況下 ,你的程式取得的程式所在位置資訊 我的程式位置在 D:\TEST 11\CnetAppPath string dir = System.Environment.CurrentDirectory; 位置: D:\TEST 11\CnetAppPath string dir = System.Windows.Forms.Application.StartupPath; 位置: D:\TEST 11\CnetAppPath string dir = System.IO.Directory.GetCurrentDirectory(); 位置: D:\TEST 11\CnetAppPath string dir = System.AppDomain.CurrentDomain.BaseDirectory; 位置: D:\TEST 11\CnetAppPath\ string dir = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase; 位置: D:\TEST 11\CnetAppPath\ string dir = System.Windows.Forms.Application.ExecutablePath; 位置: D:\TEST 11\CnetAppPath\AppPath.exe string dir = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; 位置: D:\TEST 11\CnetAppPath\AppPath.exe string dir = this.GetType().Assembly.Location; 位置: D:\TEST 11\CnetAppPath\AppPath.exe 假設,我建立一個 捷徑 ,一般情況下捷徑裡面會有一個設定值『開始位置』

C# 偵測資料夾內檔案狀態是否被鎖定(或是可用)

參考來源: https://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use 因為常常會用到,所以先收集起來,註解改用中文 記得要 using System.IO; DirectoryInfo directoryInfo = new DirectoryInfo (sourcePath); foreach(FileInfo fi in directoryInfo.GetFiles()) {     if (!isFileLocked(fi) && fi.Length > 0)     {         // ...繼續處理可用檔案     } } 這個 isFileLocked 如下: protected virtual bool IsFileLocked(FileInfo file) {     FileStream stream = null;     try     {         stream = file.Open( FileMode .Open, FileAccess .Read, FileShare .None);     }     catch ( IOException )     {         //檔案無法開啟可能原因:         // 檔案仍然被寫入狀態         // 被其他Thread程序使用中         // 已經不存在 (或被程序處理掉了)         return true ;     }     finally     {         //如果已經被開啟不管狀態為何,記得要關閉資源         if (stream != null)             stream.Close();     }     //可以被開啟,回報檔案未被鎖定     return false ; }

電子發票 QR碼產生用程式碼 C# .NET

來源:財政部 註解:me 使用時注意 namespace using System; using System.IO; using System.Text; using System.Security.Cryptography; namespace tw.gov.nat.einvoice.qrutil {     class QREncrypter     {         /// <summary>         /// 將發票資訊文字加密成驗證文字         /// </summary>         /// <param name="plainText">發票資訊</param>         /// <param name="AESKey">種子密碼(QRcode)</param>         /// <returns>加密後的HEX字串</returns>         public string AESEncrypt( string plainText, string AESKey)         {             byte [] bytes = Encoding .Default.GetBytes(plainText);             ICryptoTransform transform = new RijndaelManaged             {                 KeySize = 0x80,                 Key = this.convertHexToByte(AESKey),                 BlockSize = 0x80,                 IV = Convert.FromBase64String("Dt8lyToo17X/XkXaQvihuA==")             }.CreateEncryptor();             MemoryStream stream = new MemoryStr

C# 如何產生不重複的隨機碼

某些情況下,需要產生一系列的亂碼,而且不重複。 下面兩種方式都可以達到效果 下面這個範例是打亂 1 - 9999 數字排序,然後取出前 1000 筆紀錄來使用。 方法一:傻瓜產生法 一般而言會使用迴圈,然後一邊產生亂碼一邊檢查是否重複。 Random rnd = new Random(); List<int> list1 = new List<int>(); do {     int number = rnd.Next(1, 9999);     int dup = list1.IndexOf(number);     if (dup < 0)     {         list1.Add(number);     } } while (list1.Count < 1000); 優點:速度快 缺點:當取號數量等於亂數數量時,可能會變成迴圈永遠不會結束(因為最後一碼超難取到)。 方法二:洗牌法 下面使用一種亂數排序方式,將一系列數字打亂其順序,然後再取出要使用的數字範圍,就可以很快的得到我們要的亂數範圍。 Random rnd = new Random(); List<int> randomList = Enumerable.Range(1, 9999)     .OrderBy(x => rnd.Next()).Take(1000).ToList(); 優點:直覺取號,當取號數量等於亂數數量時保證可取。 缺點:耗時稍多(其實頂多比方法一多十幾毫秒而已)。 夠簡單吧!

C# string 裡面包含 \0 字元處理方式

圖片
很多時候我們會從檔案、裝置或是服務去讀取串流文字 ( Stream ),再放到畫面的 TextBox 顯示,但是有時候串流文字裡面包含了 "\0" 這樣的溢出字元 (escape character)。 這個 "\0" 溢出字元,會被 TextBox 當成字串終止符號,倒致顯示中斷,例如 下面程式顯示出來的結果: 因此,這個 "\0" 需要處理一下: 這樣就可以了。

使用arduino設計EBD展示燈

圖片
其實這個構想很久了, 指是要先處理單線電力供電問題,再處理高低壓控制,以及演示計算問題。 我再這之前有作出一個簡易的 EBD 煞車燈, 但是,看久了還是希望有點變化,可是又不希望買市面上的燈條來組合: 一來是我希望展示燈有有延遲啟動效果,市面上燈條做不到。 二來是希望展示的方式可以依照自己喜好組合,市面上燈條也難辦到。 所以只好動起 Arduino 歪腦筋,看看能不能塞進去第三煞車燈了。 先勾勒出電路圖 不算太難,只是線路有點多而已,由於要塞到第三煞車燈裡面所以要進量縮小 因此比較多零件的驅動電晶體使用了SMD的N通道MOSFET - P3055LDG來製作。 原則上Arduino NANO 是5V 驅動與電力提供, 控制 TLC5940NT 一路都是5V 但是要轉到控制12V的LED燈板就需要用到偶合電路比較安全, 因此這裡選用了簡單形式的 LTV847 光耦合IC來串接, 這樣就可以隔離12V電力,避免逆流回Arduino 或TLC5940NT導致燒毀問題。 Arduino NANO TLC5940NT LTV847 P3055LDG 程式的部分改天再分享上來