在Asp.Net中,我們用資料綁定控件直接生成時。如果兩個表,用SQL產生時,單擊刪除或更新,出現「ORA-01036:
變數名稱/號碼無效」。我摸索大半天,終於解決問題。
解決方法:
選擇數據源控制項,點擊設定資料來源中,在「設定Select語句」中,選擇「指定數據表或數據行」的方式,並在高級中選擇「產生insert、update和delete語句」,但不選擇「並行存取的方式」。完成後,再次選擇「設定Select語句」,選擇「指定自定SQL語句的方式或存儲過程」,修改SQL語句,加入你要用於顯示的其他表的資料表列。完成。
在GridView加入你後來加入的資料列。並將其設定readonly。如果要更新的表中有某列不需要更新其值,需將其加入範本中,並範本中的將控制項的Enable設為false。這樣,在更新時,其值就不會為空。
對於數據綁定涉及一些綁定的內容,在網上我找一入篇關於此的介紹
(原文:http://www.seovip.net/edu/48/NET/200710244163.html)。如下:
1、為什麼ASP.NET 2.0中的資料綁定控制項不需要寫代碼就能完成更新、刪除、新建等資料操作? 在ASP.NET 1.x時,DataGrid等控制項使用DataBinder.Eval(Container.DataItem,"ColumnName")這樣的運算式
可以將資料源中的資料綁定到控制項上,但並不能在更新資料時自動將控制項中的新值取出,更新回資料庫。所以ASP.NET 2.0中的資料綁定分為兩種:單向資料綁定(即運算式或ReadOnly設為True的BoundField,只提供從資料源到控制項的資料綁定)和雙向數 據綁定(,不但可以將資料從資料源綁定到控制項,而且可以在運算元據時將控制項中的資料提供給資料源控制項),所以ASP.NET 2.0運算元據時就不需要寫大量e.Item.FindControl()這樣的代碼了。
2、在Update和Insert過程中,GridView/DetailsView/FormView是如何把值傳遞給資料源控制項,以便資料源控制項完成資料操作方法的調用的?
更新時,GridView會提供兩套值給資料源控制項,一套新值,彙集所有ReadOnly不為True的列的值和範本中所有運算式的值,另一套舊的值, 則從當前行對應的DataKey中獲得(DataKey的值在綁定資料時就會被GridView保存到視圖狀態中),可以在GridView的
Updating事件處理程式中看到這一特徵。舊的那套值提供給資料源控制項後,它的Key會被資料源控制項根據 OldValuesParameterFormatString重命名。比如,GridView中的DataKeyNames設為ProductID,數 據源控制項的OldValuesParameterFormatString為original_{0},那麼GridView在更新時傳給資料源控制項的參 數中就會有一個original_ProductID。
新的那套值和老的那套值合起來要剛好和資料源控制項需要的參數列表相匹配,不能多也不能少,這是初學者使用GridView更新資料時遇到最多的問題。
實際使用過程中如果主鍵列對應的參數(比如,ProductID),沒有像Strong
named Dataset那樣取名為original_ProductID,則需要更改資料源的OldValuesParameterFormatString,比 如改成{0},這樣才能和實現方法的參數對應起來。
3、如何實現開放式併發?
開放式併發的更新和刪除語句會有一個很長的where 子句,比如:
update
Table1 set Column1 = @Column1 , Column2 = @Column2 where ID = @original_ID and
Column1 = @orignal_Column1 and Column2 = @original_Column2。 強類型資料集通過在高級選項上選中開放式併發的選鉤可以自動生成這樣的命令。根據我們第2點的論 述,只需在GirdView的DatakeyNames屬性中把所有的欄位都加進去,這樣就會自動的把舊的值放進老值集合中,滿足資料源的要求。由此,我
們可以理解為什麼DataGrid的DataKeyField(單數)屬性會被替換為DataKeyNames屬性(複數)。
|
请发表评论