如果我有一个ObjectDataSource设置,如:
< ASP:ObjectDataSource控件
ID =ObjectDataSource1
=服务器
DataObjectTypeName =雇员
InsertMethod =插入
UpdateMethod =更新
DeleteMethod =选择
类型名=EmployeeDB>
< / ASP:ObjectDataSource控件>
和用类似的方法数据/业务对象:
公共类EmployeeDB
{
公共无效插入(员工EMP)
公众诠释更新(员工EMP)
公共BOOL删除(INT ID)
}
![SqlDataSource和ObjectDataSource控件的区别](https://p.xsw88.cn/allimgs/daicuo/20230905/814.png)
我如何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
OldValuesParameterFormatString =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
相关推荐
最新文章