2014年4月30日 星期三

電腦防禦─(EMET)對抗緩衝區漏洞工具

資料來源
http://www.manetic.org/index.php?option=com_content&view=article&id=639%3Aenhanced-mitigation-experience-toolkit-emet-&catid=66%3Ais-audit-a-security&Itemid=301&lang=en

電腦防禦─Enhanced Mitigation Experience Toolkit (EMET)

By Carol U, Senior Technical Consultant, MOCERT

對抗緩衝區漏洞工具

現今數碼年代,電腦的應用越來越廣泛;不論是娛樂、通訊或是透過網上學習或購物,電腦已成為日常生活的基本設備。在報章、雜誌或電視新聞,也經常提到不同類型的電腦案例,如個人或機構的資料外洩等,導致名譽或金錢損失。

作為用戶,除了加強自身的電腦保安意識,把電腦保安措施做好;如安裝防衛掃毒軟件,定期更新防毒軟件庫及掃瞄病毒,安裝並啟動個人防火牆等;更要定期更新軟件及補丁,防範軟件漏洞。


但以上所提及的防護,對於零時差攻擊 (Zero Day Attack─駭客利用軟件廠商尚未發現的安全漏洞所做的攻擊)。 不論是由軟件先天設計缺陷所引起或最近發現之軟體漏洞,用戶基本是“零防護”,連軟件廠商也束手無策。

軟件廠商開放軟件更新需時,時間可能是一日,十日,甚至是幾個月的時間。駭客可利用這個機會,發動零時差攻擊。

對於Windows操作系統,微軟公司推出一款名叫Enhanced Mitigation Experience Toolkit(EMET)的免費安全工具。它為Windows系統、應用程序,及由其他廠商開發之應用程序,提供安全方案和技術支援。

Adobe公司也曾於2010年10月份,因未能即時回應高危漏洞,而在Adobe公告上建議其用戶啟動EMET功能,防範“零時差”攻擊。

功能簡介

在新版本Emet2.0內,它整合了多種防止緩衝區漏洞功能,如ASLR(Address Space Load Randomization),DEP(Data Execution Prevention)以及SEHOP(Structured Exception Handling Overwrite Protection)等多項功能,並提供容易使用的界面。
  • ASLR(Address Space Load Randomization,記憶體位置編排隨機化)
    透過ASLR功能,能讓系統檔案及其他應用程序,儲存在不同的記憶體。 在開動ASLR的情況下,駭客難以使用慣性手法,利用Buffer Overflow (緩衝區溢出)漏洞─在操作系統或應用程序出現問題時,猜測出下一個會讀取的內存地址,並由此進行破壞或入侵系統。
  • DEP (Data Execution Prevention資料防止執行):
    是一種系統內置之內存保護機制。DEP可強制操作系統,把內存標示為非執行區塊(region of non-executable)。它可監視執行中的應用程序,阻止有問題的軟件,寫入非執行區塊。
  • SEHOP (Structured Exception Handling Overwrite Protection防止結構異常處理覆寫):
    對已使用Structured Exception Handling(SEH)之執行程序進行安全檢測,防止Structured Exception Handler覆寫攻擊。
  • 其他
    除了上述提到的保護機制外,EMET還包括Heapspary Allocations─把Heapspary常用之地址預先分配,防止地址被惡意程序利用 及EAF (Export Address Table Access Filtering)─檢查“導出地址表”之代碼是否存在;若否,終止可疑程序等功能。
支援操作系統:

Client Operation Systems用戶系統包括:
  • Windows XP service pack 3及以上版本
  • Windows Vista service pack 1及以上版本
  • Windows 7所有 service packs版本

Server Operation Systems 伺服器系統包括:
  • Windows Server 2003 service pack1及以上版本
  • Windows Server 2008 所有service packs版本
  • Window Server 2008 R2所有server packs版本

EMET適用於市面上大部份之操作系統及應用程序,詳情可參考以下表格: 
適用應用程序設置
MitigationXPServer 2003VistaServer 2008Win7Server 2008 R2
DEPYYYYYY
SEHOPYYYYYY
NULL PageYYYYYY
Heap SprayYYYYYY
Mandatory ASLRNNYYYY
EAFYYYYYY

適用系統設置
MitigationXPServer 2003VistaServer 2008Win7Server 2008 R2
DEPYYYYYY
SEHOPNNYYYY
ASLRNNYYYY

