2009年10月30日 星期五

太實用的文章,有使用匯入excel功能一定要看。匯入Excel所有遇到的情況!!!!

引用自:http://blog.miniasp.com/post/2008/08/How-to-read-Excel-file-using-OleDb-correctly.aspx

當發現利用oledb匯入excel到資料庫發生某些欄位無法匯入(空白)或某些值進不去時(字串)


"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Excel.xls;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";

1.Excel 8.0 : Excel 8.0 是 Office 97 的 Excel 格式,這個格式從 Excel 97 ~ Excel 2003 都相容
2.HDR ( HeaDer Row ): 若指定值為 Yes,代表 Excel 檔中的工作表第一列是欄位名稱
若指定值為 No,代表 Excel 檔中的工作表第一列就是資料了,沒有欄位名稱
3.IMEX ( IMport EXport mode ): IMEX 有三種模式,分別讀寫行為也不同,容後再述:
0 is Export mode
1 is Import mode
2 is Linked mode (full update capabilities)
當 IMEX=0 時為「匯出模式」,這個模式開啟的 Excel 檔案只能用來做「寫入」用途。
當 IMEX=1 時為「匯入模式」,這個模式開啟的 Excel 檔案只能用來做「讀取」用途。
當 IMEX=2 時為「連結模式」,這個模式開啟的 Excel 檔案可同時支援「讀取」與「寫入」用途。
所以當我們要開發 Excel 檔案匯入功能時,正確的 IMEX 設定應該是 1 才對,不過就算設定 IMEX=1 還不夠,還有一些需要注意的地方!

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Excel 位置,這裡有兩個非常重要的設定:
1. ImportMixedTypes
在 Excel 機碼中 ImportMixedTypes 的預設值為 Text,代表當你讀入 Excel 檔案時若每一列的資料格式不一致的話,
Jet Engine 預設會將欄位的資料格式自動轉成文字(Text)格式!
2. TypeGuessRows
在 Excel 機碼中 TypeGuessRows 的預設值為 8,代表當你讀入 Excel 檔案時若每一列的資料格式不一致的話,Jet Engine 會先讀取前 8 列的資料,用已判斷之後的資料格式是否固定。假設若前 8 列的資料都是「日期」格式,那麼在第 8 列之後的資料 Jet Engine 會自動解析成「日期」格式,但只要遇到有的資料不是「日期」格式時,就會回傳 Null 給 Jet Engine。要解決這個問題也很容易,只要將 Excel 機碼中 TypeGuessRows 的值改成 0 即可,只是若你匯入的資料量蠻大的話可能會影響資料讀取時的效能,因為 Jet Engine 會將所有資料讀完才會判斷出每個欄位應該用什麼資料格式。

修改完後,就不會有Datatable讀excel讀不到(沒設定IMEX = 1),
或是只決定前8行資料的格式就判定Datatable欄位的格式(修改TypeGuessRows值為0)

2009年10月29日 星期四

解決 DIV 包 DIV 超出範圍問題

<style type="text/css">
#mastercontent { position:relative; width:100%;height :100%;border-right: #ff3300 thin solid; border-top: #ff3300 thin solid; border-left: #ff3300 thin solid; border-bottom:#ff3300 thin solid;}
#primary { position:absolute; margin-left: 200px; width:192px; border-right: #00cc66 thin solid; border-top: #00cc66 thin solid; border-left: #00cc66 thin solid; border-bottom:#00cc66 thin solid;}
#secondary { position:absolute; width:192px; border-right: #0099cc thin solid; border-top: #0099cc thin solid; border-left: #0099cc thin solid; border-bottom:#0099cc thin solid;}
</style>
<div  id = "mastercontent">
<div id = "primary">
<br/><br/><br/><br/>
</div>
<div id = "secondary">
<br/><br/><br/><br/><br/><br/><br/><br/><br/>
</div>
</div>
出現了上圖的問題,又不想設定父DIV的高度(不同解析度會出現捲軸) 如果加上下面script即可解決
<script type="text/javascript">
var h = document.documentElement.clientHeight ;  /*先抓畫面上可視範圍的高度*/
var obj1= document.getElementById ("mastercontent");
var obj2= document.getElementById ("primary");
var obj3= document.getElementById ("secondary");
obj1.style.height = h -60; /*設定div高度*/
obj2.style.height = h -66;
obj3.style.height = h -66;
</script>

