我在我的web應用程序中使用ObjectDataSource而不是SqlDataSource創建了一個數據訪問層。我有一個FormView來更新我的數據庫中的一些數據。在我的舊asp.net代碼中,我有類似的東西:從SqlDataSource轉換爲ObjectDataSource,導致悲傷
<asp:SqlDataSource ID="sdsTradeDetails" runat="server"
ConnectionString="<%$ ConnectionStrings:ForexDB %>"
SelectCommand="usp_GetTrade" SelectCommandType="StoredProcedure"
UpdateCommand="usp_UpdateTrade" UpdateCommandType="StoredProcedure"
<SelectParameters>
<asp:ControlParameter Name="tradeId" ControlID="grdTrades" PropertyName="SelectedDataKey.Value" />
</SelectParameters>
<UpdateParameters>
<asp:ControlParameter Name="tradeId" ControlId="frmTrade" PropertyName="SelectedValue" />
</UpdateParameters>
</asp:SqlDataSource>
哪些工作正常。我已經取代了SqlDataSource的這個:
<asp:ObjectDataSource
id="srcTrade"
TypeName="DatabaseComponent.DBUtil"
SelectMethod="GetTrade"
UpdateMethod="UpdateTrade"
runat="server">
<SelectParameters>
<asp:QueryStringParameter Name="tradeId" QueryStringField="tradeId" />
</SelectParameters>
<UpdateParameters>
<asp:ControlParameter Name="tradeId" ControlId="frmTrade" PropertyName="SelectedValue" />
</UpdateParameters>
</asp:ObjectDataSource>
但現在當我在FormView控件點擊更新按鈕,我得到這個錯誤:
異常詳細信息: System.InvalidOperationException: ObjectDataSource控件 'srcTrade'不能 找到一個非泛型方法 'UpdateTrade' 有參數: 符號,pctAccountRisked, tradeSetupId,lotsPerUnit, initialStopPrice,tfCode,MAEPips, MFEPips,tradeGrade,executionGrade, tradeTypeId,comment,tradeId。
在我DBUtil類我有這樣的UpdateTrade:
public void UpdateTrade(
int tradeId,
string symbol,
decimal pctAccountRisked,
string tradeSetupId,
decimal lotsPerUnit,
decimal initialStopPrice,
string tfCode,
int MAEPips,
int MFEPips,
int tradeGrade,
int executionGrade,
string comment)
{
SqlCommand cmd = new SqlCommand("usp_UpdateTrade");
cmd.Parameters.AddWithValue("@tradeId", tradeId);
cmd.Parameters.AddWithValue("@symbol", symbol);
cmd.Parameters.AddWithValue("@pctAccountRisked", pctAccountRisked);
cmd.Parameters.AddWithValue("@tradeSetupId", tradeSetupId);
cmd.Parameters.AddWithValue("@lotsPerUnit", lotsPerUnit);
cmd.Parameters.AddWithValue("@initialStopPrice", initialStopPrice);
cmd.Parameters.AddWithValue("@tfCode", tfCode);
cmd.Parameters.AddWithValue("@MAEPips", MAEPips);
cmd.Parameters.AddWithValue("@MFEPips", MFEPips);
cmd.Parameters.AddWithValue("@tradeGrade", tradeGrade);
cmd.Parameters.AddWithValue("@executionGrade", executionGrade);
cmd.Parameters.AddWithValue("@comment", comment);
UpdateTable(cmd, "trade");
}
這對於GetTrade:
public DataTable GetTrade(int tradeId)
{
SqlCommand cmd = new SqlCommand("usp_GetTrade");
cmd.Parameters.AddWithValue("@tradeId", tradeId);
return FillDataTable(cmd, "trade");
}
請幫幫忙!
感謝您的回答。我剛剛檢查了參數。我不確定你的意思,但是我所做的是檢查GetTrade返回的列是否存在於UpdateTrade中。 GetTrade返回的一些額外的列在UpdateTrade中不存在,但這正是我想要的。我還能檢查什麼?我是否需要列出UpdateTrade中的每個更新參數?當使用SqlDataSource時,我不需要這樣做,我只是將主鍵(tradeId)添加爲UpdateTrade的唯一參數。 – 2010-11-09 09:49:09
是的,您需要將UpdateTrade方法的所有參數設置爲UpdateParameters(或者必須在更新觸發前將其添加到代碼隱藏中)。 – patmortech 2010-11-09 11:22:12
@patmortech - 非常感謝。現在都在工作。 – 2010-11-09 14:43:49