由於目前工作地方大部分程式還是建構在EXCEL中,使用VBA撈取資料庫資料並做資料運算。但是,將資料撈回到EXCEL再用VBA做運算效能比較差且又擔心USER在運算邏輯的程式亂做修改,造成資料有誤。想說改用Excel呼叫Web Service,把邏輯運算都靠Web service做好,再把整包資料丟回到EXCEL這樣就可以避免上述一些問題。
不過,由於在.NET環境中主要都是ADO.NET架構,其回傳類型並未有早期的ADO架構中的RecordSet
,所以,除了在Server端將資料計算完成,還必須想辦法Output資料可以讓Excel使用,因次,將必須把Dataset
或Datatable
轉換成RecordSet
,讓EXCEL做處理
在專案內參考兩個物件,後面將必須使用這兩個物件做轉換
ADO與ADO.NET型別轉換
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071switch (dt.Columns[i].DataType.FullName){case "System.Boolean":fieldType = ADODB.DataTypeEnum.adBoolean;break;case "System.Byte":fieldType = ADODB.DataTypeEnum.adUnsignedTinyInt;break;case "System.Char":fieldType = ADODB.DataTypeEnum.adWChar;dfieldLength = dt.Columns[i].MaxLength;if (dfieldLength == -1){dfieldLength = 255;}break;case "System.DateTime":fieldType = ADODB.DataTypeEnum.adDate;break;case "System.Decimal":fieldType = ADODB.DataTypeEnum.adCurrency;break;case "System.Double":fieldType = ADODB.DataTypeEnum.adDouble;break;case "System.Int16":fieldType = ADODB.DataTypeEnum.adSmallInt;break;case "System.Int32":fieldType = ADODB.DataTypeEnum.adInteger;break;case "System.Int64":fieldType = ADODB.DataTypeEnum.adInteger;break;case "System.SByte":fieldType = ADODB.DataTypeEnum.adSmallInt;break;case "System.Single":fieldType = ADODB.DataTypeEnum.adSingle;break;case "System.String":// 因為 MDB 檔的文字欄位最大長度是 255// 所以超過時,以 memo 欄位存放if (dt.Columns[i].MaxLength > 255){fieldType = ADODB.DataTypeEnum.adLongVarWChar;dfieldLength = 0;}else{fieldType = ADODB.DataTypeEnum.adVarWChar;dfieldLength = dt.Columns[i].MaxLength;if (dfieldLength == -1){dfieldLength = 255;}}break;case "System.UInt16":fieldType = ADODB.DataTypeEnum.adSmallInt;break;case "System.UInt32":fieldType = ADODB.DataTypeEnum.adInteger;break;case "System.UInt64":fieldType = ADODB.DataTypeEnum.adInteger;break;case "System.Byte[]":fieldType = ADODB.DataTypeEnum.adLongVarBinary;break;}
完整程式碼