Articles
Oracle Merge,合併Insert或Update的高階SQL語法
有時候為了避免資料庫中相同的資料重複新增,因此早期的作法是先select count看看有沒有資料,如果有就update,沒有就insert,這樣就可以避免上述的情況。
這樣是一種方式沒有錯,但其實有更佳的方式那就是使用merge語法,本篇介紹的是在Oracle中怎麼做,其他資料庫也有支援喔。
MERGE TableA AS target
USING ( SELECT @sid, @column1, @column2 ) AS source
ON target. = source.
WHEN MATCHED THEN
UPDATE SET target. = source.,target. = source.
WHEN...
0
minutes
執行緒中的鎖定資源Lock
先前寫了一個簡單的執行緒,是每秒擷取一個畫面然後傳送到網路的NAS上,看似簡單還蠻雞肋的小程式,在本地端測試的時候都好好的,但是上線後問題不斷爆出,最大的一個原因,當這次的截圖還沒做完時(可能機器的處理效能與網路不理想),下一個截圖執行緒馬上啟動,結果可想而知就發生Exception了,截圖好像也只做一半,這個問題就是執行緒未做鎖定資源的關係。
在C#中,執行緒的鎖定並不難,只要以下語法,就能確保括號內的工作被做完,下一個執行緒才可以來做,如下:
lock (x)
{
// Your code...
}
至於哪個雞肋的自動擷取螢幕畫面小程式,主要關鍵語法如下:
System.Threading.Timer timerCapture;
Image myImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics g;
Encoder myEncoder = Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters(1);
private static object...
0
minutes
避免進入螢幕保護模式
因為資訊安全要求,通常規定電腦閒置達幾分鐘後就必須讓電腦進入螢幕保護模式並且上鎖,避免電腦沒人使用的狀況下,被駭客進行操作,這種情節電影中常出現,現實生活中也有可能,但是因為某些緣故,希望能夠長期顯示,例如儀表板等,或許可以管理GPO,用例外排除,但總是有點麻煩,因此如果有個小程式可以做這樣的事情,讓螢幕不睡覺,就簡單多了。
用程式處理不睡覺的解決方案,求助Google大神,找好久,很多方法根本是無用的。經過一番嘗試後,從Media Play播放音樂可以避免進入螢幕保護模式下手,代表是可以要求作業系統不進入螢幕保護狀態的,終於...達成目標,請參考以下範例:
public partial class Form1 : Form
{
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
public enum EXECUTION_STATE : uint
{
ES_AWAYMODE_REQUIRED = 0x00000040,
ES_CONTINUOUS = 0x80000000,
ES_DISPLAY_REQUIRED = 0x00000002,
ES_SYSTEM_REQUIRED = 0x00000001
// Legacy...
0
minutes
原來Windows Service是有啟動時間限制
先前介紹如何開發系統服務,可以參考這篇。原來系統服務Windows Service在啟動、關閉等,是有運作時間限制(Timeout),恰巧往往處理執行緒與裝置連線之間,不得不再原始碼中加上小睡片刻Thread.Sleep(1000),這樣反而增加啟動服務時間,超時在所難免,所幸可以使用下方語法,請笑納:
protected override void OnStart(string args)
{
// 增加啟動timeout秒數
RequestAdditionalTime( 120 * 1000 );
// Do you code.......................
}
資料來源: https://www.codeproject.com/Articles/19370/Windows-Services-Made-Simple
0
minutes
Windows服務(Windows Service)如何使用EventHandler
開發Windows服務,使用EventHandler,沒有透過Windows Form,是沒辦法運作的,但是如果就此改用Windows From去開發,那問題會是必須登入一個使用者,然後把該應用程式打開,且不能關閉與登出,失去做成Windows服務的好處。
哪麼,該如何讓沒有任何UI的Windows Service能夠具備處理 EventHandler 呢? 首先,在參考中,把System.Windows.Forms加進來,然後加入以下片段:
using System.Windows.Forms;
可以在Class的建構子中加入以下:
// 啟動Windows Form
Thread winFormThread = new Thread(() =>
{
axCZKEM1 = new CZKEMClass();
Application.Run();
});
winFormThread.SetApartmentState(ApartmentState.STA);
winFormThread.Start();
// 睡一下讓Thread建立完成
Thread.Sleep(2000);
運作成Windows Form後必須睡一下,再註冊事件,不然會有Null Exception:
// 註冊事件
if (axCZKEM1.RegEvent(iMachineNumber, 1))
{
axCZKEM1.OnAttTransactionEx...
0
minutes
用Visual Studio開發Window作業系統服務
Windows作業系統,背後有一大堆服務在運作著,早期是開發主控台應用程式(沒有UI介面的EXE執行檔),然後用工作排程器運作,這是一種解決方案,但是其實Visual Studio工具可以直接開發系統服務,首先要開新專案,選Windows 服務,如下圖:
不囉嗦,其他步驟就略過,直接到重點,建立好專案後,進入第一個設計模式畫面(Service1.cs)中,在畫面任一處按右鍵,出現選單選擇加入安裝程式,如下:
接著再安裝設計模式中會出現兩個元件,點選serviceInstaller1元件的屬性設定,如下圖紅框處都要修改一下。
同樣的點選serviceProcessInstaller1元件,有個服務執行的角色權限設定要調整一下,LocalSystem的權限是最大的,用甚麼權限就視服務本身做的事情來決定了。
編輯Service1.cs的兩個方法(OnStart、OnStop)後工作就完成了,你會發現直接按下綠色小箭頭開始是無法測試的,如下圖:
只好乖乖的把服務安裝起來,並且用NET START與NET STOP等命令提示字元進行測試。這個時候要靠.NET framework本身的工具(installutil.exe)來進行服務安裝與移除。
打開命令提示字元(需有本機管理員權限才能建立系統服務)
安裝服務
C:WindowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe D:CSharpProjectMyServicebinDebugMyService.exe
移除服務
C:WindowsMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe /u D:CSharpProjectMyServicebinDebugMyService.exe
測試方式(建置方案後)
net start MyService
net stop MyService
因為沒有任何UI,那Debug 要怎麼做,這時候就要借重事件檢視器,然後工具會將所有的log,包含exception,都會寫到事件檢測器中,要自己寫log也很簡單,只要依照以下就可以:
this.EventLog.WriteEntry("WHO can help?");
0
minutes