安裝指引:
p1.jpg
圖1: Microsoft軟件下載中心
      安裝步驟:

    • EMET V2.0可在Microsoft軟件下載中心下載。把安裝檔EMET Setup.msi下載到電腦,並雙擊檔案啟動安裝。
p2.jpg
圖2: 按”Next” 執行安裝
p3.jpg
圖3: 選擇安裝路徑及安裝的範圍,並按”Next”繼續安裝
  • 預設安裝路徑為硬碟: C:\Program Files\EMET\
  • 可選擇安裝EMET軟件到
    - 現時用戶界面或
    - 所有用戶界面p4.jpg
圖4: 選擇”I Agree”,並按”Next”繼續安裝
p5.jpg
圖5: EMET安裝完成

EMET使用簡介:

      啟動了軟件後,可透過主頁面上方的資訊,了解操作系統支援EMET之狀態。如圖6, 此操作系統只支援DEP功能;但不支援SEHOP及ASLR防護。


      主頁面按鈕功能:

    • Running Processes: 刷新正在運行的進程列表
    • Configure System: 系統整合設置
    • Configure Apps: 軟件整合設置
p6.jpg
圖6: EMET主頁面

Configure System:系統整合設定

p7.jpg
圖7: 系統整合設定界面

      EMET系統支援兩種安全級別:

    • Maximum Security Setting : 最高安全級別
    • Recommended Security Settings : 建議安全級別 
p8.jpg
圖8: EMET系統提示

      完成設置後,EMET會出現提示視窗-“電腦需重新啟動後,新的EMET設置才能生效”。


    • Configure Apps:軟件整合設置

      用戶可預先把不同的軟件及應用程序,加到EMET整合環境,讓EMET發揮作用,監控緩衝區漏洞或攻擊;再者用戶也可因應需要,使用不同的安全架構,如DEP, SEHOP 等等功能。


      主頁面按“Configure App”按鈕,即可進入,“Application Configuration”頁面


p9.jpg
圖9:軟件整合設置

    • 新增程序:
    • 按“Add”按鈕,出現“Add Application”頁面,選擇想加入之程序,並按 “Open”,


p10.jpg
圖10:選取應用程序

      新加的程序已加入EMET整合環境


p11.jpg
圖11:成功加入程序

    • 移除程序:
    • 選取想要多移除之程序以下,並按“Remove”按鈕。


p12.jpg
圖12: 移除程序

備註:對於不同版本的Windows系統,或會出現不兼容的情況。如在XP系統下運行Outlook Express 6,DEP會自動阻擋Outlook Express執行。用戶可考慮在“系統整合設定(System Configuration)”內暫停DEP的功能,及把其他需要監控之應用程序加到“軟件整合設置(Configure Apps)”。

總結:

Enhanced Mitigation Experience Toolkit(EMET)是多個安全技術之整合工具。通過EMET的整合,這些技術也能應用在舊版之Windows系統(如Windows XP)上,並有效防護常見之緩衝區攻擊手法,讓用戶免受軟件漏洞的影響,是一款對抗“零時差”漏洞的有效工具。

如果想更了解EMET V2.0之功能,最好就是立即安裝並啟動程序,進行實際操作試用。當然需要配合其他電腦保安措施,才能更有效地預防已知或未知的電腦漏洞。

2014年4月22日 星期二

ASP.NET 2.0:利用Master Page打造網頁的樣版



資料來源:http://www.iiiedu.org.tw/taipei/student/paper/tihs10r.htm

