使用ObjectDataSource控件和DataObjectTypeName,你是如何处理删除的方法只有一个ID参数?你是、只有一个、控件、如何处理

由网友(小帅哥)分享简介:如果我有一个ObjectDataSource设置,如:< ASP:ObjectDataSource控件ID =ObjectDataSource1=服务器DataObjectTypeName =雇员InsertMethod =插入UpdateMethod =更新DeleteMethod =选择类型名=Employe...

如果我有一个ObjectDataSource设置,如:

 < ASP:ObjectDataSource控件
    ID =ObjectDataSource1
    =服务器
    DataObjectTypeName =雇员
    InsertMethod =插入
    UpdateMethod =更新
    DeleteMethod =选择
    类型名=EmployeeDB>
< / ASP:ObjectDataSource控件>
 

和用类似的方法数据/业务对象:

 公共类EmployeeDB
{
    公共无效插入(员工EMP)
    公众诠释更新(员工EMP)
    公共BOOL删除(INT ID)
}
 
SqlDataSource和ObjectDataSource控件的区别

我如何ObjectDataSource使用的删除方法不是Employee对象的参数?

如果这是不可能的,什么是推荐的替代方案架构?

编辑:

要澄清一下,我要使用的方法签名我的数据/业务对象如上图所示,但是如果我尝试允许传入一些使用DataObjectTypeName方法Employee对象,然后我似乎失去了能力,有一些方法将一个整数ID为实例。

如果我不使用DataObjectTypeName,那么我必须把在ObjectDataSource控件的所有方法参数和更改数据/业务对象匹配的方法,这似乎是一个不好的设计选择,因为作为Employee对象改变了我将有更新这些方法。 有没有更好的架构?

解决方案

下面是解决方案,它为我工作的更新操作,然后删除更容易比更新:

创建类来传递参数。 例如:我想过去放慢参数为Usermaster表:UserMasterDT:

 公共UserMasterDT(INT用户ID,INT roleid,串名字,字符串)
{
    this.muserid =用户标识;
    this.mroleid = roleid;
    this.mfirstname =名字;
    this.mlastname =姓氏;
}

//这里设置此道具为虚输出变量,美处处用到了获取产值
公众诠释iRecUpdated
{
    {返回mrecupdated; }
    集合{mrecupdated =价值; }
}
 

我绑定ObjectDataSource控件FormView控件进行更新uperation.Set ObjectDataSource控件如下:

 < ASP:ObjectDataSource控件ID =odsUser=服务器
    类型名=MMCTaxINTLXMLValidation.UserBLL
    SelectMethod =GetUserRoleByUserId
    DataObjectTypeName =MMCTaxINTLXMLValidation.UserMasterDT
    OldValues​​ParameterFormatString =original_ {0}
    UpdateMethod =UpdateUserWithTransactiononupdated =odsUser_Updated>
    < SelectParameters>
        < ASP:QueryStringParameter名称=IUIDQueryStringField =用户ID类型=的Int32
            默认值= -  1/>
    < / SelectParameters>
    < UpdateParameters>
        < ASP:参数名称=用户ID类型=的Int32ConvertEmptyStringToNull =真/>
        < ASP:参数名称=RoleId类型=的Int32ConvertEmptyStringToNull =真/>
        < ASP:参数名称=名字类型=字符串ConvertEmptyStringToNull =真/>
        < ASP:参数名称=姓氏类型=字符串ConvertEmptyStringToNull =真/>
        < ASP:参数名称=出生日期类型=字符串ConvertEmptyStringToNull =真/>
        < ASP:参数名称=MMCEmail类型=字符串ConvertEmptyStringToNull =真/>
        < ASP:参数名称=HOMECONTACT类型=字符串ConvertEmptyStringToNull =真/>
        < ASP:参数名称=Officecontact类型=字符串ConvertEmptyStringToNull =真/>
        < ASP:参数名称=Cellcontact类型=字符串ConvertEmptyStringToNull =真/>
        < ASP:参数名称=登录类型=字符串ConvertEmptyStringToNull =真/>
        < ASP:参数名称=密码类型=字符串ConvertEmptyStringToNull =真/>
        < ASP:参数名称=PasswordQ1类型=字符串ConvertEmptyStringToNull =真/>
        < ASP:参数名称=PasswordA1类型=字符串ConvertEmptyStringToNull =真/>
    < / UpdateParameters>
< / ASP:ObjectDataSource控件>
 

发现有这里没有任何输出放慢参数

现在,在乌拉圭回合BLL在更新方法,传递和返回UserMasterDT作为输入和输出。不通过单独的参数和OUT VARAIBLE。写code这样的:

下面我传递UserMasterDT和移出

