C#中如何知道,存储过程之否执行成功?

漂白猪 2006-04-27 03:30:39
RT
是不是有个返回值什么的?
怎么判断?
...全文
494 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
漂白猪 2006-07-30
  • 打赏
  • 举报
回复
最近因为没电脑所以现在才上网,发现一个问题,其实是我C#里面有个属性写错了,导致运行结果错误了,我的存储过程应该没啥问题
还是谢谢各位的回复了
yaoyaomaomao 2006-04-30
  • 打赏
  • 举报
回复
用try catch捕获异常啊,如果没有异常说明存储过程执行成功
zlp321002 2006-04-30
  • 打赏
  • 举报
回复
CREATE PROC P_TEST
@Name VARCHAR(20),
@flag int OUTPUT
AS
BEGIN
SELECT * FROM T_Customer WHERE NAME=@Name
if @@error=0
begin
SET @flag=1
end

END
GO


----------------------------------------------------------------------------------------
--DotNet 部分(C#)
--WebConfig 文件:
----------------------------------------------------------------------------------------
......
</system.web>

<!-- 数据库连接字符串
-->
<appSettings>
<add key="ConnectString" value="server=(local);User ID=sa;Password=;database=Test" />
</appSettings>

</configuration>
----------------------------------------------------------------------------------------
--C#代码:(用到两个测试控件,DataGrid1(用于显示绑定结果集合),Lable(用于显示存储过程返回单值)
----------------------------------------------------------------------------------------
//添加数据库引用
using System.Data.SqlClient;
......
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
String DBConnStr;
DataSet MyDataSet=new DataSet();
System.Data.SqlClient.SqlDataAdapter DataAdapter=new System.Data.SqlClient.SqlDataAdapter();
DBConnStr=System.Configuration.ConfigurationSettings.AppSettings["ConnectString"];
System.Data.SqlClient.SqlConnection myConnection = new System.Data.SqlClient.SqlConnection(DBConnStr);
if (myConnection.State!=ConnectionState.Open)
{
myConnection.Open();
}
System.Data.SqlClient.SqlCommand myCommand = new System.Data.SqlClient.SqlCommand("P_Test",myConnection);
myCommand.CommandType=CommandType.StoredProcedure;
//添加输入查询参数、赋予值
myCommand.Parameters.Add("@Name",SqlDbType.VarChar);
myCommand.Parameters["@Name"].Value ="A";

//添加输出参数
myCommand.Parameters.Add("@Rowcount",SqlDbType.Int);
myCommand.Parameters["@Rowcount"].Direction=ParameterDirection.Output;


myCommand.ExecuteNonQuery();
DataAdapter.SelectCommand = myCommand;

if (MyDataSet!=null)
{
DataAdapter.Fill(MyDataSet,"table");
}

DataGrid1.DataSource=MyDataSet;
DataGrid1.DataBind();
//得到存储过程输出参数
Label1.Text=myCommand.Parameters["@Rowcount"].Value.ToString();

if (myConnection.State == ConnectionState.Open)
{
myConnection.Close();
}

}


jiahehao 2006-04-30
  • 打赏
  • 举报
回复
调用存储过程后,会有一个系统返回值.存储过程返回一个 0 值表示成功。表示失败则返回一个非零值。
quanyi 2006-04-29
  • 打赏
  • 举报
回复
@@ERROR
返回最后执行的 Transact-SQL 语句的错误代码。

语法
@@ERROR

返回类型
integer

注释
当 Microsoft® SQL Server™ 完成 Transact-SQL 语句的执行时,如果语句执行成功,则 @@ERROR 设置为 0。若出现一个错误,则返回一条错误信息。@@ERROR 返回此错误信息代码,直到另一条 Transact-SQL 语句被执行。您可以在 sysmessages 系统表中查看与 @@ERROR 错误代码相关的文本信息。

由于 @@ERROR 在每一条语句执行后被清除并且重置,应在语句验证后立即检查它,或将其保存到一个局部变量中以备事后查看。

