作者 主題: 請教Asp.net 的:多重步驟 OLE DB 操作發生錯誤…問題。  (閱讀 8172 次)

0 會員 與 1 訪客 正在閱讀本文。

redjack

  • 活潑的大學生
  • ***
  • 文章數: 426
    • 檢視個人資料
小弟寫了一個產線人員績效計算的網站,目前正在編寫月總表的部份。
用的是.Net 4.0 C# 2010express

因為實務需要,所以小弟在月總表的部份許可會計去編修備論與績效獎金以便彈性運用。
在開發環境中設定Grid 可以編輯後,實際測試去更新資料欄會出現:

多重步驟 OLE DB 操作發生錯誤。請檢查每一個可用的 OLE DB 狀態值。尚未完成任何操作。

找了一些資料都說是資料型別、長度的問題,於是小弟手動修改了一下:
SelectCommand="SELECT id,workingDays,presAVG,presBonus,Notes FROM [RptPR01] WHERE ((year([theMonth]) = year(?)) AND (Month([theMonth]) = month(?))) "
UpdateCommand="UPDATE [RptPR01] SET [workingDays] = ?, [presAVG] = ?, [presBonus] = ?, [notes] = ? WHERE [id] = ? "
<UpdateParameters>
        <asp:Parameter Name="workingDays" Type="Double" />
        <asp:Parameter Name="presAVG" Type="Double" />
        <asp:Parameter Name="presBonus" Type="Int32" />
        <asp:Parameter Name="notes" Type="String" />
        <asp:Parameter Name="original_id" Type="Int64" />
</UpdateParameters>

想說先縮減範圍看看是那邊的值出錯,但如上的設定還是會出現一樣的訊息,其中:

堆疊追蹤:

[OleDbException (0x80040e21): 多重步驟 OLE DB 操作發生錯誤。請檢查每一個可用的OLE DB 狀態值。尚未完成任何操作。]

[InvalidOperationException: 命令參數[5] '' 無效。]

各欄位的資料型別如下:
id: bigint
workingDays:float (因為是用工時/8,所以會有小數的情況發生)
presAvg:float 平均的績效點數,用來給會計調整的
presBonus:int 最終發放的績效獎金,實際的基準。
notes:varchar(100) 備註。

會許可更新的就是上面除了id 之外的四列,其餘的都不會讓會計去編輯。所以在測試時縮減到只有那幾列而已。
如果手動把updateCommand中的? 改成數據、文字的話,都可以成功更新。
所以猜想應該還是參數的問題吧??

想請教一下這個問題該怎麼解決或是如何除錯呢?
目前所有的資料來源都是同一個TABLE。

謝謝各位前輩的指導。


Knowledge is Power

redjack

  • 活潑的大學生
  • ***
  • 文章數: 426
    • 檢視個人資料
小弟今天試了一下:
1. 建立一個新的頁面,第一次設定DataGrid 時,除了PK之外只選定要讓會計可以編輯的項目。測試編輯-> OK
2. 在SelectCommand 中加上不讓會計編輯的項目,但不加在asp:BoundField 項目中。此時測試編輯也OK
3. 在asp:BoundField 中加入不可以編輯的項目,相關屬性設定ReadOnly  = True。此時就出現OLEDB 的錯誤了。

所以…目前正在找OldValuesParameterFormatString="original_{0}"  這個東西
看看有沒有關係。

努力中…
Knowledge is Power

redjack

  • 活潑的大學生
  • ***
  • 文章數: 426
    • 檢視個人資料
小弟今天又能偷空來繼續寫這個東西了,測了一下跟14號一樣的程序。
但是這次在設定資料來源 - 設定Select 陳述式 - 進階 - 使用開放式並行存取 這邊不勾選,步驟三就能成功更新了。
同一個GridView, 修改這個地方成勾選後再測一次,就會再出現oledb 錯誤。

所以…雖然問題沒解決,但是避免的方法還是知道了。
等那位前輩有空時再解答囉!

PS: 目前這個東西都還處於小弟自已關門起來做的階段,所以…同時間不會有別人去存取同一資料表/資料庫的狀況發生。
Knowledge is Power