首先要有一父子架構的資料表
Private void SetTree()
{
// 取得有父子架構的資料
DataTable dt = GetData("Select ID, Name, FatherID From MyTable");
// 跑第一層迴圈建立根節點
foreach (DataRow row in dt.Rows)
{
TreeNode root = new TreeNode(rows["ID"].ToString(), rows["Name"].ToString());
AddChildNode(dt, root);
TreeView1.Nodes.Add(root);
}
}
// 跑遞迴建立子節點
Private void AddChildNode(DataTable dt, TreeNode node)
{
DataRow[] Rows = dt.Select(string.Format("FatherID = {0}", node.Value));
if (rows.Count() > 0)
{
foreach (DataRow row in Rows)
{
TreeNode newNode = new TreeNode(row["ID"].ToString(), rows["Name"].ToString());
node.ChildNodes.Add(newNode);
AddChildNode(dt, newNode);
}
}
}
2016年12月16日 星期五
使用ASP.NET 的 AJAX 時,顯示 Loading 字樣
HTML 部份
<asp:ScriptManager runat="server">
</asp:ScriptManager>
<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">
<ProgressTemplate>
<div class="modal">
<div class="center">
<img alt="" src="loader.gif" />
</div>
</div>
</ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="Button1" Text="Submit" runat="server" OnClick="Button1_Click" />
</ContentTemplate>
</asp:UpdatePanel>
.CS 部份
仍然依照原先的寫法
protected void Button1_Click(object sender, EventArgs e)
{
GetSomeData();
}
樣式的部份
<style type="text/css">
body
{
margin: 0;
padding: 0;
}
.modal
{
position: fixed;
z-index: 999;
height: 100%;
width: 100%;
top: 0;
background-color: Black;
filter: alpha(opacity=60);
opacity: 0.6;
-moz-opacity: 0.8;
}
.center
{
z-index: 1000;
margin: 300px auto;
padding: 10px;
width: 130px;
background-color: White;
border-radius: 10px;
filter: alpha(opacity=100);
opacity: 1;
-moz-opacity: 1;
}
.center img
{
height: 128px;
width: 128px;
}
</style>
2016年11月9日 星期三
Excel 巨集 - 自動編號
假設有一資料夾,每個檔案都要在第一個欄位塞入自動編號的值
Sub 新增第一欄為唯一序號()
'
' 新增第一欄為唯一序號 巨集
' 在Excel最左邊加上一新的欄位並給予唯一序號
'
'
For i = 2011 To 2016
Workbooks.Open Filename:= _
"C:\Users\Downloads\要加上自動編號\" & i & "NewData.xlsx"
Columns("A:A").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Select '選擇 A1
ActiveCell.FormulaR1C1 = "唯一值" ' 填入欄位名稱
Range("A2").Select '選擇 A2
ActiveCell.FormulaR1C1 = "1" '填入數字 1
Range("A3").Select '選擇 A2
ActiveCell.FormulaR1C1 = "2" '填入數字 2
Range("A2:A3").Select '選擇 A2和 A3
' 以上的動作都是用錄製的
n = ActiveCell.CurrentRegion.Rows.Count ' 找到目前指定的cell的最大列數
Range("A3").Activate
Selection.AutoFill Destination:=Range("A2:A" & n)
Range("A2:A" & n).Select
ActiveWorkbook.Save
ActiveWorkbook.Close
Next i
End Sub
Sub 新增第一欄為唯一序號()
'
' 新增第一欄為唯一序號 巨集
' 在Excel最左邊加上一新的欄位並給予唯一序號
'
'
For i = 2011 To 2016
Workbooks.Open Filename:= _
"C:\Users\Downloads\要加上自動編號\" & i & "NewData.xlsx"
Columns("A:A").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A1").Select '選擇 A1
ActiveCell.FormulaR1C1 = "唯一值" ' 填入欄位名稱
Range("A2").Select '選擇 A2
ActiveCell.FormulaR1C1 = "1" '填入數字 1
Range("A3").Select '選擇 A2
ActiveCell.FormulaR1C1 = "2" '填入數字 2
Range("A2:A3").Select '選擇 A2和 A3
' 以上的動作都是用錄製的
n = ActiveCell.CurrentRegion.Rows.Count ' 找到目前指定的cell的最大列數
Range("A3").Activate
Selection.AutoFill Destination:=Range("A2:A" & n)
Range("A2:A" & n).Select
ActiveWorkbook.Save
ActiveWorkbook.Close
Next i
End Sub
2016年10月11日 星期二
Html 上的 Table 匯出成 xls
HTML 部分
若 Table 中的某儲存格會有斷行的情況,則需在網頁的斷行語法加上特定的樣式 (mso-data-placement:same-cell;) 如下
<html>
<table id="myTable">
<tr>
<td>第一列第一欄<td>
<td>第一列第二欄<td>
<td>第一列第三欄<td>
</tr>
<tr>
<td>
第二列第一欄第一行<br
第二列第一欄第二行
<td>
<td>第二列第二欄<td>
<td>第二列第三欄<td>
</tr>
<tr>
<td>第三列第一欄<td>
<td>第三列第二欄<td>
<td>第三列第三欄<td>
</tr>
</table>
</html>
<input id="btnExport" onclick="ExportTable('myTable'); return false;" type="button" value="另存成 Excel" />
<解決方法一>
下列語法可將網頁上的特定 Table 下載為 Excel
<script>
function ExportTable(tableid)
{
var data_type = 'data:application/vnd.ms-excel';
var table_html = $(tableid)[0].outerHTML.replace(/ /g, '%20');
var a = document.createElement('a');
a.href = data_type + ', ' + table_html;
a.download = '下載.xls';
a.click();
}
</script>
<解決方法二> 個人偏好這個方式
<script>
var table_print;
function ExportTable(tableid, removeLastColCount) {
//getting data from our table
table_print = $('#' + tableid)[0].cloneNode(true); // copy 一份畫面上的table,再針對這個table 做處理
deleteColumn(removeLastColCount);
tableToExcel(table_print, '')
}
// 刪除倒數幾欄 (因為多個欄位是功能欄)
function deleteColumn(lastColCount) {
for (var i = 0; i < table_print.rows.length; i++) {
for (var k = 0; k < lastColCount; k++) {
// 刪除最後一欄(因為有合併列,所以只能用這個方式)
table_print.rows[i].deleteCell(table_print.rows[i].cells.length - 1);
//table_print.rows[i].cells[table_print.rows[i].cells.length - 1].innerHTML = "";
}
}
}
var tableToExcel = (function () {
var uri = 'data:application/vnd.ms-excel;base64,'
, template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table border="1px">{table}</table></body></html>'
, base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
, format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) }
return function (table, name) {
if (!table.nodeType) table = document.getElementById(table)
var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML }
window.location.href = uri + base64(format(template, ctx))
}
})()
</script>
參考來源:http://stackoverflow.com/questions/36040942/how-to-export-a-html-table-to-excel-supported-by-chrome-and-ie
若 Table 中的某儲存格會有斷行的情況,則需在網頁的斷行語法加上特定的樣式 (mso-data-placement:same-cell;) 如下
<html>
<table id="myTable">
<tr>
<td>第一列第一欄<td>
<td>第一列第二欄<td>
<td>第一列第三欄<td>
</tr>
<tr>
<td>
第二列第一欄第一行<br
style=
'mso-data-placement:same-cell;'
/
>第二列第一欄第二行
<td>
<td>第二列第二欄<td>
<td>第二列第三欄<td>
</tr>
<tr>
<td>第三列第一欄<td>
<td>第三列第二欄<td>
<td>第三列第三欄<td>
</tr>
</table>
</html>
<input id="btnExport" onclick="ExportTable('myTable'); return false;" type="button" value="另存成 Excel" />
<解決方法一>
下列語法可將網頁上的特定 Table 下載為 Excel
<script>
function ExportTable(tableid)
{
var data_type = 'data:application/vnd.ms-excel';
var table_html = $(tableid)[0].outerHTML.replace(/ /g, '%20');
var a = document.createElement('a');
a.href = data_type + ', ' + table_html;
a.download = '下載.xls';
a.click();
}
</script>
<解決方法二> 個人偏好這個方式
<script>
var table_print;
function ExportTable(tableid, removeLastColCount) {
//getting data from our table
table_print = $('#' + tableid)[0].cloneNode(true); // copy 一份畫面上的table,再針對這個table 做處理
deleteColumn(removeLastColCount);
tableToExcel(table_print, '')
}
// 刪除倒數幾欄 (因為多個欄位是功能欄)
function deleteColumn(lastColCount) {
for (var i = 0; i < table_print.rows.length; i++) {
for (var k = 0; k < lastColCount; k++) {
// 刪除最後一欄(因為有合併列,所以只能用這個方式)
table_print.rows[i].deleteCell(table_print.rows[i].cells.length - 1);
//table_print.rows[i].cells[table_print.rows[i].cells.length - 1].innerHTML = "";
}
}
}
var tableToExcel = (function () {
var uri = 'data:application/vnd.ms-excel;base64,'
, template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table border="1px">{table}</table></body></html>'
, base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) }
, format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) }
return function (table, name) {
if (!table.nodeType) table = document.getElementById(table)
var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML }
window.location.href = uri + base64(format(template, ctx))
}
})()
</script>
參考來源:http://stackoverflow.com/questions/36040942/how-to-export-a-html-table-to-excel-supported-by-chrome-and-ie
2016年9月8日 星期四
SQL SERVER 使用條件 IN 太慢時
如果要查詢某些資料在某資料表時,可以使用
語法一:當資料太大量時不要用,請使用語法三
Select * From TableA
Where TableA.Field_1 IN (Select Field_1 From TableB)
語法二:當資料太大量時不要用,請使用語法三
Select * From TableA
Inner Join TableB On TableA.Field_1 = TableB_Field1
Inner Join TableB On TableA.Field_1 = TableB_Field1
語法三:
Select * From TableA as A
Where Exists (Select Field_1 From TableB Where A.Field_1 = Field1)
2016年9月2日 星期五
DataTable.Select 改成 LINQ 的方式,速度快上至少 10 倍
當DataTable的資料列太多時,使用 DataTable.Select() 來篩選資料的速度很慢,
此時可以改用 LINQ,速度上至少快上 10 倍之多
DataTable dt = GetDataTable(); ← 取得資料
// 假設 dt 的欄位 (ID<int>, FirstName<string>, LastName<string>)
// 使用 Select 方法時
DataRow[] = dt.Select("FirstName = 'xxx'");
// 使用 LINQ 方法時
var q = from p in dt.AsEnumerable()
where p.Field<string>("FirstName").ToString() == "xxx"
select p;
q 可能會找不到資料,
出現下列錯誤
System.InvalidOperationException: 來源未包含 DataRow。
於 System.Data.DataTableExtensions.LoadTableFromEnumerable[T](IEnumerable`1 source, DataTable table, Nullable`1 options, FillErrorEventHandler errorHandler)
於 System.Data.DataTableExtensions.CopyToDataTable[T](IEnumerable`1 source)
所以如果要將 q 轉換為 DataTable,
需先判斷 q.Count() 是否為 0
if (q.Count() > 0)
q.CopyToDataTable()
此時可以改用 LINQ,速度上至少快上 10 倍之多
DataTable dt = GetDataTable(); ← 取得資料
// 假設 dt 的欄位 (ID<int>, FirstName<string>, LastName<string>)
// 使用 Select 方法時
DataRow[] = dt.Select("FirstName = 'xxx'");
// 使用 LINQ 方法時
var q = from p in dt.AsEnumerable()
where p.Field<string>("FirstName").ToString() == "xxx"
select p;
q 可能會找不到資料,
出現下列錯誤
System.InvalidOperationException: 來源未包含 DataRow。
於 System.Data.DataTableExtensions.LoadTableFromEnumerable[T](IEnumerable`1 source, DataTable table, Nullable`1 options, FillErrorEventHandler errorHandler)
於 System.Data.DataTableExtensions.CopyToDataTable[T](IEnumerable`1 source)
所以如果要將 q 轉換為 DataTable,
需先判斷 q.Count() 是否為 0
if (q.Count() > 0)
q.CopyToDataTable()
2016年7月29日 星期五
SQL Server 將資料匯出成 Insert into 指令碼
如果一直要建立測試資料庫,除了可以將 Create Table 的語法保留下來之外,對於資料,若也要保留的話,可以使用 SQL Server 內建的"產生指令碼"功能。
操作步驟如下
可以選擇特定或全部物件來建立指令碼
可以選擇將物件產生的指令碼分別存成單一檔案或分開存
點擊上圖的"進階"後,選擇下圖中的"結構描述和資料"
完成後,只要執行產生的 .sql,就可以將資料直接寫進資料表,而不用手動建資料或匯入資料了。
2016年7月22日 星期五
SQL 跑迴圈
【迴圈的計數方式純次數】
如果要像程式語言
FOR (INT i = 0; i<= 10; i++)
{
}
可以寫成
DECLARE @i INT
DECLARE @LoopCount INT
SET @i = 0
SET @LoopCount = 10
WHILE (@i <= @LoopCount)BEGIN
-- 做想做的事
SET @i = @i +1
END
【迴圈的計數方式是從資料表來的】
假設查詢出來的資料表有兩個欄位(Col1, Col2),這兩個欄位在迴圈中都要使用
-- 先定義兩個變數,用來存放每列的 Col1、Col2 的資料
DECLARE @Col1 INT(50)
DECLARE @Col2 NVARCHAR(50)
-- 定義一個指標MyCursor 給 查詢出來的資料表
DECLARE MyCursor CURSOR FOR
SELECT Col1, Col2 FROM Table1
-- 開啟指標
OPEN MyCursor
-- 取出第一筆指標,將指標內的資料塞入變數(指標內的資料需照欄位順序給)
FETCH NEXT FROM MyCursor INTO @Col1, @Col2
WHILE @@FETCH_STATUS = 0 -- 當取出指標中的資料成功時
BEGIN
// 這邊就可以針對每筆資料做什麼事
PRINT @Col1; // 比方直接顯示出來
PRINT CONCAT(@Col1, @Col2); // 比方把兩個資料的變數串在一起
// 取出下一筆指標,並將指標內的資料塞入變數
FETCH NEXT FROM MyCursor INTO @Col1, @Col2
END
CLOSE MyCursor -- 關閉指標 DEALLOCATE MyCursor -- 移除指標參考
2016年7月21日 星期四
在 WinForm 下,ComboBox 下拉選單內容太長時,文字會被切掉
在 WinForm 下,ComboBox 下拉選單內容太長時,文字會被切掉
// 動態改變顯示的長度
// 動態改變顯示的長度
private void Form1_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add("myID"); dt.Columns.Add("myValue"); dt.Rows.Add(new object[] { "1", "Bermuda 百慕達" }); dt.Rows.Add(new object[] { "2", "Bosnia and Herzegovina 波希尼亞及赫塞哥維那" }); cbxExamination.DataSource = dt; cbxExamination.DisplayMember = "myValue"; cbxExamination.ValueMember = "myID"; // 在資料繫結後加入以下語法 SetDropDownWidth(comboCountry); }
/// <summary> /// 設定下拉選單下拉後的長度為最長內容的長度 /// </summary> /// <param name="myCombo"></param> /// <returns></returns> private void SetDropDownWidth(ComboBox myCombo) { int maxSize = 0; System.Drawing.Graphics g = CreateGraphics(); for (int i = 0; i < myCombo.Items.Count; i++) { myCombo.SelectedIndex = i; SizeF size = g.MeasureString(myCombo.Text, myCombo.Font); if (maxSize < (int)size.Width) { maxSize = (int)size.Width; } } myCombo.DropDownWidth = myCombo.Width; if (myCombo.DropDownWidth < maxSize) { myCombo.DropDownWidth = maxSize; } }結果如下
2016年7月13日 星期三
要在ASP.NET 中使用 MathWorks.MATLAB.NET.Arrays.MWNumericArray 這個class時
使用 MathWorks.MATLAB.NET.Arrays.MWNumericArray 時,要注意的事項
1. 需將 MWArray.dll 加入參考(64位元的預設路徑為 Matlab Rumtime 安裝路徑 C:\Program Files\MATLAB\MATLAB Runtime\v90\toolbox\dotnetbuilder\bin\win64\v2.0 )
2. 需要在 64 位元的環境下執行
程式碼:MWNumericArray Threadhold = new MWNumericArray(100);
在Windows Form 下可以正常執行
[Exception: 'MathWorks.MATLAB.NET.Arrays.MWNumericArray' 的類型初始設定式發生例外狀況。]
因為 MWNumericArray 這個 class 需要在 64位元的 IIS 下執行,設定方法如下:
2016年7月11日 星期一
Javascript 取代字串
replace 只會取代第一個找到的目標
var str = "2016/07/11建立字串";
alert(str.replace("0","零"));
結果會是 "2零16/07/11建立字串"
要取代全部找到的目標,需用RegExp
var str = "2016/07/11建立字串";
alert(str.replace(/0/g,"零"));
結果會是 "2零16/零7/11建立字串"
如果要尋找的目標是變數的話
function replaceAll(str, searchText, newText)
{
var reg = new RegExp(searchText,"g");
return str.replace(reg, newText);
}
執行時
alert(replaceAll("2016/07/11建立字串","0","零"));
var str = "2016/07/11建立字串";
alert(str.replace("0","零"));
結果會是 "2零16/07/11建立字串"
要取代全部找到的目標,需用RegExp
var str = "2016/07/11建立字串";
alert(str.replace(/0/g,"零"));
結果會是 "2零16/零7/11建立字串"
如果要尋找的目標是變數的話
function replaceAll(str, searchText, newText)
{
var reg = new RegExp(searchText,"g");
return str.replace(reg, newText);
}
執行時
alert(replaceAll("2016/07/11建立字串","0","零"));
2016年7月1日 星期五
C# 在 DataTable 下 Distinct
在資料庫中,語法可以這麼下
Select Distinct [欄位名稱1], [欄位名稱2] From Table1
在C# 的 DataTable 中下 Distinct,可以這麼寫
DataTable dtDistinct =
dtOri.DefaultView.ToTable(true, new string[] { "欄位名稱1", "欄位名稱2" });
Select Distinct [欄位名稱1], [欄位名稱2] From Table1
在C# 的 DataTable 中下 Distinct,可以這麼寫
DataTable dtDistinct =
dtOri.DefaultView.ToTable(true, new string[] { "欄位名稱1", "欄位名稱2" });
標籤:
C#,
DataTable,
Distinct,
SQL Server
2016年6月17日 星期五
想要將表格中的某個欄位更改成另一個表格中的欄位時,可以怎麼做?
範例:(有點爛的範例)
資料表名稱:TABLE1
資料表欄位:UserID[PK]、身高
資料表名稱:TABLE2
資料表欄位:UserID[PK]、體重
方法 1:如果只是要檢視的話,可以建立 View,語法如下
SELECT A.UserID, 身高, 體重
FROM [TABLE1] AS A
INNER JOIN [TABLE2] AS B ON A.UserID = B.UserID
方法 2:要將 [TABLE2] 表格刪除,然後只保留 [TABLE1]
步驟 1: [TABLE1] 新增一個欄位 - 體重
步驟 2: 執行以下語法
UPDATE A SET A.體重 = B.體重
FROM [TABLE1] AS A
INNER JOIN [TABLE2] AS B ON A.UserID = B.UserID
資料表名稱:TABLE1
資料表欄位:UserID[PK]、身高
資料表名稱:TABLE2
資料表欄位:UserID[PK]、體重
方法 1:如果只是要檢視的話,可以建立 View,語法如下
SELECT A.UserID, 身高, 體重
FROM [TABLE1] AS A
INNER JOIN [TABLE2] AS B ON A.UserID = B.UserID
方法 2:要將 [TABLE2] 表格刪除,然後只保留 [TABLE1]
步驟 1: [TABLE1] 新增一個欄位 - 體重
步驟 2: 執行以下語法
UPDATE A SET A.體重 = B.體重
FROM [TABLE1] AS A
INNER JOIN [TABLE2] AS B ON A.UserID = B.UserID
2016年5月25日 星期三
Microsoft.ACE.OLEDB.12.0' 提供者並未登錄於本機電腦上
執行環境:OS:Win 7、SQL Server Manager Studio、Office 2010
問題:執行SQL Server 匯出/匯入精靈,在匯入 *.xlsx 時遇到 'Microsoft.ACE.OLEDB.12.0' 提供者並未登錄於本機電腦上。(System Data)
解決方式:在執行精靈的那台電腦安裝 "2007 Office system 驅動程式:資料連線元件",即可。
檔案下載:
.2007 Office system 驅動程式:資料連線元件
.Microsoft Access Database Engine 2010 可轉散發套件
註1:網路上說安裝"Microsoft Access Database Engine 2010 可轉散發套件",可解決,但是我安裝後仍然有問題(不知道跟什麼有關)
註2:下載時需注意,因為"2007 Office system 驅動程式:資料連線元件" 和 "Microsoft Access Database Engine 2010 可轉散發套件",(如果下載32位元版本)下載後的檔名都一樣
問題:執行SQL Server 匯出/匯入精靈,在匯入 *.xlsx 時遇到 'Microsoft.ACE.OLEDB.12.0' 提供者並未登錄於本機電腦上。(System Data)
解決方式:在執行精靈的那台電腦安裝 "2007 Office system 驅動程式:資料連線元件",即可。
檔案下載:
.2007 Office system 驅動程式:資料連線元件
.Microsoft Access Database Engine 2010 可轉散發套件
註1:網路上說安裝"Microsoft Access Database Engine 2010 可轉散發套件",可解決,但是我安裝後仍然有問題(不知道跟什麼有關)
註2:下載時需注意,因為"2007 Office system 驅動程式:資料連線元件" 和 "Microsoft Access Database Engine 2010 可轉散發套件",(如果下載32位元版本)下載後的檔名都一樣
2016年5月5日 星期四
Access 資料取得方式 In C#
如果要將單一個資料表包含100萬筆資料的Access檔案讀到DataTable,必須要有以下兩點
1.在 x64 環境下才能達到
2.連接字串中的Provider 要用 Microsoft.ACE.OLEDB.12.0,例:
<add name="connAccess" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Access檔案路徑(包含副檔名);Persist Security Info=False"/>
/// <summary>
/// 取得Access的表格名稱清單
/// </summary>
/// <returns></returns>
public static KeyValuePair<int, string>[] GetTableNames()
{
List<string> listTableName = new List<string>();
try
{
if (filePath.Length == 0)
throw new Exception("未提供檔案(*.mdb)路徑.");
ADODB.Connection connection = new ADODB.Connection();
ADOX.Catalog tableLog = new ADOX.Catalog();
try
{
connection.Open(defaultConnectionString.Replace("#FilePath#", filePath));
tableLog.ActiveConnection = connection;
for (int i = 0; i < tableLog.Tables.Count; i++)
{
if (((dynamic)tableLog.Tables[i]).Type == "TABLE")
{
listTableName.Add(tableLog.Tables[i].Name);
}
}
}
finally
{
if (connection != null)
connection.Close();
}
}
catch (Exception ex)
{
throw ex;
}
KeyValuePair<int,string>[] ret = new KeyValuePair<int,string>[listTableName.Count];
for (int i = 0; i < listTableName.Count; i++)
{
ret[i] = new KeyValuePair<int, string>(i, listTableName[i]);
}
return ret;
}
1.在 x64 環境下才能達到
2.連接字串中的Provider 要用 Microsoft.ACE.OLEDB.12.0,例:
<add name="connAccess" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Access檔案路徑(包含副檔名);Persist Security Info=False"/>
/// <summary>
/// 取得Access的表格名稱清單
/// </summary>
/// <returns></returns>
public static KeyValuePair<int, string>[] GetTableNames()
{
List<string> listTableName = new List<string>();
try
{
if (filePath.Length == 0)
throw new Exception("未提供檔案(*.mdb)路徑.");
ADODB.Connection connection = new ADODB.Connection();
ADOX.Catalog tableLog = new ADOX.Catalog();
try
{
connection.Open(defaultConnectionString.Replace("#FilePath#", filePath));
tableLog.ActiveConnection = connection;
for (int i = 0; i < tableLog.Tables.Count; i++)
{
if (((dynamic)tableLog.Tables[i]).Type == "TABLE")
{
listTableName.Add(tableLog.Tables[i].Name);
}
}
}
finally
{
if (connection != null)
connection.Close();
}
}
catch (Exception ex)
{
throw ex;
}
KeyValuePair<int,string>[] ret = new KeyValuePair<int,string>[listTableName.Count];
for (int i = 0; i < listTableName.Count; i++)
{
ret[i] = new KeyValuePair<int, string>(i, listTableName[i]);
}
return ret;
}
2016年2月18日 星期四
關鍵字Highlight
// 將內容加上hightlight之後回傳
// Content: 原文
// HighlightText: 要反白的文字
private string AddHightlight(string Content, string HightlightText)
{
// 用正則表示法找出要highlight的字和位置
MatchCollection mc =new Regex(string.Format(@"{0}\b", HightlightText), RegexOptions.IgnoreCase).Matches(Content);
// 從最後一個以移除再加入的方式取代原內容
for (int mcIndex = mc.Count-1; mcIndex >= 0; mcIndex--)
{
Content = Content.Remove(mc[mcIndex].Index, mc[mcIndex].Value.Trim().Length);
Content = Content.Insert(mc[mcIndex].Index, string.Format(@"<span style=""background-color:blue;color:white;"">{0}</span>", mc[mcIndex].Value.Trim()));
}
return Content;
}
註:highlight 的樣式要寫在 程式碼中,不能用 class 的方式,好像有時會套不到
// Content: 原文
// HighlightText: 要反白的文字
private string AddHightlight(string Content, string HightlightText)
{
// 用正則表示法找出要highlight的字和位置
MatchCollection mc =new Regex(string.Format(@"{0}\b", HightlightText), RegexOptions.IgnoreCase).Matches(Content);
// 從最後一個以移除再加入的方式取代原內容
for (int mcIndex = mc.Count-1; mcIndex >= 0; mcIndex--)
{
Content = Content.Remove(mc[mcIndex].Index, mc[mcIndex].Value.Trim().Length);
Content = Content.Insert(mc[mcIndex].Index, string.Format(@"<span style=""background-color:blue;color:white;"">{0}</span>", mc[mcIndex].Value.Trim()));
}
return Content;
}
註:highlight 的樣式要寫在 程式碼中,不能用 class 的方式,好像有時會套不到
訂閱:
文章 (Atom)