星期四, 12月 25, 2014

小米手環入手囉

等了好久,總算等到台灣開賣了,當然要趁聖誕節買一個來玩玩看囉!!






















戴在手上其實很輕,沒有什麼感覺,可能要小心的就是不小心擠壓到彈飛出去吧XD

星期五, 12月 05, 2014

SQL Server 刪除特定連線

最近發現以前別人寫的 Web Service 在資料庫連線控制沒有寫好,連線用完了也不關閉,造成IIS 的 Application Pool 連線數過多,

因為是特定的主機,當然只能 Kill 特定的 spid

只好先抓出那台主機所有 spid 來進行刪除的動作


DECLARE @spid int, @SQLstr nvarchar(128)
DECLARE spids_cr CURSOR FOR
SELECT p.spid FROM sys.sysprocesses P JOIN sys.sysdatabases D ON (D.dbid = P.dbid) JOIN sys.sysusers U ON (P.uid = U.uid) WHERE hostname != '' AND hostname = @hostname AND [P].[program_name]='.Net SqlClient Data Provider                                                                                                    ' 
FOR READ ONLY

OPEN spids_cr

FETCH spids_cr INTO @spid

WHILE (@@FETCH_STATUS=0)
BEGIN
SET @SQLstr = 'KILL ' + CAST(@spid AS varchar)
EXEC sp_executesql @SQLstr
FETCH spids_cr INTO @spid
END

CLOSE spids_cr
DEALLOCATE spids_cr
參考:http://www.stev.org/post/2011/03/01/MS-SQL-Kill-connections-by-host.aspx http://sharedderrick.blogspot.tw/2008/01/kill-all-connection.html

星期三, 8月 06, 2014

效能監控與發送警示郵件

有一天公司的 SQL Server 記憶體竟然使用到 64G,整個服務根本就是掛掉了,

想要查詢正在執行什麼語句都沒辦法,只好把服務重啟了,

正常來講,我們的記憶體使用量連 32G 都不到的,為了預防這種情況發生,

只好開始找尋監控的方式,

這裡寫到
http://stackoverflow.com/questions/6189927/sql-memory-viewing-actual-memory-used-and-memory-available

可以直接抓出 SQL Server 使用的記憶體大小

SELECT object_name, counter_name, cntr_value AS 'Total Server Memory (KB)'
FROM sys.dm_os_performance_counters 
WHERE counter_name = 'Total Server Memory (KB)'
不過看起來好像有點不準,於是繼續尋找其他方法,

政廷提供了這個網址,使用效能監視器
http://www.dotblogs.com.tw/jamesfu/archive/2012/12/07/perfmon.aspx

搭配他我找到了這個效能監視器加上工作排程器
http://www.dotblogs.com.tw/kirkchen/archive/2012/11/24/use-performance-monitor-to-monitor-server-and-send-alert-email.aspx

所以最後使用就使用效能監視器紀錄使用狀況,當超過設定值的時候就發送郵件通知

星期一, 7月 28, 2014

換馬桶進水器

昨天一早就被老媽叫醒,說廁所的馬桶水箱在漏水,

我第一件事情就是先關掉馬桶的進水管, 打開水箱觀察一下是什麼問題,

馬上就發現原因了,原來是浮水球桿子斷了,本來想用膠帶黏一下好了,

沒想到根本不夠力,只好換掉了,

去特力屋買了進水器跟浮球組回家來換,其實構造很簡單,只是馬桶下方不好使力而已,

大約 20 分鐘就換好了。


看看說明,是不是很簡單呀,上次換這個請水電來,花了一千二呢。



星期五, 7月 18, 2014

Team Foundation Server 還原別人的簽出

使用 TFS 最怕遇到的就是程式被別人簽出了,而簽出的人又不在或是離職了,系統設定為只能單一簽出的時候就很麻煩了,最簡單的方式就是還原該使用者的簽出,

1. 當然要有 VS 2010 或是 VS 2012

2. 安裝 Microsoft Visual Studio Team Foudation Server 2010(2012) Power Tools

3. 在原始檔控制總管中隨便找一個檔案或文件夾按右鍵點選 "尋找 " ->"Find Status"

4. 進行 ckecked out 檔案的搜尋

