2013-02-06 7 views
7

mia stored procedure è:Come ottenere il valore del parametro di output da ExecuteNonQuery nella libreria aziendale (C#)?

create Procedure spSetUser 
(
    @Name NVarchar(50), 
    @OrganicTitle NVarchar(30), 
    @UserName NVarchar(20), 
    @Password NVarchar(16), 
    @Result Int Output 
) 
As 
Begin 
    Set @Result = -1  
    If Not Exists(Select UserId From dbo.Users Where [email protected]) 
    Begin 
     Insert Into dbo.Users (Name,OrganicTitle,UserName,[Password]) 
     Values(@Name,@OrganicTitle,@UserName,@Password) 
     Set @Result = SCOPE_IDENTITY() 
    End 
    Return 
End 
Go 

e la mia classe è (in libreria Microsft impresa):

[DataObjectMethod(DataObjectMethodType.Insert)] 
public Int32 SetUser(UserFieldSet Data) 
{ 
    Int32 Result = 0; 
    object[] values = new object[] { Data.Name, Data.OrganicTitle, Data.UserName, Data.Password, Data.UserId }; 
    Result = Db.ExecuteNonQuery("spSetUser", values); 
    return Result; 
} 

Risultato è roweffected di eseguire stored procedure, ma voglio ottenere il valore di @result (uscita parametro della procedura), come posso ottenerlo?

UserFieldClass è:

public class UserFieldSet 
{ 
    public Int32 UserId; 
    public String Name; 
    public String OrganicTitle; 
    public String UserName; 
    public String Password; 
} 

Suggerimento: So che deve utilizzare questo codice per ottenere @result:

public Int32 SetUser(UserFieldSet Data) 
{   
    Int32 Result = 0; 
    DbCommand DbCmd = Db.GetStoredProcCommand("spSetUser"); 
    Db.AddInParameter(DbCmd, "@Name", DbType.String, Data.Name); 
    Db.AddInParameter(DbCmd, "@OrganicTitle", DbType.String, Data.OrganicTitle); 
    Db.AddInParameter(DbCmd, "@UserName", DbType.String, Data.UserName); 
    Db.AddInParameter(DbCmd, "@Password", DbType.String, Data.Password); 
    Db.AddOutParameter(DbCmd, "@Result", DbType.Int32, Int32.MaxValue); 
    Db.ExecuteNonQuery(DbCmd); 
    Result = (Int32)Db.GetParameterValue(DbCmd, "@Result"); 
    return Result; 
} 

Ma posso ottenere con questo methd:

Result = Db.ExecuteNonQuery("spSetUser", values); 
+0

Hai provato a guardare i "valori [4]' dopo la chiamata? viene aggiornato? sebbene: potrebbe essere che quando si utilizza quella firma, tutti i parametri vengano aggiunti solo come input. –

risposta

3

Hai provato a utilizzare ExecuteScalar invece?

+0

ExecuteScalar potrebbe essere utile se si sta cercando un singolo valore 'select'; Non mi aspetto che cambi il parametro 'out' che gestisce qualsiasi –

+1

Si prega di aggiornare il mio codice, voglio inserire i dati nella mia tabella e ottenere il valore di userid. Come posso? –

+0

Hai funzionato? Sto facendo la stessa cosa che sei e anche cambiato per usare execute scalar, ma il parametro out è vuoto. Se lo fai funzionare, ti prego di condividere quello che hai fatto. Grazie! – ptn77

1

Come ho letto la domanda, si dispone di due implementazioni di SetUser; uno che configura i parametri manualmente usando AddInParameter e AddOutParameter e uno che passa semplicemente un array. Se comprendo correttamente la domanda, il primo approccio funziona e il secondo no. E vuoi sapere come farlo funzionare con il secondo approccio meno dettagliato.

Il mio consiglio: no. Il codice dettagliato funziona con e altro: funziona per i giusti motivi, in particolare, utilizza pass-by-name, piuttosto che pass-by-index, che dovrebbe sempre essere preferito.

La mia più grande domanda, tuttavia, sarebbe: perché la libreria aziendale? - che aggiunge molto poco rispetto al raw ADO.NET. Se avessi voluto convenienza, probabilmente sarei guardando "Dapper", ma anche con questo out parametri sono un po 'un faff:

var args = new DynamicParameters(
    new { Data.Name, Data.OrganicTitle, Data.UserName, Data.Password}); 
// note: ^^ are actually specifying implicit names 
args.Add("Result", direction: ParameterDirection.Output); 

connection.Execute("spSetUser", args, commandType: CommandType.StoredProcedure); 
return args.Get<int>("Result"); 

Normalmente è un po' più facile di quello; ad esempio:

connection.Execute("spFoo", new { id = -1, name }, 
     commandType: CommandType.StoredProcedure); 
Problemi correlati