我在SQL Server上反复测试了这个#blankety-blank#存储过程,它返回0或行数,但在C#中我总是得到-1。我一直在调试#blank#thing几个小时,总是-1。
这是存储过程代码。
Create procedure [dbo].[sp_enter_new_student]
@Prenom_detudiant [varchar](50) = NULL,
@nom_detudiant [varchar](50) = NULL,
@nationalite_detudiant [varchar](40) = NULL,
@langue_parle [varchar](15) = NULL,
@nombre_denfants [int] = NULL,
@sexe_detudiant [char](1) = NULL,
@program_pk [int] = NULL,
@Numero_detudiant int = NULL
As
Declare @numOfRowsBefore int = 0;
declare @numOfRowsAfter int = 0;
declare @Error int = -100;
BEGIN
SET NOCOUNT ON;
select @numOfRowsBefore = COUNT(*) from tbl_students where Numero_detudiant = @Numero_detudiant;
if (@numOfRowsBefore > 0)
begin
Print "Student already exists, Insertion will fail!";
Print "Insertion Failure ! " + CONVERT(varchar(10), @numOfRowsBefore);
return @numOfRowsBefore; --> -1 indicates insertion failure
End
else if (@numOfRowsBefore = 0)
begin
Print "Student doesn't exists, Insertion will be Success!";
Print "Insertion Success ! " + CONVERT(varchar(10), @numOfRowsBefore);
return @numOfRowsBefore; --> -1 indicates insertion failure
End
END
这是一个C#代码
public int enregistreNouveauEtudiant(string Prenom_detudiant, string nom_detudiant, string nationalite_detudiant, string langue_parle, string nombre_denfants, string sexe_detudiant, string program_pk, string Numero_detudiant)
{
int numberOfRowsInserted = 0;
//try
//{
SqlConnection connection = this.GetConnection();
SqlCommand insertStudentCommand = new SqlCommand("sp_enter_new_student", connection);
connection.Open();
insertStudentCommand.CommandType = CommandType.StoredProcedure;
//insertStudentCommand.Parameters.Add("@ID", SqlDbType.Int);
//insertStudentCommand.Parameters["@ID"].Direction = ParameterDirection.Output;
insertStudentCommand.Parameters.Add("@Prenom_detudiant", SqlDbType.VarChar, 50).Value = Prenom_detudiant;
insertStudentCommand.Parameters.Add("@nom_detudiant", SqlDbType.VarChar, 50).Value = nom_detudiant;
insertStudentCommand.Parameters.Add("@nationalite_detudiant", SqlDbType.VarChar, 40).Value = nationalite_detudiant;
insertStudentCommand.Parameters.Add("@langue_parle", SqlDbType.VarChar, 15).Value = langue_parle;
insertStudentCommand.Parameters.Add("@nombre_denfants", SqlDbType.Int).Value = nombre_denfants;
insertStudentCommand.Parameters.Add("@sexe_detudiant", SqlDbType.Char, 1).Value = sexe_detudiant;
insertStudentCommand.Parameters.Add("@program_pk", SqlDbType.Int).Value = program_pk;
insertStudentCommand.Parameters.Add("@Numero_detudiant", SqlDbType.Int).Value = Numero_detudiant;
numberOfRowsInserted = insertStudentCommand.ExecuteNonQuery();
connection.Close();
return numberOfRowsInserted;
}
有人可以看看这个问题吗?我也使用了try和catch块,在这种情况下它绝对没用。
感谢。
答案 0 :(得分:6)
您应该在c#代码中使用ExecuteScalar
代替ExecuteNonQuery
在您的sql代码中使用SELECT
代替return
答案 1 :(得分:4)
来自Microsoft doc(here):
对于UPDATE,INSERT和DELETE语句,返回值为 受命令影响的行数。当a上存在触发器时 正在插入或更新的表,返回值包括数字 受插入或更新操作影响的行数和数字 受触发器或触发器影响的行数。对于所有其他类型的 语句,返回值为-1。如果发生回滚,则返回 值也是-1。
请注意,由于您的命令(“sp_enter_new_student”)是隐式EXECUTE命令,因此它不是UPDATE,INSERT或DELETE,因此将始终返回-1。
如果要向程序返回单个值,一种方法是使用ExecuteScalar
代替,然后在存储过程中使用SELECT @numOfRowsBefore;
返回值,而不是使用{{ 1}}陈述。
但是,如果您想保留使用SQL Return
语句的方法,那么您可以通过在c#代码中添加这样的行来实现此目的:
Return
(我认为这有效,但我现在无法测试)