請指點一下, 關於資料庫的

2008-05-21 7:21 pm
請問各位前輩

小弟須要將database內符合條件的records產生成文字檔,
若符合條件的record當中有相同的話, 就會用別的值,
務求產生出來的資料(就例如 order num) 不會相同...
而產出來的新值, 又會寫入另一個table內作query用,
免去第3或第4次相同的值( 例如 1234, 1234_dup01, 1234_dup02, 1234_dpu03)...

試過一次過將他們, 逐筆逐筆來驗查, 免去每次取
但結果因為程式每一筆都query一次個db,
以致效能不盡人意...

以小弟的認知, 曾考慮過用 ado 既 recordset 既find method去loop,
效能或會提升一點,
但我希望可以用新的ado.net的物件去做這個程式...

1) 請問2005中有沒有類似及比recordset有過之而無不及的物件?
2) 改善效能, 如果我集中在『只連線及query一次, 將db內相同條件的record的總數於本機處理』這一點上面有沒有錯?
3) 有類似method的binding source物件 ( 它有 find method ), 可以做到這個效果嗎? 請問有沒有類似的文獻? 它的position改變不到...無法loop!!!

問題太多, 也希望前輩們指點一下!!!萬分感謝!
更新1:

thx garlic2010 你o既建議 使用DataReader物件讀取data的確很快, 再想請教, 若果希望寫入及擁有search method, 是不是dataview物件就最適合不過?

回答 (1)

2008-05-23 9:18 am
✔ 最佳答案
按你第一段文字所要求包括 renumber相同值,這必須用 coding去處理,coding 方法下面再講。

ADO.NET 讀取 table records 方法主要有兩個
1. DataReader
2. DataAdapter -> DataTable
單是讀取記錄 DataReader 是最有效率的方法。
由 DataTable 可以建立 DataView,DataView 就可以用到 Find method。

以下是小弟建議方法:
1. sql statement 抽出符合條件的記錄並按某 column 排列 (如 order num)。
2. 用 DataReader 將記錄逐一閱讀。
3. 用 control break 方法 renumber 相同記錄。

Coding 參考:
Suppose a DataReader dr has been created

int i = 0;
string control = "";
string newnum = "";
// 將記錄逐一閱讀
while dr.Read()
{
if (dr.GetString(0) == control)
{
// key 相同 renumber
i++;
newnum = dr.GetString(0) + "_Dup" + i.ToString();
}
else
{
// control breaks
control = dr.GetString(0); // 重新 assign control
newnum = control; // 無須 renumber
i = 0;
}
// write a new record using newnum (newnum is unique)
}
dr.Close();

2008-05-23 01:39:59 補充:
資料方面 Microsoft MSDN 的 Documentation 最詳盡
http://msdn.microsoft.com/en-us/library/system.data.oledb.aspx

2008-05-23 01:40:44 補充:
http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbdatareader.aspx

2008-05-24 01:17:52 補充:
不明白「寫入及擁有search method」的意思,可否說明一下。


收錄日期: 2021-04-25 20:32:53
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20080521000051KK00605

檢視 Wayback Machine 備份