【功能說明】
用途:使用於Web網頁中,此元件主要功能是為了能連繫Web各資料元件與WebDataSet彼此的互動關係,也就是說任何資料都是透過A/P Server的InfoCommand取得數據後交給WebDataSet,WebDataSet是在IIS伺服器上,再由WebDataSet將資料交給WebDataSource,透過WebDataSource能與所有Web上的各元件互動呈現資料,如果其所連結的元件在編輯狀態下,也可以透過WebDataSource將資料異動給WebDataSet,最後再透過WetDataSet回到A/P Server的UpdateComp元件來自動進行資料的異動(如新增/更改/刪除功能等)。WebDataSource元件有兩種取得資料的方式,一種是接到上述的WebDataSet上,另一種是可以直接在WebDataSource定義SelectAlias與SelectCommand,前者必須都要定義InfoCommand與WebDataSet,才能使用:後者就容易多了,只要直接定義SelectAlas與SelectCommand即可直接使用,不必另外定義WebDataSet與InfoCommand,方便許多。
【元件屬性】
(ID)(名稱)(string)
元件名稱,用於識別該元件。
WebDataSetID(資料集)
(string)
設定要對應到那個WebDataSet上。注意,這個WebDataSet必須在”Component Designner”中執行過WebDataSet右鍵的”Save”功能後才能選擇到該WebDataSet。
DataMember(資料成員)(string)
對應的資料表名稱,此可以對應到一個WebDataSet資料集中的某一個Table (因為一個WebDataSet會有多個Table的內容);本屬性要搭配WebDataSetID共同使用,不能單獨使用,也是必須執行過WebDataSet的右鍵”Save”功能後才能選擇。
SelectAlias(資料庫名稱)(string)
SelectCommand的指定資料庫名稱,此名稱定義在EEPNetServer.EXE的”DB Manager”中,為一個虛擬的資料庫名稱。
SelectCommand(SQL命令)(string)
直接以SQL命令來取得本元件的資料,資料來自SelectAlias所指定的資料庫中,此屬性設定後,WebDataSetID與DataMember都會無效,因為兩者只能選擇其一來運作,不是使用WebDataSetID對應到WebDataSet就是直接使用SelectCommand來下達SQL命令,使用SelectCommand的好處是簡單容易下達SQL命令(也可以使用 “…”的按鈕呼叫我們的SQL Builder來輔助設計SQL命令)。
AutoApply(自動存檔)(bool)
這與WebDataSet內的AutoApply是一樣的功能,用來設定是否User按下內建的Navigator的OK或外掛是WebNavigator中的OK即會自動執行WebDataSet的Apply存檔動作,預設為True。一般在Master/Detail的Detail中必須要設為False,否則每存一筆Detail,就會回Server存檔一次。
AllowAdd(允許新增)(bool)
指示是否允許新增資料,一般不用設定,系統會自動與WebSecurity元件來搭配。
AllowUpdate(允許更改)(bool)
指示是否允許更新資料,一般不用設定,系統會自動與WebSecurity元件來搭配。
AllowDelete(允許刪除)(bool)
指示是否允許刪除資料,一般不用設定,系統會自動與WebSecurity元件來搭配。
AllowPrint(允許印表)(bool)
指示是否允許列印資料,一般不用設定,系統會自動與WebSecurity元件來搭配。
AutoRecordLock(自動鎖定)(bool)
用來解決資料編輯鎖定的問題,如果AutoRecordLock=True,如下的程序:
1. AutoRecordeLockMode為Reload,則在更改資料時,會到A/P Server下載該筆最新的資料,以免資料過期;如果AutoRecordLockMode為NoneReload,則更改前不會下載最新資料,以增加效能。
2. 當InfoBindingSource資料被更改時,A/P Server會自動記錄該User,Table,KeyValue到一個XML文件中。
3. 如果已經有其他User更改此筆資料,則會自動告訴此User;該資料正在被其他使用者更改中,如果沒有則可以進行編輯。
4. 編輯存檔後,就會清除自己所編輯的XML資料狀態,讓別的使用者可以輸入。
AutoRecordLockMode(鎖定模式)(enum)
Reload 在更改資料時,會到A/P Server下載該筆最新的資料,以免資料過期,NoneReload則更改前不會下載最新資料,以增加效能。
AutoApplyForInsert(新增時自動存檔)(bool)
預設為False,此屬性用來控制是否在新增狀態下按Naivgator的"OK"時自動去"APPLY"(存檔),此必須配合AutoApply為True,用在Master/Detail時,Master為自增值(Identity)的狀態下,必須在User按下"OK"時,先讓Master到存到後端並取回自動編號,才能讓Detail可以繼續輸入。一般在Master/Detail情況下,WebNavigator的"OK"不會引發Master的Apply,即使AutoApply=True,因為"OK"是為了讓User可以繼續輸入Detail資料,而不是真正讓Master存檔,一直到User 按下"Apply"才會讓Master/Detail一起存檔。 用AutoApplyForInsert可以控制讓Master優先存檔來取得自動編號。
CacheDataSet( 存儲 DataSet)(bool)
預設為 False ,此屬性用來控制 InnerDataSet 的存儲在 Session 或者 ViewState 兩种存儲方式。設為 True 時,可以大幅減少 EnabledViewState 為 rue 所增加出來的網頁流量 , 因為 EnableViewState 會將 InnerDataSet 的資料 ( 來自 WebDataSet) 也序列化到前端網頁中 , 尤其是 Master/Detail 的資料會讓 User 的網頁效能變差 , 使用 CacheDataSet 之後 , 就會讓 InnerDataSet 改 Cache 到 Session 中 , 不會被序列化到網頁中 , 可以大幅提升網頁數度 , 但此會增加 IIS Server 的記憶體負擔 , 如果 User 數很多時 , IIS Server 的 RAM 須倍數增加。
CommandPacketRecord(SQL 命令傳送記錄數 )(int)
此屬性可是讓 SelectCommand 方式取得的 WebDataSource 也可以有 PackageRecord 功能,預設為 -1
【功能函數】
bool ApplyUpdates()
將已異動的資料,存檔到後端的A/P Server上,並返回成功與否。
bool SetWhere(string strWhere)
以傳入的Where條件到原SelectCommand或InfoCommand所指定的SQL語法中,並重新獲取新的資料。
void ExecuteSelect(object selectedObject)
在Master/Detail中,Detail是以本Method來取得與Master資料的同步,SelectObject一般是指其Master的資料元件,可以是WebFormView或WebDetailView等元件,並注意此SelectObject中必須存在Master/Detail的關連欄位才能同步。
如:Detail.ExecuteSelect(wfvMaster); // 從
wfvMaster這個WebFormView元件中取的鍵值後,對Detail進行同步對應。
DataBind(); // 讓WebDataSource資料可以與其相對的Control來重新進行資料綁定。
void ExecuteAdd(object selectedObject)
在Master/Detail中,如果Master新增時,Detail資料應該要產生一筆空的資料讓User來輸入,就必須是以本Method來產生。SelectObject一般是指其Master的資料元件,可以是WebFormView或WebDetailView等元件。
如:if (e.CommandName == "cmdAdd") //在WebNavigator中檢查是否按到新增
{
Detail.ExecuteAdd(wfvMaster); //從 wfvMaster這個WebFormView元件中取的鍵值後,對Detail清空資料。
DataBind(); //讓WebDataSource資料可以與其相對的Control來重新進行資料綁定。
}
void ExecuteSync(object selectedObject)
可以用來同步本WebDataSource的資料與SelectedObject的目前筆資料,系統會自動從SelectObject(通常為WebGridView元件)中取出鍵值,對定自己的WebDataSource以SetWhere()來取得最新目前筆增料。
如:在WebGridView1的SelectedIndexChanged事件中寫著下列程式來同步Master/Detail的資料指向WebGridView1同一筆資料:
protected void
WebGridView1_SelectedIndexChanged(object sender, EventArgs e)
{
Master.ExecuteSync(WebGridView1); // 以WebGridView1的鍵值同步Master的資料
DataBind();
Detail.ExecuteSelect(wfvMaster); // 以wfvMaster的鍵值同步Detail的資料DataBind();
}
ToExcel(string TableName )
用來輸出 WebDataSource 的資料到 Excel 中, TableName 代表 所要輸出的 InfoCommand 的名稱 。
ToExcel(string TableName ,string
Filter)
用來輸出 WebDataSource 的資料到 Excel 中, TableName 代表 所要輸出的 InfoCommand 的名稱 , Filter 則代表 Filter 再次過濾資料條件。
ToExcel(string TableName ,string
Filter ,bool Open )
用來輸出 WebDataSource 的資料到 Excle 中, TableName 代表 所要輸出的 InfoCommand 的名稱 , Filter 則代表 Filter 再次過濾資料條件 , Open 代表打開 Excel 下載畫面 。
ToExcel(string TableName ,string Filter ,bool Open,string Title )
用來輸出 WebDataSource 的資料到 Excel 中, TableName 代表 所要輸出的 InfoCommand 的名稱 , Filter 則代表 Filter 再次過濾資料條件 , Open 代表打開 Excel 下載畫面, Title 代表輸出的 Excel 的文件内容的標題 。
ToExcel(string TableName ,string
Filter ,string Sort,bool
Open,string Title )
用來輸出 WebDataSource 的資料到 Excel 中, TableName 代表 所要輸出的 InfoCommand 的名稱 , Filter 則代表 Filter 再次過濾資料條件 , Sort 代表輸出資料的排序方式, Open 代表打開 Excel 下載畫面, Title 代表輸出的 Excel 的文件内容的標題 。
ToExcel(stringTableName,
stringFilter, stringSort, boolOpen, stringTitle, List< string>
IgnoreColumns)
用來輸出 WebDataSource 的資料到 Excel 中, TableName 代表 所要輸出的 InfoCommand 的名稱 , Filter 則代表 Filter 再次過濾資料條件 , Sort 代表輸出資料的排序方式, Open 代表打開 Excel 下載畫面, Title 代表輸出的 Excel 的文件内容的標題, IgnoreColumns 代表不用輸出到 Excel 的欄位名稱。
ToExcel( int TableIndex
)
用來輸出 WebDataSource 的資料到 Excel 中, TableIndex 代表 所要輸出的 Table 名稱的索引 。
ToExcel( int TableIndex
,string Filter)
用來輸出 WebDataSource 的資料到 Excel 中, TableIndex 代表 所要輸出的 Table 名稱的索引 , Filter 則代表 Filter 再次過濾資料條件。
ToExcel( int TableIndex
,string Filter ,bool Open )
用來輸出 WebDataSource 的資料到 Excle 中, TableIndex 代表 所要輸出的 Table 名稱的索引 , Filter 則代表 Filter 再次過濾資料條件 , Open 代表打開 Excel 下載畫面 。
ToExcel( int TableIndex ,string
Filter ,bool Open,string
Title )
用來輸出 WebDataSource 的資料到 Excel 中, TableIndex 代表 所要輸出的 Table 名稱的索引 , Filter 則代表 Filter 再次過濾資料條件 , Open 代表打開 Excel 下載畫面, Title 代表輸出的 Excel 的文件内容的標題 。
ToExcel( int TableIndex
,string Filter ,string Sort,bool Open,string Title
)
用來輸出 WebDataSource 的資料到 Excel 中, TableIndex 代表 所要輸出的 Table 名稱的索引 , Filter 則代表 Filter 再次過濾資料條件 , Sort 代表輸出資料的排序方式, Open 代表打開 Excel 下載畫面, Title 代表輸出的 Excel 的文件内容的標題 。
ToExcel(
intTableIndex, stringFilter,
stringSort, boolOpen,
stringTitle, List<
string> IgnoreColumns)
用來輸出 WebDataSource 的資料到 Excel 中, TableIndex 代表 所要輸出的 Table 名稱的索引 , Filter 則代表 Filter 再次過濾資料條件 , Sort 代表輸出資料的排序方式, Open 代表打開 Excel 下載畫面, Title 代表輸出的 Excel 的文件内容的標題, IgnoreColumns 代表不用輸出到 Excel 的欄位名稱。
例如:
List<string>
lst = new List<string>(new string[2]{"Field1","Field2"});
infoDataSet1.ToExcel(0,
"C:\\my.xls", "", "", "", lst);
ReadFromTxt(int
tableIndex, string txtFileName)
用來提供外部讀取 Txt 文件, TableIndex 代表 DataSource 中 Table 的索引, txtFileName 代表為 Txt 文字檔格式的文件所在路徑,其中 txt 文件内容中欄位間是以 "," 或 "TAB" 為間格符號 , 資料是以 "LF" 換行作為資料格式。
ReadFromTxt(string
TableName, string txtFileName)
用來提供外部讀取 Txt 文件, TableName 代表為 WebDataSource 的 TableName 名稱, txtFileName 代表為 Txt 文字檔格式的文件所在路徑,其中 txt 文件内容中欄位間是以 "," 或 "TAB" 為間格符號 , 資料是以 "LF" 換行作為資料格式。
ReadFromXls(int
tableIndex, string xlsFileName)
用來提供外部讀取 Excel 文件, TableIndex 代表 DataSource 中 Table 的索引, xlsFileName 代表為 xls 文字檔格式的文件所在路徑。
public
void ReadFromXls(int tableIndex, string xlsFileName, int beginrow, int
begincell)
用來提供外部讀取 Excel 文件, TableIndex 代表 DataSource 中 Table 的索引, xlsFileName 代表為 xls 文字檔格式的文件所在路徑, BeginRow 表示 讀入的起始 Row 號, BeginCol 表示讀入的起始 Col 號 . 。
ReadFromXls(string
tableName, string xlsFileName)
用來提供外部讀取 Excel 文件, TableName 代表為 WebDataSource 的 TableName 名稱, xlsFileName 代表為 xls 文字檔格式的文件所在路徑。
public
void ReadFromXls(string tableName, string xlsFileName, int beginrow, int
begincell)
用來提供外部讀取 Excel 文件, TableName 代表為 WebDataSource 的 TableName 名稱, xlsFileName 代表為 xls 文字檔格式的文件所在路徑, BeginRow 表示 讀入的起始 Row 號, BeginCol 表示讀入的起始 Col 號 . 。
ToCSV(
intTableIndex)
用來輸出 WebDataSource 的資料 為 CSV 格式,解決 Excel 2002 之前版本不支援 XML 格式的問題 , TableIndex 代表 所要輸出的 Table 名稱的索引。
ToCSV(
stringTableName)
用來輸出 WebDataSource 的資料 為 CSV 格式,解決 Excel 2002 之前版本不支援 XML 格式的問題 , TableName 代表為 WebDataSource 的 TableName 名稱。
【事件】
Adding(Eventarg
e)
對WebDataSource新增時會觸發此事件。
Updating(Eventarg
e)
對WebDataSource更改時會觸發此事件。
Deleting(Eventarg
e)
對WebDataSource刪除時會觸發此事件。
ApplyError(EventArg
e)
如同InfoDataSet的ApplyError一樣,用來當WebDataSource Apply資料到後端發生Error時,就會觸發本事件,用來對錯誤訊息做進一步的處理,如下的案例:
protected void Master_ApplyError(object sender,
Srvtools.ApplyErrorEventArgs e)
{
// 檢查是否為自定訊息
if
(e.Exception.InnerException.Message == "StockNotEnough")
{
Label1.Text = "Stock Not
Enough!"; // 自行處理
e.Cancel = true; //讓系統知道後端有錯誤
}
}
【其他說明】
1. 使用WebDataSet的方式時,雖然在設計模式中我們已經定義好WebDataSource.DataSourceID為那一個WebDataSet,但是因為WebDataSet在Web Server中並不能被保存狀態(上一個服務存在下一個服務就已經不存在),因此,你必須在用到WebDataSet的網頁上的Page_Load中加上下列的指令,才能正常使用WebDataSource,使用時所有WebDataSource如果是對應到WebDataSet時,都必須對應,如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InitializeComponent(); // 要執行此命令才會讓WebDataSet存在Web Server上
Master.DataSource = WebMaster; // 設定 Master這個WebDataSource資料來自WebMaster這個WebDataSet.
Detail.DataSource = WebMaster; // Detail也是來自WebMaster
即可View.DataSource = WebView; //
View這個WebDataSource資料來自WebView這個WebDataSet.
}
}
注意,如果你使用的是SelectCommand方式,則在Page_Load()中就可以按
以上方式來處理。
2. 使用WebDataSet連結資料方式與SelectCommand直接取得資料的方式中,其中有一些不小的差異,說明如下:
(1) WebDataSet有自己的InfoCommand與UpdateComp元件,而SelectCommand是固定連結到GLModule的”cmdRefValUse”這個共用的InfoCommand,因此SelectCommand並沒有UpdateComp來進行資料異動的回寫,所以就只能是唯讀的模式。
(2) 也因為SelectCommand沒有WebDataSet元件可以設定PackedRecords數,並能進行緩存的處理,所以,SelectCommand的方式只能一次將資料下到Web Server上,如果資料有數千或數萬筆資料時,最好還是改用WebDataSet才能有較好的效能(因為有了PackedRecord功能),除非你能在SelectCommand中以Where來降低資料筆數。