5. 在找出的檔案按右鍵 "Undo",就可以還原別人的簽出了。


星期三, 7月 16, 2014

Windows Server 2012 使用 ASP.NET

Windows Server 2012 真的很討厭,很多介面或設定都跟以前不一樣了,

我只是想測試一下 IIS 8.0+ASP.Net 有沒有使用上的問題,就花了不少時間,

首先,安裝 .Net Framework 3.5 只能從添加角色和功能進行安裝就算了, 

還要修改光碟的路徑才行,不然就會連到 Windows Update 安裝,耗時費工, 

還好後來在網路上還是找到方法了,

 

指定備用源路徑:設定為 光碟槽:\SOURCES\Sxs\,就可以了

本以為這樣就結束了,

結果 IIS 架好,系統也都 Copy 過去後,打開網頁出現 Error,一看錯誤,

原來是 IIS 不認識 aspx,這個簡單,我知道,重新註冊就行了,於是我打開了 cmd,

切換目錄後輸入 aspnet_regiis -i ,沒想到出現了 Windows Server 2012 不支援這種方式,
















請到角色與功能中移除重新安裝,天曉得,移除後 Windows 就掛掉了,更別提安裝了,

只好重灌,以及上網找資料了,才知道,不只是 ASP.NET 跟 IIS 要安裝,

還有其他角色要安裝才能用,

















如此一來,就一切正常了。


參考:http://www.dotblogs.com.tw/regionbbs/archive/2012/09/13/installing.net.framework.3.5.on.windows.server.2012.aspx
http://blog.darkthread.net/post-2013-11-29-iis8-asp-net-setup.aspx


星期三, 7月 02, 2014

AlwaysOn 設定相同 SQL 帳號

SQL Server 的 AlwaysOn 在 MSDN 跟上課聽到的內容都是使用網域帳號在登入及演練,但是這並不實際,因為根本不可能讓程式也用網域帳號呀。

只好想辦法在兩邊都建立一樣的 SQL 帳號,測試結果不行,移轉的後帳號還是不能用,後來才發現,原來建立算是不同的帳號,要想辦法建立具有相同 SID 和密碼的 SQL 驗證登入帳戶才行。

現在第一台建立好帳號 UserName
SELECT SUSER_SID('UserName') as SID,
LOGINPROPERTY('UserName','PasswordHash') as Password
這樣可以查出 UserName 的 SID 跟 Password 之後,再去第二台建立帳號
CREATE LOGIN [UserName] WITH 
PASSWORD = 0x02004E8321B1C292991E5B4CF64E3983B3736C59567C2736910F3E0B17BCEF6DFE0BB37AE03A6FAA9CEB3AC2BB1DE290C08710B25C0DD78D708532D54B2888A590BB2BE4200E HASHED, 
SID = 0x849A0DE6AEF87147BF0588C621CE91AF, 
DEFAULT_DATABASE = [master], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF

這樣就算 AlwaysOn 切換機器,同一個 SQL 帳號也一樣可以使用了


參考:http://www.dotblogs.com.tw/jamesfu/archive/2012/07/19/syncaccount.aspx

星期四, 6月 05, 2014

Excel 合併多個檔案的 Sheet 1 到一個檔案中

最近在進行 Excel 檔導入資料,沒想到程式開發好了之後,廠商竟然是把資料分開提供,一百多個檔案,不可能每個月都分成一百多次進行導入,於是就想起了用VBA來整理成一個檔案了

分成一百多個檔案,是整我嗎?

打開 Excel 之後,用 Alt+F11 開啟 vba 編輯器,接著點選 "插入" 新增 "模組"

接著在模組中貼上 VBA 之後點選 F5 開始執行,就會把資料都整理在這個 Excel 第一個 Sheet 了

