全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3299
推到 Plurk!
推到 Facebook!

D2007 dbExpress + mssql2k5 : can not update ?

缺席
feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-31 15:38:55 IP:210.240.xxx.xxx 訂閱
大家好:

我使用以下架構:
SQLConnection SQLDataSet DataSetProvider ClientDataSet (datasource dbgird 作異動)
使用 SQLConnection 連接 MS SQL Server 2005
除了必要的設定(如伺服器名稱/資料庫名稱/帳號/密碼等)之外,一切都使用預設值
資料瀏覽沒有問題,但是在dbgrid異動一筆資料後,利用 clientdataset.applyupdate1(-1) 進行更新時卻會發生錯誤

如果將 DataSetProvider 的 ResolveToData 改成 True 錯誤為 : can not modify a read-only dataset
如果將 DataSetProvider 的 ResolveToData 改成 False錯誤為 : 因處於手動或分散式異動模式,所以無法建立連線

不知道是否有人遇到相同的問題
謝謝你的回覆

feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-03 23:40:13 IP:220.135.xxx.xxx 訂閱
  
經高人指點後,得到以下結論
1.將 TDataSetProvider 的 ResolveToDataSet 改為 Fasle
2.執行 TClientDataSet.ApplyUpdates 前,先做 TSQLDataSet.Close 即可正確更新

1是為了讓MIDAS產生更新語法
2是為了解決同時兩個CONNECT連接所產生的問題

如有錯誤,敬請指教
myemail
一般會員


發表:1
回覆:6
積分:1
註冊:2007-01-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-21 13:19:40 IP:220.134.xxx.xxx 訂閱
不合理. 那D2007 + dbExpress + SQL 2005不就成最遭糕的解決方案?

建議把每個元件的重要屬性或程式碼貼上來. 大家一起討論討論.
feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-21 17:00:58 IP:210.240.xxx.xxx 訂閱

===================引 用 myemail 文 章===================
不合理. 那D2007 dbExpress SQL 2005不就成最遭糕的解決方案?

建議把每個元件的重要屬性或程式碼貼上來. 大家一起討論討論.

--------------------------
我是不覺得我的問題會讓 D2007 dbExpress SQL 2005成為最遭糕的解決方案啦

還原我當時的問題您也可以試試看
SQLConnection SQLDataSet DataSetProvider ClientDataSet 連接sql server 2005
全部使用預設值
如果你把TDataSetProvider 的 ResolveToDataSet 改為 True
或者是再 CDS applyupdates 時把 SQLDataSet 的 Active 設為 true
都會出現如前述之錯誤無(一樣的設定, 用 ADO 沒遇過..)

myemail
一般會員


發表:1
回覆:6
積分:1
註冊:2007-01-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-21 23:34:09 IP:218.210.xxx.xxx 訂閱
我的意思是, dbExpress是Borland的強項, 它強調的就是效率與延展性. 試想, 假如更新還要先把SQLDataSet先關掉在打開, 那不是很奇怪嗎? 假如SQLDataSet裡是數量很多的記錄呢? 然後每更新一次, 就要重讀一次, 這還得了?

1.基本上, dbExpress元件都是單向唯讀的資料集, 所以, ResolveToDataSet 沒有理由改成True. 因為你是用DataSetProvider去更新資料, SQLDataSet只負責提供資料源而以, 我是不曉得您在什麼場合要用到把ResolveToDataSet改成Ture?
2.再來, ClientDataSet去下ApplyUpdates, 更本不用去管SQLDataSet的Active屬性是True或False.

換言之, 我是沒遇到您說的問題啦.

THANKS!



===================引 用 feng 文 章===================

===================引 用 myemail 文 章===================
不合理. 那D2007 dbExpress SQL 2005不就成最遭糕的解決方案?

建議把每個元件的重要屬性或程式碼貼上來. 大家一起討論討論.

--------------------------
我是不覺得我的問題會讓 D2007 dbExpress SQL 2005成為最遭糕的解決方案啦

還原我當時的問題您也可以試試看
SQLConnection SQLDataSet DataSetProvider ClientDataSet 連接sql server 2005
全部使用預設值
如果你把TDataSetProvider 的 ResolveToDataSet 改為 True
或者是再 CDS applyupdates 時把 SQLDataSet 的 Active 設為 true
都會出現如前述之錯誤無(一樣的設定, 用 ADO 沒遇過..)

feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-09-22 00:06:21 IP:61.219.xxx.xxx 訂閱

===================引 用 myemail 文 章===================
我的意思是, dbExpress是Borland的強項, 它強調的就是效率與延展性. 試想, 假如更新還要先把SQLDataSet先關掉在打開, 那不是很奇怪嗎? 假如SQLDataSet裡是數量很多的記錄呢? 然後每更新一次, 就要重讀一次, 這還得了?

