2010-09-21 10 views
52

Sto cercando di ottenere il valore di output da DB tramite ADO.net. C'è un codice client:Ado.net - la proprietà Size ha una dimensione non valida di 0

using (var connection = new SqlConnection(ConnectionString)) 
    { 
     connection.Open(); 
     SqlCommand command = new SqlCommand("pDoSomethingParamsRes", connection); 
     command.CommandType = CommandType.StoredProcedure; 
     command.Parameters.Add("@i", 1); 
     var outParam = new SqlParameter("@out", SqlDbType.VarChar); 
     outParam.Direction = ParameterDirection.Output; 
     command.Parameters.Add(outParam); 
     command.ExecuteNonQuery(); 
     Console.WriteLine(command.Parameters["@out"].Value.ToString()); 
    } 

Quando ho eseguito questo ottengo la seguente eccezione:

the Size property has an invalid size of 0 

Secondo il manuale SqlParameter.Size Property potrei omettere dimensioni. Perché ottengo questa eccezione? Come farlo funzionare senza passare le dimensioni?
Grazie per il vostro aiuto!

+0

perché si vuole evitare di impostare la proprietà Size ... –

risposta

55

VarChar e NVarChar sono campi di caratteri a larghezza variabile (quindi var + char). Devi impostare la lunghezza, altrimenti il ​​valore predefinito è zero.

+0

Cosa succede se fornisco la dimensione = 1000 per int? Otterrò un'eccezione? – StuffHappens

+0

@StuffHappens: varchar e NVarchar si adattano sempre alla lunghezza dei dati indipendentemente dalla dimensione.Quindi puoi impostare qualsiasi dimensione (MAX 4000 per Nvarchar e 8000 per varchar). Non farà male. –

+2

Giusto per aggiungere che se assegni un valore al parametro, la dimensione di quel valore sarà usata come predefinita invece di 0 (ad esempio puoi omettere la dimensione). – AdaTheDev

39

La dimensione del parametro è richiesta per i parametri di uscita di dimensione variabile. Generalmente ADO.NET decide la dimensione del parametro in base al valore assegnato al parametro (quindi è facoltativo), ma nel parametro di uscita poiché non è impostato alcun valore, è necessario fornire la dimensione richiesta per il parametro

Impostare il parametro dimensione del parametro alla dimensione della variabile di uscita dal DB ... Say 50

outParam.Size = 50; 
+0

aiuta. Ma non voglio passare nessuna taglia (ne ho determinate ragioni). – StuffHappens

+0

Se si desidera evitare le dimensioni, tutto ciò a cui riesco a pensare è ottenere il risultato come DataTable/DataSet. Ma questo richiede di cambiare l'SP. –

+0

Ma Doge. Upvote per un buon esempio di codice. – Ant

1

non sono sicuro se questo è lo stesso problema che ho avuto prima, ma utilizzando un byte per un parametro a volte può portare a questo errore.

Prova questo. Dichiarare esplicitamente il parametro i come variabile. THEN assegna il suo valore con la proprietà Value.

9

Controllare MSDN: SqlParameter.Size Property

Per i parametri bidirezionali e di uscita, e di ritorno dei valori, è necessario impostare il valore di Size. Questo non è richiesto per i parametri di input e, se non impostato esplicitamente, il valore viene dedotto dalla dimensione effettiva del parametro specificato quando viene eseguita un'istruzione parametrizzata.

13

Per inciso, l'impostazione della proprietà size di un parametro di output è necessaria anche se non è un parametro di tipo stringa. Ad esempio, se si utilizza System.Data.SqlDbType.Int, è necessario impostare la dimensione su 4.

+2

+100 punti per essere l'unico a sottolineare che anche i parametri di output di tipo non stringa hanno bisogno di una dimensione specificata. Se si utilizza il costruttore SqlParameter (nome, valore) con un valore nominale int nullo, il sistema dedurrà una dimensione di 0 e non un 4 (come mi aspettavo). – Arkaine55

+1

Bingo. Questo era il mio problema. Per me, tuttavia, l'impostazione di SqlDbType era sufficiente. La mia ipotesi è che la libreria Sql inferisca le dimensioni del tipo in quel caso. – Visser

0

Inoltre, è possibile ottenere la dimensione effettiva dei parametri controllando lo sproc con questo piccolo comando:

SqlCommandBuilder.DeriveParameters(yourCommand) 

e quindi basta percorrere la raccolta dei parametri.

2

La risposta di tutti era chiara come il fango per me. Forse questo aiuterà qualcuno ora che ho trovato che cosa ha funzionato.

necessità di aggiungere dimensione al parametro

 DynamicParameters Params = new DynamicParameters(); 
     Params.Add("@ProfileID", ProfileID); 
     Params.Add("@CategoryName", CategoryName); 
     Params.Add("@Added", dbType: DbType.String, direction: ParameterDirection.Output,size:10); 

     db.Execute(sql, Params, commandType: CommandType.StoredProcedure, commandTimeout: 60); 

     var Added = Params.Get<string>("@Added"); 
Problemi correlati