ASP.NET 2.0:利用Master Page打造網頁的樣版


 
· 摘要
  使用樣版(Template)的觀念來設計網頁是一個很重要的技巧,因為同一個網站的網頁通常需要使用相同的樣式與風格,以便讓網站的使用者使用起來有一致的感覺,開發ASP網頁的程設計師可以使用#include檔案的技巧引入一個共用的檔案當做網頁的開頭、結尾、或是左右兩邊的功能表或廣告,讓所製作的每一個網頁擁有一致的介面,達到樣版的功能,而且也可以縮短設計網頁操作介面的時間,讓網頁容易維護。ASP.NET網頁的程設計師可以使用User Control製作每一個網頁欲使用的開頭、結尾、或是左右兩邊的功能表或廣告當做樣版,再拿給每一個網頁使用,讓同一個網站的每一個網頁都可以有一致的操作介面和感覺,當然也可以得到縮短設計網頁操作介面的時間,使網站易於維護,除此之外,使用User Control設計的ASP.NET的網頁還可以經由把User Control放置到快取記憶體的做法來改善將網頁的內容顯示給網際網路使用者瀏覽的效能,但是#include 檔案和使用User Control來製作樣版功能都不是網頁設計工具內建的做法,也就是說要靠網頁的設計師自行套用才能享受利用樣版設計網頁的好處,針對這一點,ASP.NET 2.0提出一個新的功能,Master Page,讓網頁設計師可以採用視覺編輯的方式設計網站中每一個網頁欲套用的樣版,再套用到網站中每一個網頁,達到風格一致的效果,縮短網頁的設計和維護的時間,提升網頁開發的生產力。本文將帶領大家一探ASP.NET 2.0的Master Page功能的奧秘,並使用ASP.NET 2.0提供的Master Page樣版功能快速開發風格一致的網頁。
 
˙[特別注意] 本文中的示範是採用Visual Studio 2005 Beta 1版製作的,其程式的寫法與程式開發工具的使用方法可能會和最終讀者拿到的Visual Studio 2005正式版產品有所出入,您所看到的操作功能表和操作畫面也會和您使用Visual Studio 2005時採用那一種開發工具的操作習慣而稍有不同。
 
 · 認識Master Page和Content Page
  ASP.NET 2.0提出的Master Page和Content Page的觀念,可以幫助網頁的設計者快速地設計網頁的樣版,例如網頁的設計者想要讓網頁中的每一個網頁都具有相同的頁首、頁尾、左方功能表、以及右方的廣告超連結,就可以設計類似圖1的Master Page:
 
 圖1:Master Page與Content Page
  圖1中的頁首、頁尾、左方功能表、以及右方的廣告超連結就是Master Page的結構,而中央空白的地方就是放置內容網頁(即Content Page)的地方,網頁設計者只要更換合適的內容網頁就可以快速製作出一堆風格與樣式一致的網頁,其概念和做法類似ASP網頁的#include檔案和ASP.NET 1.X的User Control的做法,只不過是利用ASP.NET 2.0內建的Master Page來製作而已。了解Master Page的用途之後,接下來我們就要使用Visual Studio 2005提供的Master Page功能建立一個網頁風格一致的網站。
 
建立Master Page
首先使用[Project]功能表底下的[New]功能底下的[Web Site]功能建立一個ASP.NET網站,然後使用滑鼠的右鍵點中[Solution Explorer]視窗中的專案,選擇出現的功能表中的[Add New Item]功能,再從出現的視窗中選擇[Master Page]項目,表示要為網站加入Master Page,如圖2所示:
 
圖2:為網站加入Master Page的畫面
  
   在[Name]欄位中輸入Master Page檔案的名稱之後按下[Add]鍵,Visual Studio 2005就會為我們的網站加入一個Master Page,其副檔名預設為(*.master),並開啟剛加入的Master Page供您編輯,請注意其中的<% master %>標籤,表示這是一個Master Page,其中可以放置任何的HTML元素和Server控制項,包括、、和
等標籤,以及ASP.NET 2.0新加入的控制項,負責顯示內嵌的Content Page。您可以使用滑鼠的左鍵點選畫面左下方的[Design]頁籤,表示要對Master Page進行視覺編輯。  Master Page中最常見的結構就是Table,在Master Page中放入Table可以控制整個樣版的元素擺放位置,例如您可以於Table的上方放入負責顯示公司商標的元素,和瀏覽網站中其他網頁的超連結,於Table的下方放入版權聲明。


2014年4月17日 星期四

ASP.NET中將DataTable匯出為Excel檔

------------------測試可用方法------------------------
Protected Sub ButtonToExcel_Click(sender As Object, e As System.EventArgs) Handles ButtonToExcel.Click

        Dim style As String = "<style> .text { mso-number-format:\@; } </script> "
        Dim sw As New System.IO.StringWriter
        Dim hw As New System.Web.UI.HtmlTextWriter(sw)
        Response.AppendHeader("Content-Disposition", "attachment; filename=DormInfo_" & Format(Now, "yyyymmdd_HHmm") & ".xls")
        Response.ContentType = "application/vnd.ms-excel"
        Response.Write("<meta http-equiv=Content-Type content=text/html;charset=utf-8>")
        GridView1.RenderControl(hw)
        Response.Write(style)
        Response.Write(sw.ToString())
        Response.End()

    End Sub
Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
        '處理'GridView' 的控制項 'GridView' 必須置於有 runat=server 的表單標記之中 
    End Sub
