如果我有一个像这样的 ObjectDataSource 设置:
<asp:ObjectDataSource
ID="ObjectDataSource1"
runat="server"
DataObjectTypeName="Employee"
InsertMethod="Insert"
UpdateMethod="Update"
DeleteMethod="Select"
TypeName="EmployeeDB">
</asp:ObjectDataSource>
和一个数据/业务对象,方法如下:
public class EmployeeDB
{
public void Insert(Employee emp)
public int Update(Employee emp)
public bool Delete(int id)
}
如何让对象数据源使用带有非 Employee 对象参数的 Delete 方法?
如果这不可能,推荐的替代架构是什么?
编辑:
为了澄清,我想在我的数据/业务对象上使用方法签名,如上所示,但是如果我尝试允许将 Employee 对象传递到使用 DataObjectTypeName 的某些方法中,那么我似乎失去了能力例如,有些方法仅采用整数 ID。
如果我不使用 DataObjectTypeName,那么我必须将所有方法参数放在 ObjectDataSource 中并更改数据/业务对象上的方法以匹配,这似乎是一个糟糕的设计选择,因为随着 Employee 对象的改变,我将不得不更新这些方法中的每一个。 有没有更好的架构?
最佳答案
这是解决方案,它适用于我的更新操作,然后删除比更新容易得多:
创建类来传递参数。 例如:我正在为 Usermaster 表传递参数:UserMasterDT:
public UserMasterDT(int userid, int roleid, string Firstname, string ) { this.muserid = userid; this.mroleid = roleid; this.mfirstname = Firstname; this.mlastname = Lastname; } //Here set this prop as DUMMY output variable, that u used everywhere to get output value public int iRecUpdated { get { return mrecupdated; } set { mrecupdated = value; } }
我正在将 objectdatasource 绑定(bind)到 formview 以进行更新更新。设置 objectdatasource 如下:
<asp:ObjectDataSource ID="odsUser" runat="server" TypeName="MMCTaxINTLXMLValidation.UserBLL" SelectMethod="GetUserRoleByUserId" DataObjectTypeName="MMCTaxINTLXMLValidation.UserMasterDT" OldValuesParameterFormatString="original_{0}" UpdateMethod="UpdateUserWithTransaction" onupdated="odsUser_Updated"> <SelectParameters> <asp:QueryStringParameter Name="iUId" QueryStringField="UserId" Type="Int32" DefaultValue="-1" /> </SelectParameters> <UpdateParameters> <asp:Parameter Name="UserId" Type="Int32" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="RoleId" Type="Int32" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="Firstname" Type="String" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="Lastname" Type="String" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="BirthDate" Type="String" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="MMCEmail" Type="String" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="Homecontact" Type="String" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="Officecontact" Type="String" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="Cellcontact" Type="String" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="Logon" Type="String" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="Password" Type="String" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="PasswordQ1" Type="String" ConvertEmptyStringToNull="true" /> <asp:Parameter Name="PasswordA1" Type="String" ConvertEmptyStringToNull="true" /> </UpdateParameters> </asp:ObjectDataSource>
注意这里没有任何输出参数
现在,IN U R BLL 在更新方法中,传递并返回 UserMasterDT 作为输入和输出。不要传递单独的参数和输出变量。编写如下代码:
这里我传入和传出 UserMasterDT
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, true)] public UserMasterDT UpdateUserWithTransaction(UserMasterDT tempuser) { int iRecUpdated = -1; Adapter.BeginTransaction(); try { string sFlag = "UpdateUserRole"; int iUserId = tempuser.UserId; int iRoleId = tempuser.RoleId; string sFirstname = tempuser.Firstname; string sLastname = tempuser.Lastname; int? iReturnData; //THIS OUT IS FROM MY SQL STORED PROCE NOT WITH OBJECTDATASOURCE OUT PARAMETER. IT HAS NOTHING TO DO WITH OBJECT DATA SOUCE. Adapter.UpdateUserRole(sFlag,iUserId,iRoleId,sFirstname,sLastname,out iReturnData); if (iReturnData == 1) { iRecUpdated = 1; this.Adapter.CommitTransaction(); } else if (iReturnData == null) iRecUpdated = -1; //What ever is return, set it back to UserMasterDT's iRecUpdated prop tempuser.iRecUpdated = iRecUpdated; return tempuser; } catch (Exception ex) { if (ex != null) { Adapter.RollbackTransaction(); //CustomEX objCUEx = new CustomEX(ex.Message, ex); ex = null; iRecUpdated = -1; //-1 : Unexpected Error //What ever is return, set it back to UserMasterDT's iRecUpdated prop tempuser.iRecUpdated = iRecUpdated; return tempuser; } } finally { tempuser.iRecUpdated = iRecUpdated; } //Return tempuser back return tempuser; }
然后在aspx.cs页面中读取UserMasterDT的属性如下:
if (e.Exception == null) { UserMasterDT tempuser = (UserMasterDT) e.ReturnValue; lblMsg.Text = "Record Updated : " + tempuser.iRecUpdated.ToString(); }
我的存储过程是:
set ANSI_NULLS ON create PROCEDURE [dbo].[UpdateUserRole] ( @sFlag varchar(50), @iUserId int, @iRoleId int, @sFirstname varchar(50), @sLastname varchar(50), @iReturnData int output ) as Begin Declare @errnum as int Declare @errseverity as int Declare @errstate as int Declare @errline as int Declare @errproc as nvarchar(100) Declare @errmsg as nvarchar(4000) ----------------------- if @sFlag = upper('UPDATEUSERROLE') begin begin try begin tran --Update User Master Table UPDATE tblUserMaster SET Firstname = @sFirstname, Lastname = @sLastname, WHERE UserId = @iUserId --Update tblUserRolesTran Table update tblUserRolesTran set roleid = @iRoleId where Userid = @iUserId commit tran -- If commit tran execute then trancount will decrease by 1 -- Return Flag 1 for update user record and role record SET @iReturnData = 1 end try begin catch IF @@Trancount > 0 -- Get Error Detail In Variable Select @errnum =@@ERROR, @errseverity = ERROR_SEVERITY(), @errstate = ERROR_STATE(), @errline = ERROR_LINE(), @errproc = ERROR_PROCEDURE(), @errmsg = ERROR_MESSAGE() rollback tran -- To see print msg, keep raise error on, else these msg will not be printed and dislayed print '@errnum : ' + ltrim(str(@errnum )) print '@errseverity : ' + ltrim(str(@errseverity)) print '@errstate : ' + ltrim(str(@errstate)) print '@errline : ' + ltrim(str(@errline)) print '@errproc : ' + @errproc print '@errmsg : ' + @errmsg --Raise error doesn't display error message below 50000 --So we have to create custom message and add to error table using sp_addmessage ( so_addmessage is built-in sp) --In custom error message we have line number and error message Declare @custerrmsg as nvarchar(4000) Select @custerrmsg = 'Proc: UpdateUserRole, Line: ' + ltrim(str(@errline)) + ': ' + @errmsg if (@errnum < 50000) EXEC SP_ADDMESSAGE @msgnum = 50002, @severity = 16, @msgtext = @custerrmsg, @replace = 'REPLACE' --After adding custom error message we need to raise error --Raise error will appear at client (.net application) RAISERROR(50002,16,1) end catch end set nocount off End
希望这对您有帮助。 赛拉姆
关于c# - 使用 ObjectDataSource 和 DataObjectTypeName,如何处理只有一个 Id 参数的删除方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/913571/