主要的錯誤訊息應該是這個
檔案 'FrankieDB' 無法還原到 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS_BIN\MSSQL\DATA\FrankieDB.mdf'。請使用 WITH MOVE 來識別該檔案的有效位置。
訊息 3119,層級 16,狀態 1,行 1
記得在 SQL Server 2000 的時候,
用 Enterprise Manager 來 Restore 的時候有地方可以改丫!
2011年11月24日 星期四
2011年11月18日 星期五
SQL Datetime Convert Varchar
每次要用的時候都要找,所以乾脆記下來好了!
其實我只要
YYYY-MM-DD (2008-06-26):
CONVERT(CHAR(10), GETDATE(), 120)
或是
MM/DD/YYYY (06/26/2008):
CONVERT(CHAR(10), GETDATE(), 101)
這個可能也用的到
YYYYMMDD (20110314):
CONVERT(CHAR(8), GETDATE(), 112)
參考網址:SQL 日期時間轉換 (Convert Date Time to string)
其實我只要
YYYY-MM-DD (2008-06-26):
CONVERT(CHAR(10), GETDATE(), 120)
或是
MM/DD/YYYY (06/26/2008):
CONVERT(CHAR(10), GETDATE(), 101)
這個可能也用的到
YYYYMMDD (20110314):
CONVERT(CHAR(8), GETDATE(), 112)
參考網址:SQL 日期時間轉換 (Convert Date Time to string)
2011年11月4日 星期五
Microsoft.Jet.OLEDB.4.0提供者並未登錄於本機電腦上
今天要用 C# 透過 OLEDB 開啟 Excel 檔案讀取資料,
上網查了一下連接字串大概是這樣寫的
【Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.xls;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"】
這一篇對於連接字串的說明說的比較詳細【透過 OleDb 精準讀入 Excel 檔的方法】
所以我就依樣畫葫蘆建立一個 OleDbConnection 的變數開始連接 Excel 吧!
程式如下:
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR={1};IMEX=1\"";
connString = string.Format(connString, fileName, hasHeader ? "Yes" : "No");
OleDbConnection conn = new OleDbConnection(connString);
conn.Open();
原本以為這樣就結束了,沒想到卻出現了下面這個錯誤訊息!
上網查了一下連接字串大概是這樣寫的
【Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.xls;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"】
這一篇對於連接字串的說明說的比較詳細【透過 OleDb 精準讀入 Excel 檔的方法】
所以我就依樣畫葫蘆建立一個 OleDbConnection 的變數開始連接 Excel 吧!
程式如下:
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR={1};IMEX=1\"";
connString = string.Format(connString, fileName, hasHeader ? "Yes" : "No");
OleDbConnection conn = new OleDbConnection(connString);
conn.Open();
原本以為這樣就結束了,沒想到卻出現了下面這個錯誤訊息!
2011年10月27日 星期四
C# 的 Bookmark 怎麼用?
記得在 Delphi 的時候我們可以對 DataTable 設定書籤,
但是到了 C# 好像就沒有這招可以用了耶?
先說說書籤的用途好了,
簡單的說就是先記錄下來目前這筆 row 的位置,
然後等等可以快速地回到這筆 row 來!
聽起來很簡單吧!
是呀!但是我就是沒找到有 bookmark 的屬性或是函數,
也沒有看到疑似 bookmark 的屬性或是函數咧?
所以決定試一下看看!
然後就寫出了下面的東東:
但是到了 C# 好像就沒有這招可以用了耶?
先說說書籤的用途好了,
簡單的說就是先記錄下來目前這筆 row 的位置,
然後等等可以快速地回到這筆 row 來!
聽起來很簡單吧!
是呀!但是我就是沒找到有 bookmark 的屬性或是函數,
也沒有看到疑似 bookmark 的屬性或是函數咧?
所以決定試一下看看!
然後就寫出了下面的東東:
- DataRow bookmark = CurrentRow;
- grid.BeginUpdate();
- try
- {
- foreach (DataRow dr in dataTable.Rows)
- {
- CurrentRow = dr;
- DoBringSQL();
- }
- }
- finally
- {
- CurrentRow = bookmark;
- grid.EndUpdate();
- }
2011年10月21日 星期五
(SQL Server)複寫不支援透過伺服器別名、IP 位址或任何其他替代名稱來進行連接
這兩天再設定 SQL Server replication 的時候出現這個錯誤!
原因大概是因為我之前裝好了 SQL Server 之後又跑去改了電腦名稱,
假設原來的電腦名稱叫做 Frankie-Old 好了,
新的電腦名稱叫做 Frankie-New,
所以雖然我用 Microsoft SQL Server Management Studio 可以用 Frankie-New 連上 SQL Server,
但是我用另外一台電腦要設定 replication 連到 Frankie-New 的時候卻會跳出類似下面的訊息,
【複寫不支援透過伺服器別名、IP 位址或任何其他替代名稱來進行連接。Frankie-Old】
真是尷尬呀!
上網 google 了一下,
我們可以下 SELECT @SERVERNAME 來得知我們 SQL Server 的名字,
我查了一下果然是 Frankie-Old 呀!真是尷尬呀~~~
我們可以下 sp_dropserver 'Frankie-Old' 來刪除舊的名稱,
然後 sp_addserver 'Frankie-New', 'local' 來新增,
然後重新啟動這台 SQL Server 吧!
再重新下個 SELECT @@SERVERNAME 就可以看到妳新設定的名字啦!
喔耶!
原因大概是因為我之前裝好了 SQL Server 之後又跑去改了電腦名稱,
假設原來的電腦名稱叫做 Frankie-Old 好了,
新的電腦名稱叫做 Frankie-New,
所以雖然我用 Microsoft SQL Server Management Studio 可以用 Frankie-New 連上 SQL Server,
但是我用另外一台電腦要設定 replication 連到 Frankie-New 的時候卻會跳出類似下面的訊息,
【複寫不支援透過伺服器別名、IP 位址或任何其他替代名稱來進行連接。Frankie-Old】
真是尷尬呀!
上網 google 了一下,
我們可以下 SELECT @SERVERNAME 來得知我們 SQL Server 的名字,
我查了一下果然是 Frankie-Old 呀!真是尷尬呀~~~
我們可以下 sp_dropserver 'Frankie-Old' 來刪除舊的名稱,
然後 sp_addserver 'Frankie-New', 'local' 來新增,
然後重新啟動這台 SQL Server 吧!
再重新下個 SELECT @@SERVERNAME 就可以看到妳新設定的名字啦!
喔耶!
2011年10月14日 星期五
如何連上 Windows 2008 Server 的 SQL Server 2008?
好啦!簡單的說就是我連不上 Windows 2008 Server 上的 SQL Server 2008 啦!
上網google了一下,
第一先打開TCP/IP的協定,
第二SQL Browser的服務要開,
第三就是打開Windows 2008 Server 的防火牆設定,
就這樣就可以通啦!
參考下面的連結吧!
打開TCP/IP的協定
設定防火牆
微軟的說明如何開啟 Windows Server 2008 上 SQL Server 防火牆連接埠?
可以直接下載這個檔案,
OpenSqlServerPort.rar
執行之後就會把防火牆的prot打開了!
上網google了一下,
第一先打開TCP/IP的協定,
第二SQL Browser的服務要開,
第三就是打開Windows 2008 Server 的防火牆設定,
就這樣就可以通啦!
參考下面的連結吧!
打開TCP/IP的協定
設定防火牆
微軟的說明如何開啟 Windows Server 2008 上 SQL Server 防火牆連接埠?
可以直接下載這個檔案,
OpenSqlServerPort.rar
執行之後就會把防火牆的prot打開了!
2011年8月29日 星期一
C# 如何強制驅動物件的事件?
我之前寫了一個通用的設定函數,
簡單的說呢,就是傳進去一個 BindingSource 與按鈕,
當按下按鈕的時候會依照條件去對 BindingSource 做 Filter,
然後 Filter 完了之後我想要執行 BindingSource.PositionChanged 的事件;
如果說這是在同一個 cs 的話很好處理,
但是就像我第一句所說的,我是要寫一個通用函數,
所以不在同一個 cs ,所以我沒有辦法直接呼叫 BindingSource.PositionChanged 的事件,
然後我也不確定傳進來的 BindingSource 是不是有 PositionChanged 的事件。
那我要怎麼樣知道傳進來的 BindingSource 有沒有 PositionChanged 的事件呢?
如果有 PositionChanged 的事件,那我又要怎麼樣去執行呢?
就這樣,花了我兩天的時間上網 google ,
到處找、到處 try!
發現網路上問這樣的問題的人很多,
但是我卻沒有找到解答,
最後我從大家片段的回答中 try 出來了!
現在就跟大家來分享吧!
簡單的說呢,就是傳進去一個 BindingSource 與按鈕,
當按下按鈕的時候會依照條件去對 BindingSource 做 Filter,
然後 Filter 完了之後我想要執行 BindingSource.PositionChanged 的事件;
如果說這是在同一個 cs 的話很好處理,
但是就像我第一句所說的,我是要寫一個通用函數,
所以不在同一個 cs ,所以我沒有辦法直接呼叫 BindingSource.PositionChanged 的事件,
然後我也不確定傳進來的 BindingSource 是不是有 PositionChanged 的事件。
那我要怎麼樣知道傳進來的 BindingSource 有沒有 PositionChanged 的事件呢?
如果有 PositionChanged 的事件,那我又要怎麼樣去執行呢?
就這樣,花了我兩天的時間上網 google ,
到處找、到處 try!
發現網路上問這樣的問題的人很多,
但是我卻沒有找到解答,
最後我從大家片段的回答中 try 出來了!
現在就跟大家來分享吧!
2011年8月4日 星期四
List.ForEach:要列印出 List 的內容的時候的另一種做法!
假設我有某個函數回傳一個List<string>,如下:
List<string> lst = GetListFunc();
然後我現在想把 lst 的內容寫到檔案裡面去該怎麼做呢?
通常不外乎下面兩種做法:
(備註:sw 是一個 StreamWriter 變數)
foreach (string s in lst)
{
sw.WriteLine(s);
}
for (int i = 0; i < lst.Count; i++)
{
sw.WriteLine(lst[i]);
}
List<string> lst = GetListFunc();
然後我現在想把 lst 的內容寫到檔案裡面去該怎麼做呢?
通常不外乎下面兩種做法:
(備註:sw 是一個 StreamWriter 變數)
foreach (string s in lst)
{
sw.WriteLine(s);
}
for (int i = 0; i < lst.Count; i++)
{
sw.WriteLine(lst[i]);
}
但是我發現其實還有另外一種寫法,
用 List.ForEach 的方法,
然後 delegate 上去一個事件,如下:
lst.ForEach(delegate(string name) { sw.WriteLine(name); });
這樣寫起來感覺程式碼好像高級了一點,
但是有比較厲害嗎?好像也沒有耶!
2011年7月22日 星期五
C# Linq 查詢 Local 資料的方法
這邊要介紹一個我覺得還不錯的 Linq 的寫法,
可以用來查詢 Local 資料,
我覺得還蠻簡單的,
不用像 Filter 還要組 SQL 的字串,
方法如下:
可以用來查詢 Local 資料,
我覺得還蠻簡單的,
不用像 Filter 還要組 SQL 的字串,
方法如下:
- 首先我們宣告一個 DataTable 的變數,用來暫存一份資料複本。
- 然後在 DoLocalQuery() 中,第一次執行的時候把 localCache 建立起來,並且複製一份複本。
- 然後每次在查詢前從 localCache 複製一份到 dt 去。
- var query = dt.AsEnumerable(); <= 把 dt 轉換成 query。
- 再來就是判斷value1有值的話就去查詢,然後塞回query去。
- 然後就重複下去,看有幾個變數要查,其實這段可以變成一個函式。
- 查完之後用 query.CopyToDataTable() 轉成 DataTable。
- 最後把 dt 塞回去給 BindingSource 就完成啦!
C# 有 Lambda 真好用【二】
之前寫了一個設定 BindingSource.Filter 的程式,
在 Form 上面只要呼叫一個設定的函式,就可以讓 Form 上面的 Filter 功能有作用,呼叫的方法如下:
CommQueries.SetFilterFunc(this, BindingSource, 查詢按鈕, 清除查詢條件按鈕,
new LookUpEdit[] { 查詢元件1, 查詢元件2, 查詢元件3, 查詢元件4 });
SetFilterFunc 的寫法如下:
在 Form 上面只要呼叫一個設定的函式,就可以讓 Form 上面的 Filter 功能有作用,呼叫的方法如下:
CommQueries.SetFilterFunc(this, BindingSource, 查詢按鈕, 清除查詢條件按鈕,
new LookUpEdit[] { 查詢元件1, 查詢元件2, 查詢元件3, 查詢元件4 });
SetFilterFunc 的寫法如下:
2011年7月21日 星期四
C# 有 Lambda 真好用
很久很久以前(其實也沒多久前),
如果我們想要在欄位改變之前記下他的值,
然後提供後面其他的函數使用的話,
通常都會在改變之前記錄到一個全域的變數去,
然後在要使用的時候再從那個全域的變數讀出來;
不過有了 Lambda 之後我們有更簡潔的寫法,
寫法如下:
如果我們想要在欄位改變之前記下他的值,
然後提供後面其他的函數使用的話,
通常都會在改變之前記錄到一個全域的變數去,
然後在要使用的時候再從那個全域的變數讀出來;
不過有了 Lambda 之後我們有更簡潔的寫法,
寫法如下:
2011年7月9日 星期六
解決 更新 Firefox 5 後 Google Toolbar 不見 或 不能使用的方法
在【Pogo Tsai 的 "新" 異空間】找到了一篇文章,
解決 更新 Firefox 5 後 Google Toolbar 不見 或 不能使用的方法
恩恩~~~試了一下!真的有用ㄟ!
其實 Google Toolbar 對我而言,
其實我只有在使用她的書籤功能而已,
也許等我找到替代的功能之後,
我應該對她就不會這麼執著了吧!
解決 更新 Firefox 5 後 Google Toolbar 不見 或 不能使用的方法
恩恩~~~試了一下!真的有用ㄟ!
其實 Google Toolbar 對我而言,
其實我只有在使用她的書籤功能而已,
也許等我找到替代的功能之後,
我應該對她就不會這麼執著了吧!
2011年6月7日 星期二
MS SQL 2008 - 防止儲存需要資料表重建的變更
今天在設計資料表的時候,
當存檔後要再修改的時候就跳出了一個訊息,
這是甚麼鬼呀!連這個也擋住了!
好歹也去檢查一下資料表有沒有資料嘛!
上網查了一下,要手動把選項打開!
請參閱以下網址去打開選項吧!
[SQL] Microsoft SQL Server 2008 Management Studio 防止儲存需要資料表重建的變更
網站好像掛了!
簡單說的就是從上面的選單,工具\選項打開,
然後把下面紅色框框的地方打勾取消就可以了!
當存檔後要再修改的時候就跳出了一個訊息,
【防止儲存需要資料表重建的變更】
這是甚麼鬼呀!連這個也擋住了!
好歹也去檢查一下資料表有沒有資料嘛!
上網查了一下,要手動把選項打開!
請參閱以下網址去打開選項吧!
[SQL] Microsoft SQL Server 2008 Management Studio 防止儲存需要資料表重建的變更
網站好像掛了!
簡單說的就是從上面的選單,工具\選項打開,
然後把下面紅色框框的地方打勾取消就可以了!
2011年6月6日 星期一
Linq 的語法參考
在某篇網誌上看到的,對Linq應該有幫助!
http://msdn.microsoft.com/en- us/vcsharp/aa336746
今天要參考的時候發現已經移到下面網址去了
101 LINQ Samples
今天要參考的時候發現已經移到下面網址去了
101 LINQ Samples
2011年6月3日 星期五
DataTable 的各種查詢方式效能比較
由於 DataTable.Rows.Find 只提供對 PrimaryKey 的查詢能力,
如果不是 PrimaryKey 的話,
似乎只能用 DataTable.Select ,
說明文件裡面說"取得符合按照主索引鍵順序 (如果沒有,則使用加法順序) 的篩選準則的所有 DataRow 物件之陣列。",
看來如果查詢的欄位不是 PrimaryKey 的話就會用 Table scan 的方式去查資料;
上網找到一份資料 【使用 ADO.NET 的最佳經驗分享-更多有用秘訣】 ,
裡面的"在資料中找尋資料"這一段裡面提到,
查詢的欄位是主索引鍵的話就用 DataTable.Rows.Find 不要用 DataTable.Select ,
非主索引鍵的話就建立 DataView 來增加多重查詢的效能;
然後我記得再查詢相關說明的時候,
微軟又建議我們用 Linq to DataSet 的方式來查詢!!!
也許年代不同有不同的方式可以得到更好的效能吧?
所以我決定把我所想得到的查詢方式通通拿來測試一下效能,
所以才會有今天這一篇文章。
我所想到的方法有下列幾項:
如果不是 PrimaryKey 的話,
似乎只能用 DataTable.Select ,
說明文件裡面說"取得符合按照主索引鍵順序 (如果沒有,則使用加法順序) 的篩選準則的所有 DataRow 物件之陣列。",
看來如果查詢的欄位不是 PrimaryKey 的話就會用 Table scan 的方式去查資料;
上網找到一份資料 【使用 ADO.NET 的最佳經驗分享-更多有用秘訣】 ,
裡面的"在資料中找尋資料"這一段裡面提到,
查詢的欄位是主索引鍵的話就用 DataTable.Rows.Find 不要用 DataTable.Select ,
非主索引鍵的話就建立 DataView 來增加多重查詢的效能;
然後我記得再查詢相關說明的時候,
微軟又建議我們用 Linq to DataSet 的方式來查詢!!!
也許年代不同有不同的方式可以得到更好的效能吧?
所以我決定把我所想得到的查詢方式通通拿來測試一下效能,
所以才會有今天這一篇文章。
我所想到的方法有下列幾項:
訂閱:
文章 (Atom)