<%@ Page Language="VB"  CodeFile="searchname.aspx.vb" Inherits="searchname" AutoEventWireup="true" EnableEventValidation="false" MaintainScrollPositionOnPostback="true"%>

----------------------以下是參考文件---------------------




相關問題(ASP.NET與Excel)我也曾遇見過,所以蒐集了一些資料,放在我的BLOG與大家共享:


[NPOI 2.0] ASP.NET 輸出 Excel (.xlsx檔 2007格式) -- ASP.NET Export to Excel (.xlsx)
http://www.dotblogs.com.tw/mis2000lab/archive/2014/07/02/npoi-20-for-aspnet_20140703.aspx


-----------------------------------------------------------------------

1.  如果Excel欄位與資料庫完全相同

那就簡單了,也有更好的工作去完成這種資料匯入的動作。

甚至不需要自己寫程式。


2. 如果Excel欄位與資料庫「不同」

那麼,您只好在EXCEL裡面,一筆一筆記錄來讀取

然後一筆一筆地回寫到資料庫裡面,使用 Insert Into這樣的SQL指令。

請看這一篇文章,如何讀取 Excel裡面的資料 ---- 透過Jet.OLEDB 讀取Excel裡面的資料- MIS2000 Lab. 的ASP.NET專題實務 ...

參考資料我的ASP.NET教學網站--www.dotblogs.com.tw/mis2000lab/

http://pcdou.pixnet.net/blog/post/24075850-.net-excel%E5%8C%AF%E5%85%A5-(c%23)



-->


ASP.NET - Gridview匯出Excel簡易方式 & 指定為純文字樣式
http://blog.yam.com/weilin98/article/28941568

[Excel] 匯出檔案依照日期存檔名

資料來源
http://www.programmer-club.com/showSameTitleN/access/3368.html


用 VBA

Function Export()
On Error GoTo Export_Err


    Let strSQL = "select * into [EXCEL 8.0;DATABASE=C:\MyFile" & Format(Now, "yyyymmdd") & ".XLS].[MySheet] from MyTable"

    DoCmd.RunSQL strSQL, -1


Export_Exit:
    Exit Function

Export_Err:
    MsgBox Error$
    Resume Export_Exit

End Function

------------------------


1. >>Excel格式不會變, 比較漂亮 = ="
參考 http://www.programmer-club.com/pc2020v5/forum/ShowSameTitleN.asp?URL=N&board_pc2020=access&id=2547

多作一些Excel 的格式修正即可(有關Excel 巨集部分...可用錄製協助)
多多參考 http://www.excelhelp.net 網站

    Dim xls As Excel.Application
   Dim ps3 As Object

    Set x1app = Nothing
    Set x1app = CreateObject("Excel.Application")

    x1app.Workbooks.Open "C:\C:\MyFile" & Format(Now, "yyyymmdd") & ".XLS"
    x1app.Visible = True
    Set ps3 = GetObject(, "Excel.Application")
    Set ps3 = GetObject("C:\C:\MyFile" & Format(Now, "yyyymmdd") & ".XLS")

    ps3.ActiveSheet.Rows(1).Font.Name = "Verdana"
    ps3.ActiveSheet.Rows(1).Font.Bold = True
    ps3.ActiveSheet.Rows(1).Interior.ColorIndex = 40

   (記的要引用項目 : Microsoft Excel xx Object...)

2. >>若是檔名已經存在的話, 不能更新檔案, 程式會中斷.
    加一段 程式碼 ....刪除舊 Excel file 

    On Error Resume Next
    Kill "C:\C:\MyFile" & Format(Now, "yyyymmdd") & ".XLS"
    On Error GoTo 0


[Asp.Net]解決匯入Excel數值資料的錯誤

資料來源
http://yukishijob.blogspot.tw/2013/03/aspnetexcel.html

參考資料:

[ASP.NET] Excel 自動轉型造成的錯誤

透過 OleDb 精準讀入 Excel 檔的方法