2009年10月21日 星期三

DropDownlist 內可打字


前陣子有個需求希望web裡的 DropDownlist像Excel一樣可以打字
上網搜尋了一下 終於有解
不過這不是真正的元件
雖然我已經把他寫成一個WebUserControl可以使用
他的架構是這樣:

2009年10月16日 星期五

迴圈處理畫面上的元件

當畫面上有多個元件 程式要同時塞值進去時,就可使用迴圈控制 不需要指定個別元件給值 '畫面上有4個TextBox
Dim txt() As String = {"TextBox1", "TextBox2", "TextBox3", "TextBox4"}
Dim txt1(txt.Length) As TextBox
For i As Integer = 0 To txt.Length - 1
txt1(i) = form1.FindControl(txt(i))
txt1(i).Text = i
Next

2009年10月14日 星期三

Store Procedures with MSSQL and ASP.NET

(MSSQL)
CREATE PROCEDURE [dbo].[test] --新增預存程序test並給一輸入參數
@tool_no varchar(50)
AS
   SELECT  [Tool_No],[Serial_No],[Tool_Revision]
   FROM [ACF_Tooling].[dbo].[Main]
   WHERE Tool_No = @tool_no
GO
--exec test 'AAA'; --執行預存程式並給定輸入值
(ASP.NET)
Dim ToolingConnectionString As New ConnectionString
Dim conn As New SqlConnection(ToolingConnectionString.ToolingConnectionString)
Dim sqlcmd As New SqlCommand("test", conn)
Dim dt As New DataTable
sqlcmd.CommandType = CommandType.StoredProcedure
sqlcmd.Parameters.AddWithValue("@tool_no", TextBox1.Text)
conn.Open()
dt.Load(sqlcmd.ExecuteReader)
conn.Close()
If dt.Rows.Count > 0 Then
   GridView1.DataSource = dt
   GridView1.DataBind()
End If

2009年10月13日 星期二

Silverlight 使用心得

最近由於公司內部要自辦訓練課程,
腦子突然想到Silverlight這套工具,
畢竟這也算是比較新的技術可以跟同事分享,
並且對一直想學Silverlight的我,順便也有學習的機會。
微軟在2007年7月推出Silverlight 1.0,短短的2年內已經到3.0目前
1.0的版本我有去嘗試,只能以重創形容...
一直到現在使用visual studio 2008(sp1) + Silverlight 2.0 + Expression Blend 2.0
總算玩出個結果,
只能說微軟剛推出的東西,真的不要輕易嘗試。
或許1.0的相容性及支援太差,當我使用2.0發現很好上手。
不過第一次使用還是吃了不少苦頭。
公司裡面目前還是使用Visual Studio 2005 而為了使用Silverlight 2.0 去借了VS2008,
還好公司有這軟體,不過是中文版的,
上網搜尋了一下Silverlight的環境安裝,
下載silverlight_sdk,結果失敗(1)...
原來是要相同語言,因為我的Visual Studio 2008是繁體中文版,
好不容易安裝好後,開始使用時,發現沒有網路上看到的Silverlight樣版,
原來還要安裝Silverlight_Tools,
結果失敗(2)...
原因是Silverlight_Tool線上安裝,結果被公司的proxy擋住。
總算安裝好Silverlight_Tools也看到了Silverlight樣版,
這時當然想使用一下Expression Blend 這套軟體,看人家介紹可以VS跟Blend互動,
好像不錯玩,結果失敗(3)...
原因是我裝的是Expression Blend 1.0,必須要相同版本才行,
還好公司剛好有Expression Blend 2.0。
當我在VS上在XAML檔上按右鍵,看到了"於Expression Blend中開啟",
結果失敗(4)...
原因查了老半天,原來Blend也要裝sp1,
安裝完後,測試的結果還算滿意,
其實這是一套很好的技術,但對於比較沒網頁基礎的人有點難度,
網路上的資源是不少,不過不是原文的,就是那幾篇文章(高手寫的文章對入門的新手有點難度),
市面上的書也就那幾本,大部分整本都寫code,
突然想到以前有一本書介紹說,為什麼很多書用的範例都打到記事本上
難道真的有人用記事本開發ASP.NET?
真搞不懂那麼多人連環境都架不起來了,市面上要找這樣的入門書好難。