6

この #blankety-blank# ストアド プロシージャを SQL Server で繰り返しテストしたところ、0 または行数が返されましたが、C# では常に -1 が返されました。私はこの #blank# を何時間もデバッグしてきましたが、常に -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 ブロックも使用しましたが、この場合はまったく役に立ちません。

ありがとう。

4

2 に答える 2

7

C#コードではExecuteScalar代わりに使用する必要がありますExecuteNonQuery

SQLコードSELECTの代わりに使用 しますreturn

于 2012-11-01T19:06:30.980 に答える
4

Microsoft doc から (ここ):

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドによって影響を受けた行の数です。挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、挿入操作または更新操作の両方によって影響を受ける行の数と、トリガーまたはトリガーによって影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は -1 です。ロールバックが発生した場合、戻り値も -1 です。

コマンド ("sp_enter_new_student") は暗黙の EXECUTE コマンドであるため、UPDATE、INSERT、DELETE のいずれでもないため、常に -1 が返されることに注意してください。

プログラムに 1 つの値を返したい場合は、代わりに を使用し、ステートメントを使用する代わりに、ストアド プロシージャでExecuteScalara を使用して値を返す方法があります。SELECT @numOfRowsBefore;Return


ただし、SQL ステートメントを使用するアプローチを維持したい場合は、次のReturnような行を C# コードに追加することでこれを行うことができます。

SqlParameter retval = insertStudentCommand.Parameters.Add("retval");
retval.Direction = ParameterDirection.ReturnValue;

insertStudentCommand.ExecuteNonQuery();
numberOfRowsInserted = (int)insertStudentCommand.Parameters["retval"].Value;

(これは機能すると思いますが、今はテストできません)

于 2012-11-01T19:36:35.133 に答える