基本上參考以上兩篇大致上就可以解決此問題,不過還是筆記一下:)

line_15_4
123
原始資料,超過1以上的數值左上角會出現綠色三角形,
提示「此儲存格內的數字其格式為文字或開頭為單引號」
即使強迫讓欄位設定為文字型態,依然上傳至網頁會出現數值為0的現象
table_0 
後來想到那直接重新輸入數值,雖然上傳數值會變正常
但資料要有一萬多筆,不就重key到死…一點都不便利啊~

之後又在狗狗大神到處找答案
有參考到這篇↓

EXCEL 移除 ' 符號 並讓「格式為文字」的數字,一次轉換成數字格式的方法

確實能解決問題,但程式主要是給一般對電腦不是很熟的人使用
每次轉換都要請別人這樣轉,也太unfriendlly惹吧!!
肯定會縮"告"麻搞得這麼麻煩
不過這招有偷學到我有暗爽倒是真的,哈

總之後來估一下資料就發現這根本就是程式的問題嘛~
我的原始程式碼是這樣的:
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + folder + this.FileUpload1.FileName +
                 ";Extended Properties='Excel 8.0;HDR=Yes';IMEX=1 ";
string queryStr = "SELECT * FROM [reforal$]";
修改步驟
  1. 在Connection String 加入 "IMEX=1;"
  2. 修改Regedit,路徑:
    Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel 下TypeGuessRows 的值改成 0
    (如果電腦沒有灌office就只有4.0的樣子,有的路徑可能是3.5,不確定)
 jet
就解決了._.
---------------------

EXCEL 移除 ' 符號 並讓「格式為文字」的數字,一次轉換成數字格式的方

http://cocochocolatetw.pixnet.net/blog/post/31264848


有些資料庫匯出的EXCEL檔案格式中,在資料前都會有 ' 符號(表示文字格式),如下圖:
image
要如何一次移除所有 ' 符號並讓「格式為文字」的數字,一次轉換成數字格式的方法呢?
1.先在任一個空的儲存格上,鍵入數值 1。
2.選取剛剛鍵入1的儲存格,然後 [複製]
3.選取您想要轉換儲存格之範圍。
4.在 [編輯] 功能表上,按一下 [選擇性貼上]
image

5.在 [運算] 下方按一下 [乘]
image
6.按一下 [確定]
7.最後再把 所鍵入1 的儲存格刪掉。
image
完成囉^^

時間格式及方法運用

資料來源:
http://www.dotblogs.com.tw/skyline0217/archive/2011/01/26/21047.aspx

將 yyyyMMdd格式的字串,轉換成日期格式
string sDate = "20100504";
DateTime NewDate = DateTime.ParseExact(sDate , "yyyyMMdd", null, System.Globalization.DateTimeStyles.AllowWhiteSpaces);

時間格式
 
DateTime.Now.ToString("yyyyMMdd")    20080923
DateTime.Now.ToString("yyyy/MM/dd")    2008/09/23
DateTime.Now.ToString("yyyy/M/d")    2008/9/23
DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")    2008/09/23 13:03:03
DateTime.Now.ToString("T")    下午 01:04:43
DateTime.Now.ToString("t")    下午 01:05
DateTime.Now.ToString("tt")    下午
DateTime.Now.ToString("yyyy/MM/dd tt hh:mm:ss")    2008/09/23 下午 01:07:27
DateTime.Now.ToString("yyyyMMddhhmmss")    20080923010921



 HH為24小時制,hh為12小時制



 C# 格式化時間字串
 
DateTime dt = DateTime.Now;

Label1.Text = dt.ToString();//2005-11-5 13:21:25

Label2.Text = dt.ToFileTime().ToString();//127756416859912816

Label3.Text = dt.ToFileTimeUtc().ToString();//127756704859912816

Label4.Text = dt.ToLocalTime().ToString();//2005-11-5 21:21:25

Label5.Text = dt.ToLongDateString().ToString();//2005年11月5日

Label6.Text = dt.ToLongTimeString().ToString();//13:21:25

Label7.Text = dt.ToOADate().ToString();//38661.5565508218

Label8.Text = dt.ToShortDateString().ToString();//2005-11-5

Label9.Text = dt.ToShortTimeString().ToString();//13:21

Label10.Text = dt.ToUniversalTime().ToString();//2005-11-5 5:21:25

