请教C#泛型方法返回值类型不确定,其他地方怎么调用

Alone章鱼 2017-06-01 03:32:09
对泛型还不是很理解,请大家教教我啊。
我这有个方法,用到了dbHelper,我想当没有存储过程自定义错误 (Error == NULL) 时返回一个bool值,有错误时(Error != null)返回一个string字符串
之前用的是out返回多参数,想用泛型,又不知道怎么调用

之前的方法:

public bool AddUser(string FsUI_Account, string FsUI_PassWord, string FsUI_Name, int FnUI_Type, out string Error)
{
var db = GetdbHelper();
db.execType = dbHelper.ExecType.IfRead;
db.IsProc = true;
db.CmdText = "Pr_PRC_AddUser";
db.NeedOutError = true;
db.AddParameter("@FsUI_Account", SqlDbType.NVarChar, FsUI_Account);
db.AddParameter("@FsUI_PassWord", SqlDbType.NVarChar, FsUI_PassWord);
db.AddParameter("@FsUI_Name", SqlDbType.NVarChar, FsUI_Name);
db.AddParameter("@FnUI_Type", SqlDbType.NVarChar, FnUI_Type);
db.Exec();
Error = db.Error;
return db.Result;
}


调用的地方:

protected void RegBut_Click(object sender, EventArgs e)
{
string Errors;
string MD5psw = GetMD5(PswBox.Text);
AddInfo AI = new AddInfo();
bool AddUser = AI.AddUser(AccountBox.Text, MD5psw, UserNameBox,1,out Errors);
//这里开始出错,说有无效参数
}


...全文
795 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alone章鱼 2017-06-01
  • 打赏
  • 举报
回复
引用 6 楼 duanzi_peng 的回复:
没有必要使用泛型,单纯的返回一个字符串就行了。比如你原来返回的bool 在没有异常的情况下 完全可以返回一个空的字符串,类似:

return db.Result ? "" : 捕获的异常;
否则就使用try 将捕获的exception 返回出去
可以的。受教了,谢谢
exception92 2017-06-01
  • 打赏
  • 举报
回复
没有必要使用泛型,单纯的返回一个字符串就行了。比如你原来返回的bool 在没有异常的情况下 完全可以返回一个空的字符串,类似:

return db.Result ? "" : 捕获的异常;
否则就使用try 将捕获的exception 返回出去
Alone章鱼 2017-06-01
  • 打赏
  • 举报
回复
引用 3 楼 bloodish 的回复:
1.没看出哪里需要用泛型 2.返回多个值,可以Tuple(元组)封装一下,按你的例子,返回Tuple<bool,string>即可 3,这句有问题,自己想一下问题在哪,知道问题在哪就明白为什么提示无效参数了

db.AddParameter("@FnUI_Type", SqlDbType.NVarChar, FnUI_Type);
谢谢
Alone章鱼 2017-06-01
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
至于说抛出异常需要有什么自定义的属性/字段,你可以封装自己的 Exception 子类,然后抛出自定义的 Exception。不管属性类型有什么不一样(有的是 bool 有的是 string 或者别的),它们都是 Exception。 你在编程时学习过捕获底层代码抛出的不同的 Exception 的方法吗?
在我的存储过程里Eroor主要用来检查的

USE [MessageBoard]
GO
/****** Object:  StoredProcedure [dbo].[Pr_PRC_AddUser]    Script Date: 06/01/2017 15:59:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/*	
	--Author:张**
	--CreatedDate:2017-6-1
	--Description: 注册录入用户信息
	--Example:
	DECLARE @Error VARCHAR(256)
	EXEC MessageBoard.dbo.Pr_PRC_AddUser
	@FsUI_Account ='zhang',
	@FsUI_PassWord ='12345',
	@FsUI_Name ='阿萨德',
	@FnUI_Type = 3,  --输入参数 用户类型     0 表示管理员  1 表示普通用户  
	@Error = @Error OUTPUT
	IF @Error IS NOT NULL SELECT @Error AS [@Error]
	
*/
ALTER PROCEDURE [dbo].[Pr_PRC_AddUser]
(
	@FsUI_Account NVARCHAR(32), --输入参数 账号
	@FsUI_PassWord NVARCHAR(32),  --输入参数 密码
	@FsUI_Name NVARCHAR(64),  --输入参数 姓名
	@FnUI_Type SMALLINT,  --输入参数 用户类型     0 表示管理员  1 表示普通用户  
	@Error VARCHAR(256)=NULL output    --输出错误提示信息
)
AS 
SET NOCOUNT ON
--------------------------条件判断
SELECT
	@FsUI_Account = ISNULL(@FsUI_Account,''),
	@FsUI_PassWord = ISNULL(@FsUI_PassWord,''),
	@FsUI_Name = ISNULL(@FsUI_Name,''),
	@FnUI_Type = ISNULL(@FnUI_Type,-1)
	