Sub simpleXlsMerger()  
  Dim bookList As Workbook  
  Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object  
  Application.ScreenUpdating = False  
  Set mergeObj = CreateObject("Scripting.FileSystemObject")  
  'change folder path of excel files here  
  Set dirObj = mergeObj.Getfolder("D:\Excels\")  
  Set filesObj = dirObj.Files  
  For Each everyObj In filesObj  
    Set bookList = Workbooks.Open(everyObj, UpdateLinks:=False, ReadOnly:=True)  
    ActiveSheet.AutoFilterMode = False  
    bookList.Worksheets("Sheet1").Select  
    bookList.Worksheets("Sheet1").AutoFilterMode = False  
    'change "A2" with cell reference of start point for every files here  
    'for example "B3:IV" to merge all files start from columns B and rows 3  
    'If you're files using more than IV column, change it to the latest column  
    'Also change "A" column on "A65536" to the same column as start point  
    Range("A2:IV" & Range("A65536").End(xlUp).Row).Copy  
    ThisWorkbook.Worksheets(1).Activate  
    'Do not change the following column. It's not the same column as above  
    Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial  
    Application.CutCopyMode = False  
    bookList.Close False  
  Next  
  End Sub  
新增一種只抓取特定行並且貼上值,避免原本的資料是公式,

  Sub simpleXlsMerger()  
  Dim bookList As Workbook  
  Dim mergeObj As Object, dirObj As Object, filesObj As Object, everyObj As Object  
  Application.ScreenUpdating = False  
  Set mergeObj = CreateObject("Scripting.FileSystemObject")  
  '修改Excel檔的所在資料夾  
  Set dirObj = mergeObj.Getfolder("D:\Excels\")  
  Set filesObj = dirObj.Files  
  For Each everyObj In filesObj  
    Set bookList = Workbooks.Open(everyObj, UpdateLinks:=False, ReadOnly:=True)  
    ActiveSheet.AutoFilterMode = False  
    bookList.Worksheets("Sheet2").Select  
    bookList.Worksheets("Sheet2").AutoFilterMode = False  
    '我只要這個範圍的資料  
    Range("A4:L4").Copy  
    ThisWorkbook.Worksheets(1).Activate  
    'Do not change the following column. It's not the same column as above  
    Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteValues  
    Application.CutCopyMode = False  
    bookList.Close False  
  Next  
  End Sub  

星期三, 6月 04, 2014

DualListBox 製作

最近要用到權限設定的左右兩個 ListBox 來左右點選,本來想說這種範例在網路上一定很多,不想自己寫了,沒想到網路上找了一堆都沒有用,還有一堆不能用的程式碼在簡體中文的網頁一直被重複的轉載,反正他們寫的我不能用,只好自己來了

期待做出來的樣子如下圖


透過 VS 2012 要拉出來很簡單

而cs的部份就在 Button 的 Click 事件就是我找到一堆不能用的程式碼,最後我這樣做就行了
protected void btnL2R_Click(object sender, EventArgs e)
{
 //先把選中的都放到右邊去
        foreach (int i in LeftListBox.GetSelectedIndices())
        {
                LeftListBox.Items[i].Selected = false;
                RightListBox.Items.Add(LeftListBox.Items[i]);
        }

        //在從右邊將左邊的刪除
        foreach (ListItem li in RightListBox.Items)
        {
         LeftListBox.Items.Remove(li);
        }
}

protected void btnR2L_Click(object sender, EventArgs e)
{
 //先把選中的都放到左邊去
        foreach (int i in RightListBox.GetSelectedIndices())
        {
                RightListBox.Items[i].Selected = false;
                LeftListBox.Items.Add(RightListBox.Items[i]);
        }

        //在從左邊將右邊的刪除
        foreach (ListItem li in LeftListBox.Items)
        {
                RightListBox.Items.Remove(li);
        }
}

星期二, 5月 20, 2014

SQL 縱向合併多欄位成一欄位

最近遇到不少資料庫不是我設計,但是我要維護頁面,而在資料庫的部份已經無法在更動了,即便正規化做的不好,反正只要大家都知道就好,不直觀也無所謂,

要來實作一個維護頁面,資料表如下,


這種樣子是很難閱讀,馬上看出各張 FormID 的權限,下面這種整理過的資料在呈現上也比較好閱讀,


本來以為要把資料全部丟到程式中去執行了,沒想到上網 Google 了一下就早到 SQL 就可以辦到了,


SELECT a.[FormID] ,left(a.[Authority],LEN(a.[Authority])-1) AS [Description] FROM
(SELECT [FormID],(SELECT CAST([AuthType] AS NVARCHAR ) + ',' FROM [FormAuth]
WHERE [FormId] = o.[FormId]
FOR XML PATH('')) AS [Authority]
FROM [FormAuth] o
GROUP BY [FormID]) a
ORDER BY [FormID]

省時又省力了

參考: http://weisnote.blogspot.tw/2012/12/t-sql.html

星期五, 5月 16, 2014

SQL Where 子句的 Like 使用 Under Line

最近要來抓每個 Table 的資料進行整理,

資料庫中有很多 Table 都是備份的,這一堆都不需要抓出來,

好在這些 Table 的名稱都有使用到 _ 來跟原本的 Table 作為識別,

所以本來想使用 SELECT [name] FROM sys.tables WHERE [name] NOT LIKE '%_%'

來選出 Table,結果這個 Where 有跟沒有一樣

後來找了好久才知道 SELECT [name] FROM sys.tables WHERE [name] NOT LIKE '%[_]%' 

要這樣用才能呀,原來 Under Line 是特殊字元,所以要特別處理。

星期一, 1月 27, 2014

SQL Server 2012 新增 Link Server SQL Server 2000

SQL Server 2012 已經沒有辦法直接在連結的伺服器中新增 SQL Server 2000 了,會出現下面這個討厭的錯誤。

 這時候就想到用 ODBC 來處理,果然上網找了一下就有資料了,趕緊動手設定
 先在 ODBC 中建立連線
 名字跟伺服器都自己填吧









星期一, 1月 13, 2014

SQL Server 2012 更新後造成無法導出 EXCEL


自從更新 VS 2012 的 SSIS 的套件之後,SSMS 突然就變成無法 Excel 匯出了,只要使用在匯出資料中使用 SQL 語法篩選資料就會出現 200 跟 202 這種奇怪的資料格式,然後就不能匯出了,Google 查看了一下就發現看起來像是更新造成的災難,

http://social.msdn.microsoft.com/Forums/sqlserver/en-US/97ff1f01-c02a-4c9a-b867-8eaecc464cfb/2012-sp1-no-longer-recognizes-common-data-types?forum=sqlintegrationservices

只好自己去修改一下 XML

修改一下這個檔案
C:\Program Files (x86)\Microsoft SQL Server\110\DTS\MappingFiles\MSSQLToSSIS10.XML

加入之後重新開啟 SSMS 就可以使用了
 <!-- varchar -->
 <dtm:DataTypeMapping >
  <dtm:SourceDataType>
   <dtm:DataTypeName>varchar</dtm:DataTypeName>
  </dtm:SourceDataType>
  <dtm:DestinationDataType>
   <dtm:CharacterStringType>
    <dtm:DataTypeName>DT_STR</dtm:DataTypeName>
    <dtm:UseSourceLength/>
   </dtm:CharacterStringType>
  </dtm:DestinationDataType>
 </dtm:DataTypeMapping>
 <dtm:DataTypeMapping >
  <dtm:SourceDataType>
   <dtm:DataTypeName>200</dtm:DataTypeName>
  </dtm:SourceDataType>
  <dtm:DestinationDataType>
   <dtm:CharacterStringType>
    <dtm:DataTypeName>DT_STR</dtm:DataTypeName>
    <dtm:UseSourceLength/>
   </dtm:CharacterStringType>
  </dtm:DestinationDataType>
 </dtm:DataTypeMapping>

 <!-- nvarchar -->
 <dtm:DataTypeMapping >
  <dtm:SourceDataType>
   <dtm:DataTypeName>nvarchar</dtm:DataTypeName>
  </dtm:SourceDataType>
  <dtm:DestinationDataType>
   <dtm:CharacterStringType>
    <dtm:DataTypeName>DT_WSTR</dtm:DataTypeName>
    <dtm:UseSourceLength/>
   </dtm:CharacterStringType>
  </dtm:DestinationDataType>
 </dtm:DataTypeMapping> 
 <dtm:DataTypeMapping >
  <dtm:SourceDataType>
   <dtm:DataTypeName>202</dtm:DataTypeName>
  </dtm:SourceDataType>
  <dtm:DestinationDataType>
   <dtm:CharacterStringType>
    <dtm:DataTypeName>DT_WSTR</dtm:DataTypeName>
    <dtm:UseSourceLength/>
   </dtm:CharacterStringType>
  </dtm:DestinationDataType>
 </dtm:DataTypeMapping>