1.基本上, dbExpress元件都是單向唯讀的資料集, 所以, ResolveToDataSet 沒有理由改成True. 因為你是用DataSetProvider去更新資料, SQLDataSet只負責提供資料源而以, 我是不曉得您在什麼場合要用到把ResolveToDataSet改成Ture?
2.再來, ClientDataSet去下ApplyUpdates, 更本不用去管SQLDataSet的Active屬性是True或False.
==========================
1.我原先用 ADO 連 MSSQL 所以選擇 ResolveToDataSet = true
2.我會是需要更改 sql 指令 所以必須讓 sqldataset 重新執行讀取新的 data , 而不是因為要用cds applyupdates 所以開sqldataset

您所說的都對 可惜當我提出這問題時 沒得到您的建議

不過如果讓我那"錯誤的做法"當然就會得到我所說的結果



myemail
一般會員


發表:1
回覆:6
積分:1
註冊:2007-01-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-09-22 00:23:54 IP:218.210.xxx.xxx 訂閱
Sorry, 我不曉得您的問題是否解決? 所以參與討論! 有錯請告訴我! 
1. 同意, 用ADO把ResolveToDataSet = true, 這OK! 不過用成False應該也是可以的!
2.您說的第2點---> "我會是需要更改 sql 指令 所以必須讓 sqldataset 重新執行讀取新的 data , 而不是因為要用cds applyupdates 所以開sqldataset", 我不是很清楚. 您的意思是需要將資料庫上的最新的資料從新下載到ClientDataSet嗎?

假如是這樣的話, 我也是直接在ClientDataSet做Close與Open; 或者是Refresh. 不過用Refresh時, 欄位物件裡的一些Flag要設對, 否則會出錯.
換句話說, 您是不用去管SQLDataSet的Active屬性的.

Why?

若您的SQLDataSet是數於3-Tier的AP層, 您在Client端應該看不到這個物件吧?

THANKS!




===================引 用 feng 文 章===================


===================引 用 myemail 文 章===================
我的意思是, dbExpress是Borland的強項, 它強調的就是效率與延展性. 試想, 假如更新還要先把SQLDataSet先關掉在打開, 那不是很奇怪嗎? 假如SQLDataSet裡是數量很多的記錄呢? 然後每更新一次, 就要重讀一次, 這還得了?

1.基本上, dbExpress元件都是單向唯讀的資料集, 所以, ResolveToDataSet 沒有理由改成True. 因為你是用DataSetProvider去更新資料, SQLDataSet只負責提供資料源而以, 我是不曉得您在什麼場合要用到把ResolveToDataSet改成Ture?
2.再來, ClientDataSet去下ApplyUpdates, 更本不用去管SQLDataSet的Active屬性是True或False.
==========================
1.我原先用 ADO 連 MSSQL 所以選擇 ResolveToDataSet = true
2.我會是需要更改 sql 指令 所以必須讓 sqldataset 重新執行讀取新的 data , 而不是因為要用cds applyupdates 所以開sqldataset

您所說的都對 可惜當我提出這問題時 沒得到您的建議

不過如果讓我那"錯誤的做法"當然就會得到我所說的結果



feng
一般會員


發表:13
回覆:34
積分:14
註冊:2002-10-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-09-22 09:15:17 IP:61.219.xxx.xxx 訂閱

===================引 用 myemail 文 章===================
Sorry, 我不曉得您的問題是否解決? 所以參與討論! 有錯請告訴我!
1. 同意, 用ADO把ResolveToDataSet = true, 這OK! 不過用成False應該也是可以的!
2.您說的第2點---> "我會是需要更改 sql 指令 所以必須讓 sqldataset 重新執行讀取新的 data , 而不是因為要用cds applyupdates 所以開sqldataset", 我不是很清楚. 您的意思是需要將資料庫上的最新的資料從新下載到ClientDataSet嗎?
=====================
1.問題在第二篇時已經解決囉
2.譬如說 第一次找cusid為96001的資料然後傳給使用者, 接著如果要改找96002的交易資料, 那就更改 adodataset 的 commandtext 再傳給使用者
我之前的問題是:
先將adodataset.active := true 然後再讓 cds.active := true
事實上只需要 acs.active := 就可以了
之前用 ado 沒特別注意到這個問題 也可以正確運作 改成 dbExpress 之後 當把 adodataset 跟 ado 一起 active 並執行 cds.applyupfates 時就會出錯囉

謝謝
系統時間:2024-05-17 18:46:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!