BEGIN TRY
	IF LEN(@FsUI_Account)=0 RAISERROR('账号不能为空',16,10)
	IF LEN(@FsUI_PassWord)=0 RAISERROR('密码不能为空',16,10)
	IF LEN(@FsUI_Name)=0 RAISERROR('姓名不能为空',16,10)
	IF @FnUI_Type<0 OR @FnUI_Type>1 RAISERROR('无效参数[Type]',16,10)
	IF EXISTS(SELECT * FROM [MessageBoard].dbo.TMB_B_UserInfo WHERE FsUI_Account = @FsUI_Account) RAISERROR('该账号已被注册',16,10)
	IF EXISTS(SELECT * FROM [MessageBoard].dbo.TMB_B_UserInfo WHERE FsUI_Name = @FsUI_PassWord) RAISERROR('该名字已被使用',16,10)	
END TRY
---------------------------------------错误检查		
BEGIN CATCH
	SELECT @Error = CASE WHEN ERROR_NUMBER() <> 50000 THEN '[SystemError]' ELSE '' END + ERROR_MESSAGE();
END CATCH 

IF @Error IS NOT NULL RETURN    

------------------------------------事物处理
BEGIN TRY
	BEGIN TRANSACTION TRAN_AddUser
	---
	INSERT INTO [MessageBoard].dbo.TMB_B_UserInfo(
		FsUI_Account,
		FsUI_PassWord,
		FsUI_Name,
		FnUI_Type)
	VALUES(
		@FsUI_Account,
		@FsUI_PassWord,
		@FsUI_Name,
		@FnUI_Type)
	---
	COMMIT TRANSACTION TRAN_AddUser
END TRY
----------------------------检查是否出错
BEGIN CATCH
	ROLLBACK TRANSACTION TRAN_AddUser
	SELECT @Error = CASE WHEN ERROR_NUMBER() <> 50000 THEN '[SystemError]' ELSE '' END + ERROR_MESSAGE();
END CATCH

------------------------查询成功录入的用户信息
IF @Error IS NULL
BEGIN
	SELECT * FROM [MessageBoard].dbo.TMB_B_UserInfo WHERE FsUI_Account=@FsUI_Account
END
--------------------------
SET NOCOUNT OFF

bloodish 2017-06-01
  • 打赏
  • 举报
回复
1.没看出哪里需要用泛型 2.返回多个值,可以Tuple(元组)封装一下,按你的例子,返回Tuple<bool,string>即可 3,这句有问题,自己想一下问题在哪,知道问题在哪就明白为什么提示无效参数了

db.AddParameter("@FnUI_Type", SqlDbType.NVarChar, FnUI_Type);
  • 打赏
  • 举报
回复
至于说抛出异常需要有什么自定义的属性/字段,你可以封装自己的 Exception 子类,然后抛出自定义的 Exception。不管属性类型有什么不一样(有的是 bool 有的是 string 或者别的),它们都是 Exception。 你在编程时学习过捕获底层代码抛出的不同的 Exception 的方法吗?
  • 打赏
  • 举报
回复
有错误就应该抛出一个异常 Exception。什么又是 bool 又是 string 的?你是学过最基本的 c 所以学的这个编程模式吗? 在 .net 中,如果有错误应该抛出,然后让程序流程走系统异常处理机制(异常调试机制),直接“向上”抛出,根本不走什么函数堆栈返回路径。

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