2013-05-14 6 views
7

Ho il seguente codice che corrisponde all'input dell'utente tramite le variabili di sessione. La stored procedure restituisce il conteggio delle righe se i dati nella variabile di sessione corrispondono ai dati nel database.Esecuzione di stored procedure e ritorno del conteggio delle righe al codice tramite i parametri di output e sql

Tutto funziona tranne che voglio restituire il conteggio righe che sarà sempre una singola riga: In breve, si visita un modulo, aggiungere informazioni e premere Invia. I dati vengono archiviati in sessione e la stored procedure restituisce i dati quando associati.

Anche se il programma funziona variabile intRecCount è sempre zero piuttosto che il conteggio delle righe.

stored procedure:

CREATE PROCEDURE [dbo].[uspConfirmation] 

    @RecordID CHAR(36), 
    @LName VARCHAR(30), 
    @FName VARCHAR(30), 
    @MInit CHAR(1), 
    @RecordCount INT OUTPUT 
AS 

SELECT * FROM Registration 
WHERE RecordID = @RecordID AND 
     LName = @LName AND 
     FName = @FName AND 
     MInit = @MInit 

SET @RecordCount = @@ROWCOUNT 

RETURN 

Metodo/Codice:

public static DataSet Confirmation() 
{ 
SqlCommand cmdSQL = new SqlCommand("uspConfirmation", Connection); 
cmdSQL.CommandType = CommandType.StoredProcedure; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordID", SqlDbType.VarChar, 36)); 
cmdSQL.Parameters["@RecordID"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@RecordID"].Value = RecordIDSession; 

cmdSQL.Parameters.Add(new SqlParameter("@LName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@LName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@LName"].Value = LNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@FName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@FName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@FName"].Value = FNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@MInit", SqlDbType.Char, 1)); 
cmdSQL.Parameters["@MInit"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@MInit"].Value = MNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordCount", SqlDbType.Int)); 
cmdSQL.Parameters["@RecordCount"].Direction = ParameterDirection.Output; 

... poi una variabile per tenere il conteggio delle righe tramite una variabile di uscita ..

Int32 intRecCount = Convert.ToInt32(cmdSQL.Parameters["@RecordCount"].Value); 

SqlDataAdapter da = new SqlDataAdapter(cmdSQL); 
DataSet ds = new DataSet(); 
da.Fill(ds); 

try { 
    Connection.Open(); 
    cmdSQL.ExecuteNonQuery(); 
} 
catch (Exception ex) { 
    dbMsg = ex.Message; 
} 
finally { 
    Connection.Close(); 
    cmdSQL.Dispose(); 
    cmdSQL.Parameters.Clear(); 
} 
return ds; 
} 
+1

+1 Buono, ben pensato domanda, con un sacco di dettagli . Bello. – Jonathan

+0

Grazie! Sono molto nuovo al C# ma lo amo così tanto e niente è più incoraggiante delle parole di persone come te. Grazie ancora! – Asynchronous

risposta

11

È necessario accedere al valore del parametro di uscita dopo aver eseguito la query non prima. Quindi spostare questa linea dopo l'esecuzione di query e prima della cancellazione dei parametri, come:

//VARIABLE TO HOLD ROW COUNT VIA OUTPUT VIARABLE 
Int32 intRecCount = Convert.ToInt32(cmdSQL.Parameters["@RecordCount"].Value); 

modo che il codice per il metodo potrebbe essere:

public static DataSet Confirmation() 
{ 
SqlCommand cmdSQL = new SqlCommand("uspConfirmation", Connection); 
cmdSQL.CommandType = CommandType.StoredProcedure; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordID", SqlDbType.VarChar, 36)); 
cmdSQL.Parameters["@RecordID"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@RecordID"].Value = RecordIDSession; 

cmdSQL.Parameters.Add(new SqlParameter("@LName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@LName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@LName"].Value = LNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@FName", SqlDbType.VarChar, 30)); 
cmdSQL.Parameters["@FName"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@FName"].Value = FNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@MInit", SqlDbType.Char, 1)); 
cmdSQL.Parameters["@MInit"].Direction = ParameterDirection.Input; 
cmdSQL.Parameters["@MInit"].Value = MNameSession; 

cmdSQL.Parameters.Add(new SqlParameter("@RecordCount", SqlDbType.Int)); 
cmdSQL.Parameters["@RecordCount"].Direction = ParameterDirection.Output; 



SqlDataAdapter da = new SqlDataAdapter(cmdSQL); 
DataSet ds = new DataSet(); 
da.Fill(ds); 
Int32 intRecCount = 0; 
try 
{ 
    Connection.Open(); 
    cmdSQL.ExecuteNonQuery(); 
    //VARIABLE TO HOLD ROW COUNT VIA OUTPUT VIARABLE 
    intRecCount = Convert.ToInt32(cmdSQL.Parameters["@RecordCount"].Value); 

} 
catch (Exception ex) 
{ 
    dbMsg = ex.Message; 
} 
finally 
{ 
    Connection.Close(); 
    cmdSQL.Dispose(); 
    cmdSQL.Parameters.Clear(); 
} 


return ds; 
} 
+3

Non dopo "cmdSQL.Parameters.Clear();". Devi dichiarare Int32 intRecCount prima del try catch e rendere il compito prima del clear. – Serge

+0

@Serge, sì grazie per indicarlo – Habib

+0

Grazie Habib e Serge grazie anche a voi. Apprezzo molto il tuo aiuto e la tua conoscenza. Tipo! – Asynchronous

Problemi correlati