[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update,真正)] 公共UserMasterDT UpdateUserWithTransaction(UserMasterDT tempuser) {     INT iRecUpdated = -1;     Adapter.BeginTransaction();     尝试     {         字符串SFlag的=UpdateUserRole;         INT iUserId = tempuser.UserId;         INT iRoleId = tempuser.RoleId;         字符串sFirstname = tempuser.Firstname;         字符串sLastname = tempuser.Lastname;         诠释? iReturnData;         //这一点是从我的SQL存储PROCE不ObjectDataSource控件OUT参数。它已无关,与对象数据的烃源。         Adapter.UpdateUserRole(SFlag的,iUserId,iRoleId,sFirstname,sLastname,出iReturnData);         如果(iReturnData == 1)         {             iRecUpdated = 1;             this.Adapter.CommitTransaction();         }         否则,如果(iReturnData == NULL)             iRecUpdated = -1;         //以往有什么回报,将其设置回UserMasterDT的iRecUpdated道具         tempuser.iRecUpdated = iRecUpdated;         返回tempuser;     }     赶上(例外前)     {         如果(恩!= NULL)         {             Adapter.RollbackTransaction();             // CustomEX objCUEx =新CustomEX(ex.Message,前);             EX = NULL;             iRecUpdated = -1; // - 1:意外的错误             //以往有什么回报,将其设置回UserMasterDT的iRecUpdated道具             tempuser.iRecUpdated = iRecUpdated;             返回tempuser;         }     }     最后     {         tempuser.iRecUpdated = iRecUpdated;     }     //返回tempuser回     返回tempuser; }

然后UserMasterDT的aspx.cs页面读取属性如下:

 如果(e.Exception == NULL)
{
    UserMasterDT tempuser =(UserMasterDT)e.ReturnValue;
    lblMsg.Text =记录更新时间:+ tempuser.iRecUpdated.ToString();
}
 

我的存储过程是:

 设置ANSI_NULLS ON

CREATE PROCEDURE [DBO]。[UpdateUserRole]
(
    @sFlag的varchar(50),
    @iUserId INT,
    @iRoleId INT,
    @sFirstname的varchar(50),
    @sLastname的varchar(50),
    @iReturnData INT输出
)
如
开始
    声明@errnum为INT
    声明@errseverity为INT
    声明@errstate为INT
    声明@errline为INT
    声明@errproc为nvarchar的(100)
    声明@errmsg为nvarchar的(4000)


    -----------------------
    如果@sFlag =上('UPDATEUSERROLE)
    开始
        开始尝试
            的begin tran
                --update用户主表
                UPDATE tblUserMaster
                SET名字= @sFirstname,
                姓氏= @sLastname,
                其中userid = @iUserId

                --update tblUserRolesTran表
                更新tblUserRolesTran
                设置roleid = @iRoleId
                其中userid = @iUserId

            提交TRAN  - 如果提交TRAN执行,然后TRANCOUNT将减1

             - 恢复标记1进行更新的用户记录和角色记录
            SET @iReturnData = 1

        年底试
        开始抓
            如果@@ TRANCOUNT> 0
                 - 获取错误的详细信息在变
                选择@errnum = @@ ERROR,
                @errseverity = ERROR_SEVERITY(),
                @errstate = ERROR_STATE(),
                @errline = ERROR_LINE(),
                @errproc = ERROR_PROCEDURE(),
                @errmsg = ERROR_MESSAGE()

                回滚TRAN

                 - 要查看打印味精,不断引发错误的,否则这些味精不会被打印和dislayed
                打印@errnum:'+ LTRIM(STR(@errnum))
                打印@errseverity:'+ LTRIM(STR(@errseverity))
                打印@errstate:'+ LTRIM(STR(@errstate))
                打印@errline:'+ LTRIM(STR(@errline))
                打印@errproc:'+ @errproc
                打印@errmsg:'+ @errmsg

                --Raise错误不显示低于50000错误信息
                 - 因此,我们必须创建自定义消息,并添加使用的sp_addmessage错误表(so_addmessage是内置SP)
                --in自定义错误消息,我们有行号和错误信息
                声明@custerrmsg为nvarchar的(4000)
                选择@custerrmsg ='PROC:UpdateUserRole,行:'+ LTRIM(STR(@errline))+:+ @errmsg

                如果(@errnum< 50000)
                    EXEC的sp_addmessage @msgnum = 50002,@severity = 16,@msgtext = @custerrmsg,@replace ='取代'


                --After添加自定义错误消息,我们需要提升的错误
                将出现在客户端--Raise错误(.NET应用程序)
                RAISERROR(50002,16,1)
        到底抓
        结束
        SET NOCOUNT关闭
结束
 

希望这有助于你什么ü需要做的。 sairam

If I have an ObjectDataSource setup like:

<asp:ObjectDataSource 
    ID="ObjectDataSource1" 
    runat="server" 
    DataObjectTypeName="Employee"
    InsertMethod="Insert" 
    UpdateMethod="Update"
    DeleteMethod="Select" 
    TypeName="EmployeeDB">
</asp:ObjectDataSource>

and a data/business object with methods like:

public class EmployeeDB
{
    public void Insert(Employee emp)
    public int Update(Employee emp)
    public bool Delete(int id)
}

How do I get the objectdatasource to use the Delete method with the parameter that is not an Employee object?

If this is not possible, what is the recommended alternative architecture?

Edit:

To clarify, I want to use the method signature on my data/business object as shown above, however if I try to allow an Employee object to be passed into some of the methods using DataObjectTypeName, then I seemingly lose the ability to have some methods take just an integer id for instance.

If I do not use the DataObjectTypeName, then I have to place all the method parameters in the ObjectDataSource and change the methods on the data/business object to match, this seems like a bad design choice because as the Employee object changes I will have to update each of these methods. Is there a better architecture?

解决方案

Here is solution and it is working for me for update operation then delete far easier than update :

Create Class to pass parameter. For Example : I am passing paramter for Usermaster table : 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; }
}

I am binding objectdatasource to formview for update uperation.Set objectdatasource as follows :

<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>

NOTICE THERE IS NO ANY OUTPUT PARAMTER HERE

Now, IN U R BLL In update method, pass and return UserMasterDT as input and output. DO NOT PASS SEPERATE PARAMETER AND OUT VARAIBLE . Write code like :

HERE I AM PASSING UserMasterDT AS IN AND OUT

[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;
}

then in aspx.cs page read property of UserMasterDT as follows :

if (e.Exception == null)
{
    UserMasterDT tempuser = (UserMasterDT) e.ReturnValue;
    lblMsg.Text = "Record Updated : " + tempuser.iRecUpdated.ToString();
}

My stored proc is :

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

Hope this helps you whatever u need to do. sairam

阅读全文

相关推荐

最新文章