Label1.Text = dt.Year.ToString();//2005

Label2.Text = dt.Date.ToString();//2005-11-5 0:00:00

Label3.Text = dt.DayOfWeek.ToString();//Saturday

Label4.Text = dt.DayOfYear.ToString();//309

Label5.Text = dt.Hour.ToString();//13

Label6.Text = dt.Millisecond.ToString();//441

Label7.Text = dt.Minute.ToString();//30

Label8.Text = dt.Month.ToString();//11

Label9.Text = dt.Second.ToString();//28

Label10.Text = dt.Ticks.ToString();//632667942284412864

Label11.Text = dt.TimeOfDay.ToString();//13:30:28.4412864

Label1.Text = dt.ToString();//2005-11-5 13:47:04

Label2.Text = dt.AddYears(1).ToString();//2006-11-5 13:47:04

Label3.Text = dt.AddDays(1.1).ToString();//2005-11-6 16:11:04

Label4.Text = dt.AddHours(1.1).ToString();//2005-11-5 14:53:04

Label5.Text = dt.AddMilliseconds(1.1).ToString();//2005-11-5 13:47:04

Label6.Text = dt.AddMonths(1).ToString();//2005-12-5 13:47:04

Label7.Text = dt.AddSeconds(1.1).ToString();//2005-11-5 13:47:05

Label8.Text = dt.AddMinutes(1.1).ToString();//2005-11-5 13:48:10

Label9.Text = dt.AddTicks(1000).ToString();//2005-11-5 13:47:04

Label10.Text = dt.CompareTo(dt).ToString();//0

//Label11.Text = dt.Add(?).ToString();//???一???段

Label1.Text = dt.Equals("2005-11-6 16:11:04").ToString();//False

Label2.Text = dt.Equals(dt).ToString();//True

Label3.Text = dt.GetHashCode().ToString();//1474088234

Label4.Text = dt.GetType().ToString();//System.DateTime

Label5.Text = dt.GetTypeCode().ToString();//DateTime

Label1.Text = dt.GetDateTimeFormats('s')[0].ToString();//2005-11-05T14:06:25

Label2.Text = dt.GetDateTimeFormats('t')[0].ToString();//14:06

Label3.Text = dt.GetDateTimeFormats('y')[0].ToString();//2005年11月

Label4.Text = dt.GetDateTimeFormats('D')[0].ToString();//2005年11月5日

Label5.Text = dt.GetDateTimeFormats('D')[1].ToString();//2005 11 05

Label6.Text = dt.GetDateTimeFormats('D')[2].ToString();//星期六 2005 11 05

Label7.Text = dt.GetDateTimeFormats('D')[3].ToString();//星期六 2005年11月5日

Label8.Text = dt.GetDateTimeFormats('M')[0].ToString();//11月5日

Label9.Text = dt.GetDateTimeFormats('f')[0].ToString();//2005年11月5日 14:06

Label10.Text = dt.GetDateTimeFormats('g')[0].ToString();//2005-11-5 14:06

Label11.Text = dt.GetDateTimeFormats('r')[0].ToString();//Sat, 05 Nov 2005 14:06:25 GMT

Label1.Text = string.Format("{0:d}",dt);//2005-11-5

Label2.Text = string.Format("{0:D}",dt);//2005年11月5日

Label3.Text = string.Format("{0:f}",dt);//2005年11月5日 14:23

Label4.Text = string.Format("{0:F}",dt);//2005年11月5日 14:23:23

Label5.Text = string.Format("{0:g}",dt);//2005-11-5 14:23

Label6.Text = string.Format("{0:G}",dt);//2005-11-5 14:23:23

Label7.Text = string.Format("{0:M}",dt);//11月5日

Label8.Text = string.Format("{0:R}",dt);//Sat, 05 Nov 2005 14:23:23 GMT

Label9.Text = string.Format("{0:s}",dt);//2005-11-05T14:23:23

Label10.Text = string.Format("{0:t}",dt);//14:23

Label11.Text = string.Format("{0:T}",dt);//14:23:23

Label12.Text = string.Format("{0:u}",dt);//2005-11-05 14:23:23Z

Label13.Text = string.Format("{0:U}",dt);//2005年11月5日 6:23:23

Label14.Text = string.Format("{0:Y}",dt);//2005年11月

Label15.Text = string.Format("{0}",dt);//2005-11-5 14:23:23?

