技術
Articles
Oracle MINUS比較兩個資料表的資料
早期要比對A與B兩個資料表的資料是否一致,作法大概就是JOIN兩個資料表的方式比對,相當辛苦,但其實Oracle有一個語法很特別,可以直接進行比對,那就是MINUS,去掉上方與下方相同資料後印出結果,如下:
SELECT COLUMN1,COLUMN2
FROM TABLE_A
MINUS
SELECT COLUMN1,COLUMN2
FROM TABLE_B
如果要將兩個資料表,只要有差異就列出來,那可以再加入一個語法UNION
SELECT 'A' SOURCE,COLUMN1,COLUMN2
FROM TABLE_A
MINUS
SELECT 'A' SOURCE,COLUMN1,COLUMN2
FROM TABLE_B
UNION
SELECT 'B' SOURCE,COLUMN1,COLUMN2
FROM TABLE_B
MINUS
SELECT 'B' SOURCE,COLUMN1,COLUMN2
FROM TABLE_A
0
minutes
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