示例
A.用 @@ERROR 检测一个特定错误
下面的示例用 @@ERROR 在一个 UPDATE 语句中检测限制检查冲突(错误 #547)。

USE pubs
GO
UPDATE authors SET au_id = '172 32 1176'
WHERE au_id = "172-32-1176"

IF @@ERROR = 547
print "A check constraint violation occurred"

B.用 @@ERROR 有条件地退出一个过程
在此示例中,IF...ELSE 语句在存储过程中的 INSERT 语句后检测 @@ERROR。@@ERROR 变量的值将决定传给调用程序的返回值,以指示此过程的成功与失败。

USE pubs
GO

-- Create the procedure.
CREATE PROCEDURE add_author
@au_id varchar(11),@au_lname varchar(40),
@au_fname varchar(20),@phone char(12),
@address varchar(40) = NULL,@city varchar(20) = NULL,
@state char(2) = NULL,@zip char(5) = NULL,
@contract bit = NULL
AS

-- Execute the INSERT statement.
INSERT INTO authors
(au_id, au_lname, au_fname, phone, address,
city, state, zip, contract) values
(@au_id,@au_lname,@au_fname,@phone,@address,
@city,@state,@zip,@contract)

-- Test the error value.
IF @@ERROR <> 0
BEGIN
-- Return 99 to the calling program to indicate failure.
PRINT "An error occurred loading the new author information"
RETURN(99)
END
ELSE
BEGIN
-- Return 0 to the calling program to indicate success.
PRINT "The new author information has been loaded"
RETURN(0)
END
GO

C.用 @@ERROR 检测几条语句的成功
下面的示例取决于 INSERT 和 DELETE 语句的成功操作。局部变量在两条语句后均被设置为 @@ERROR 的值,并且用于此操作的共享错误处理例程中。

USE pubs
GO
DECLARE @del_error int, @ins_error int
-- Start a transaction.
BEGIN TRAN

-- Execute the DELETE statement.
DELETE authors
WHERE au_id = '409-56-7088'

-- Set a variable to the error value for
-- the DELETE statement.
SELECT @del_error = @@ERROR

-- Execute the INSERT statement.
INSERT authors
VALUES('409-56-7008', 'Bennet', 'Abraham', '415 658-9932',
'6223 Bateman St.', 'Berkeley', 'CA', '94705', 1)
-- Set a variable to the error value for
-- the INSERT statement.
SELECT @ins_error = @@ERROR

-- Test the error values.
IF @del_error = 0 AND @ins_error = 0
BEGIN
-- Success. Commit the transaction.
PRINT "The author information has been replaced"
COMMIT TRAN
END
ELSE
BEGIN
-- An error occurred. Indicate which operation(s) failed
-- and roll back the transaction.
IF @del_error <> 0
PRINT "An error occurred during execution of the DELETE
statement."

IF @ins_error <> 0
PRINT "An error occurred during execution of the INSERT
statement."

ROLLBACK TRAN
END
GO

D. 与 @@ROWCOUNT 一同使用 @@ERROR
下面的示例用 @@ERROR 和 @@ROWCOUNT 验证一条 UPDATE 语句的操作。为任何可能出现的错误而检验 @@ERROR 的值,而用 @@ROWCOUNT 保证更新已成功应用于表中的某行。

USE pubs
GO
CREATE PROCEDURE change_publisher
@title_id tid,
@new_pub_id char(4)
AS

-- Declare variables used in error checking.
DECLARE @error_var int, @rowcount_var int

-- Execute the UPDATE statement.
UPDATE titles SET pub_id = @new_pub_id
WHERE title_id = @title_id

-- Save the @@ERROR and @@ROWCOUNT values in local
-- variables before they are cleared.
SELECT @error_var = @@ERROR, @rowcount_var = @@ROWCOUNT

-- Check for errors. If an invalid @new_pub_id was specified
-- the UPDATE statement returns a foreign-key violation error #547.
IF @error_var <> 0
BEGIN
IF @error_var = 547
BEGIN
PRINT "ERROR: Invalid ID specified for new publisher"
RETURN(1)
END
ELSE
BEGIN
PRINT "ERROR: Unhandled error occurred"
RETURN(2)
END
END

-- Check the rowcount. @rowcount_var is set to 0
-- if an invalid @title_id was specified.
IF @rowcount_var = 0
BEGIN
PRINT "Warning: The title_id specified is not valid"
RETURN(1)
END
ELSE
BEGIN
PRINT "The book has been updated with the new publisher"
RETURN(0)
END
GO

chenqianlong 2006-04-29
  • 打赏
  • 举报
回复
try
{

}
catch
{

}
漂白猪 2006-04-29
  • 打赏
  • 举报
回复
up
漂白猪 2006-04-28
  • 打赏
  • 举报
回复
我怎么知道操作是否成功呐?
比如我一个存储过程里面有2个insert into 语句
我用了
begin tran
insert into A values(a,b,c)
insert into B values(d,e)
commit

我要2个insert into,要么同时执行成功,要么都不执行(不知道这样写对否?)

然后我在程序里面学要调用这个存储过程,而且需要得到一个状态值(是否成功),这个怎么做?
allfuly 2006-04-27
  • 打赏
  • 举报
回复
取return的返回值
比如存储过程里用
return 1
asp.net我不太会,你可以参考这个ASP调用存储过程的文章
http://blog.csdn.net/allfuly/archive/2006/04/25/676141.aspx
$扫地僧$ 2006-04-27
  • 打赏
  • 举报
回复
最笨得办法:
返回一个(表变量)表值
判断这个表是否有数据就可以了阿!
$扫地僧$ 2006-04-27
  • 打赏
  • 举报
回复
你可以用 OUTPUT 参数 自己写个返回值

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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