Label16.Text = string.Format("{0:yyyyMMddHHmmssffff}",dt); //yyyymm等可以?置

Label16.Text = string.Format("{0:yyyyMMdd}",dt);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

DateTime gTime =Convert.ToDateTime(drw["AddTime"].ToString());
ggTime =string.Format("{0:D}", gTime).ToString();

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//今天

DateTime.Now.Date.ToShortDateString();

//昨天,就是今天的日期?一

DateTime.Now.AddDays(-1).ToShortDateString();

//明天,同理,加一

DateTime.Now.AddDays(1).ToShortDateString();

//本週(要知道本週的第一天就得先知道今天是星期幾,?而得知本週的第一天就是幾天前的那一天,要注意的是?裡的每一週是?週日始至週六止

DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek)))).ToShortDateString();

DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek)))).ToShortDateString();

//如果你?不明白,再看一下中文?示星期幾的方法就??懂了

//由於DayOfWeek返回的是?字的星期幾,我?要把它??成?字方便我???,有些人可能?用switch?一?一?地?照,其?不用那麼麻?的

string[] Day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };

Day[Convert.ToInt16(DateTime.Now.DayOfWeek)];

//上週,同理,一?周是7天,上週就是本週再?去7天,下周也是一?

DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek))) - 7).ToShortDateString();

DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek))) - 7).ToShortDateString();

//下周

DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek))) + 7).ToShortDateString();

DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek))) + 7).ToShortDateString();

//本月,很多人都??本月的第一天嘛肯定是1?,最後一天就是下?月一?再?一天。?然?是?的

//一般的?法

DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + "1"; //第一天

DateTime.Parse(DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + "1").AddMonths(1).AddDays(-1).ToShortDateString();//最後一天

//巧用C#裡ToString的字符格式化更?便

DateTime.Now.ToString("yyyy-MM-01");

DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).AddDays(-1).ToShortDateString();

//上?月,?去一?月份

DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(-1).ToShortDateString();

DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();

//下?月,加去一?月份

DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).ToShortDateString();

DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(2).AddDays(-1).ToShortDateString();

//7天後

DateTime.Now.Date.ToShortDateString();

DateTime.Now.AddDays(7).ToShortDateString();

//7天前

DateTime.Now.AddDays(-7).ToShortDateString();

DateTime.Now.Date.ToShortDateString();

//本年度,用ToString的字符格式化我?也很容易地算出本年度的第一天和最後一天

DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).ToShortDateString();

DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).AddDays(-1).ToShortDateString();

//上年度,不用再解?了吧

DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(-1).ToShortDateString();

DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddDays(-1).ToShortDateString();

//下年度

DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).ToShortDateString();

DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(2).AddDays(-1).ToShortDateString();

//本季度,很多人都??得?裡??,需要????的?程?判?。其?不用的,我?都知道一年四?季度,一?季度三?月

//首先我?先把日期推到本季度第一?月,然後??月的第一天就是本季度的第一天了

DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");

//同理,本季度的最後一天就是下季度的第一天?一

