C# 存储过程不处理代码
我有一个非常简单的存储过程,它向我返回一些输出变量 如果我通过任何方法(ManagementStudio、VisualStudioServerExplorer)执行此存储过程,它都可以正常工作 问题是,如果我尝试在客户端使用C# 存储过程不处理代码,c#,sql,.net,stored-procedures,C#,Sql,.net,Stored Procedures,我有一个非常简单的存储过程,它向我返回一些输出变量 如果我通过任何方法(ManagementStudio、VisualStudioServerExplorer)执行此存储过程,它都可以正常工作 问题是,如果我尝试在客户端使用ExecuteNonQuery()执行它,它不会执行存储过程,ExecuteNonQuery()返回值-1,并且没有输出。我想知道我是否应该使用除ExecuteNonQuery()以外的其他方法来执行此过程并获取这些输出变量 这是我的存储过程: CREATE PROCEDUR
ExecuteNonQuery()
执行它,它不会执行存储过程,ExecuteNonQuery()
返回值-1,并且没有输出。我想知道我是否应该使用除ExecuteNonQuery()
以外的其他方法来执行此过程并获取这些输出变量
这是我的存储过程:
CREATE PROCEDURE [dbo].ChekEmail
@Email varchar(50),
@Id int output,
@Flag_User int output
AS
SET @Id = 0
SET @Id = (SELECT Client.Id FROM Client WHERE Client.Email = @Email)
IF(@Id > 0)
BEGIN
SET @Flag_User = 1
RETURN @Id
END
ELSE
BEGIN
SET @Id = (SELECT Clinic.Id FROM Clinic WHERE Clinic.Email = @Email)
IF(@Id > 0)
BEGIN
SET @Flag_User = 2
RETURN @Id
END
END
这就是我执行它的地方
public int CheckEmail(string Email)
{
Conection con = new Conection();
SqlCommand cmd = new SqlCommand("ChekEmail");
cmd.Connection = con.connect();
cmd.Parameters.AddWithValue("@Email", Email);
cmd.Parameters.Add("@Id", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.Parameters.Add("@Flag_User", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.CommandType = CommandType.StoredProcedure;
int x = cmd.ExecuteNonQuery();
if (x >= 0)
{
int Id_Owner = Convert.ToInt32(cmd.Parameters["@Id"].Value.ToString());
int Flag_User = Convert.ToInt32(cmd.Parameters["@Flag_User"].Value.ToString());
if (Flag_User == 1)
{
return Id_Owner;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
正如您在ExecuteOnQuery的MSDN页面上所看到的,为SELECT查询返回-1是一种有文档记录的行为 对于UPDATE、INSERT和DELETE语句,返回值为 受命令影响的行数。当触发器存在于 在插入或更新表时,返回值包括数字 受插入或更新操作和编号影响的行数 受一个或多个触发器影响的行数。对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回 值也为-1 但这并不意味着您的存储过程尚未执行。简单地说,不会返回当前存储过程中受影响的行,因为您不使用任何必需的命令,只使用一个SELECT命令。
不要将
RETURN@Id
误认为是ExecuteNonQuery
返回的值。您只需在ExecuteOnQuery调用之后删除if
您还可以将存储过程更改为
CREATE PROCEDURE [dbo].ChekEmail
@Email varchar(50),
@Id int output,
@Flag_User int output
AS
SET @Id = 0
SELECT @Id = Client.Id FROM Client WHERE Client.Email = @Email
IF(@Id >0 )
BEGIN
SET @Flag_User = 1
RETURN @Id
END
ELSE
BEGIN
SELECT @Id = Clinic.Id FROM Clinic WHERE Clinic.Email = @Email
IF(@Id >0 )
BEGIN
SET @Flag_User = 2
RETURN @Id
END
END
在这个更新的存储过程中,我使用非标准SELECT将查询结果分配给@ID参数。此更改的原因在中有很好的解释(否则需要检查@Id参数中返回的空值)
如果您想读取RETURN@Id
,则需要在查询中添加另一个参数,并用ParameterDirection.ReturnValue
标记
cmd.Parameters.Add("@result", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
....
int result = Convert.ToInt32(cmd.Parameters["@result"].Value.ToString());
“不起作用”?症状是什么。“它不工作”不是问题的解释。它不执行存储过程,ExecuteNonQuery()返回值-1,没有输出。我已经尝试过了。我得到一个“System.FormatException”消息:“输入字符串的格式不正确。”仍然不工作,我无法获取任何输出变量,也无法获取返回值。您现在有错误吗?如果没有,是否在SQLServerManagementStudio中使用相同的参数尝试相同的查询?