DateTime.Parse(DateTime.Now.AddMonths(3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();

//下季度,相信你?都知道了。。。。收工

DateTime.Now.AddMonths(3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");

DateTime.Parse(DateTime.Now.AddMonths(6 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();

//上季度

DateTime.Now.AddMonths(-3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");

DateTime.Parse(DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();

2014年4月15日 星期二

Excel匯入SQL

[ASP.net/MSSQL] 讀寫Office Excel之前要做的相關設定









Client side 
<asp:FileUpload ID="FileUploadQuestion" runat="server" Width="30%"/>
<asp:Button ID="ButtonUpload" runat="server" Text="匯入"/>



Server side 
Imports System.Data.OleDb
Imports System.Data

Partial Class Test
' 按下『匯入』鈕
  Protected Sub ButtonUpload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonUpload.Click
Dim FileUpload As FileUpload ' 抓取Client Side的檔案
    Dim OLEConn As OleDbConnection ' 與Excel連繫用
    Dim OLECommand As OleDbCommand
    Dim OLEDataAdapter As OleDbDataAdapter
    Dim dsResult As New Data.DataSet ' 存放Excel的資料內容
    Dim dtResult As New Data.DataTable
    Dim FileName As String = "" ' Client Side的檔案名稱
    Dim StartIndex As Integer = 0
    Dim ExcelConn As String = "" ' 與Excel連繫用
    Dim ExcelSelect As String = ""
    Dim Field1 As String = "" ' Primary Key
    Dim Field2 As String = ""
    Dim Field3 As Integer = 0
    Dim Field4 As String = ""
    Dim Field5 As String = ""
    Dim Field6 As String = ""
    Dim Field7 As String = ""
    Dim Field8 As String = ""
    Dim SqlString As String = "" ' 組新增至資料庫的SQL指令
    Dim InsertSuccCount As Integer = 0 ' 匯入成功筆數
    Dim InsertFailCount As Integer = 0 ' 匯入失敗筆數

    Try
      FileUpload = CType(Me.FindControl("FileUploadQuestion"), FileUpload)
      FileName = FileUpload.PostedFile.FileName
      If FileName = "" Then
        ' ut.MessageBox("請選取一份欲匯入的Excel檔案!", MsgBoxStyle.Information, Me.Page)
        Exit Sub
      Else
        StartIndex = FileName.LastIndexOf(".") + 1
        If FileName.Substring(StartIndex, 3) <> "xls" Then
          ' ut.MessageBox("請確認欲匯入的檔案格式為Excel!", MsgBoxStyle.Information, Me.Page)
          Exit Sub
        End If
      End If

      ExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";Extended Properties=EXCEL 8.0"
      ExcelSelect = "SELECT * FROM [Sheet1$]"

      OLEConn = New OleDbConnection(ExcelConn)
      OLECommand = New OleDbCommand(ExcelSelect, OLEConn)
      OLEDataAdapter = New OleDbDataAdapter(OLECommand)
      OLEConn.Open()
      OLEDataAdapter.Fill(dsResult, "exceltogrid")
      OLEConn.Close()
      dtResult = dsResult.Tables("exceltogrid")

      If dtResult.Rows.Count > 0 Then
        For i As Integer = 0 To dtResult.Rows.Count 1
                 Field1 = dtResult.Rows(i).Item(0).ToString.Trim
            If Field1 <> "" Then
              Field2 = dtResult.Rows(i).Item(1).ToString.Trim
Field3 = Convert.ToInt32(dtResult.Rows(i).Item(2).ToString.Trim)
Field4 = dtResult.Rows(i).Item(3).ToString.Trim
Field5 = dtResult.Rows(i).Item(4).ToString.Trim
              Field6 = dtResult.Rows(i).Item(5).ToString.Trim
              Field7 = dtResult.Rows(i).Item(6).ToString.Trim
              Field8 = dtResult.Rows(i).Item(7).ToString.Trim

              SqlString = "INSERT INTO TestTable (Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8) VALUES ('" & Field1 & "', '" & Field2 & "', " & Field3 & ", '" & Field4 & "', '" & Field5 & "', '" & Field6 & "', '" & Field7 & "', '" & Field8 & "')"

' 呼叫貴單位新增資料庫的函數
              If ExecuteInsert(SqlString) Then
                InsertSuccCount += 1
              Else
                InsertFailCount += 1
              End If
            Else
              Exit For
            End If
        Next

        ' ut.MessageBox("匯入成功筆數:" & InsertSuccCount.ToString & ".失敗筆數:" & InsertFailCount.ToString, MsgBoxStyle.Information, Me.Page)
' 此處可寫重新查詢GridView的Code,讓user看到匯入成功後的結果
      End If
    Catch ex As Exception
      ' ut.MessageBox(ex.ToString, MsgBoxStyle.Information, Me.Page)
      Exit Sub
    End Try
End Sub
End Class

Excel格式: 

A
B
C
D
E
F
G
H
1
Field1 Title 
Field2 Title
Field3 Title
Field4 Title
Field5 Title
Field6 Title
Field7 Title
Field8 Title
2
A
AA
1
AAA
AAAA
AAAAA
AAAAAA
AAAAAAA
3
B
BB
2
BBB
BBBB
BBBBB
BBBBBB
BBBBBBB
4
C
CC
3
CCC
CCCC
CCCCC
CCCCCC
CCCCCCC
5
D
DD
4
DDD
DDDD
DDDDD
DDDDDD
DDDDDDD
6
E
EE
5
EEE
EEEE
EEEEE
EEEEEE
EEEEEEE