2014-01-13 34 views
17

Ich habe den folgenden Code bekam einen Datatable mit einer gespeicherten Prozedur zurück zu ziehen und einen String-Parametern @JobNumbers Eingabe, die dynamisch Reihe von Auftragsnummern erstellt wird (und damit Länge ist nicht bekannt):Wie erstellt NVarchar (max) Sqlparameter in C#?

using (SqlConnection connection = new SqlConnection(con)) 
     { 
      SqlCommand cmd = new SqlCommand("dbo.Mystoredprocedure", connection); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add("@JobNumbers", SqlDbType.VarChar, 4000); 
      cmd.Parameters["@JobNumbers"].Value = JobNumber; 

      SqlDataAdapter da = new SqlDataAdapter(cmd); 

      connection.Open(); 
      da.Fill(JobDetails); 
     } 

Wie Sie können sehen, dass ich den JobNumber-Parameter derzeit auf eine Länge von 4000 eingestellt habe, was ausreichen sollte, um etwa 500 Job-Nummern zu übernehmen und sollte ausreichen. Es besteht jedoch die Möglichkeit, dass es bei ungewöhnlichen Gelegenheiten mehr benötigt. Also, ich frage mich, gibt es eine Möglichkeit, den Parameter auf den entsprechenden SQL-Parameter Typ von Nvarchar (max) zu setzen?

Ich habe mir verschiedene ähnliche Fragen angeschaut (What's the best method to pass parameters to SQLCommand?), aber keiner sagt genau, ob Sie das können (oder können). Zweitens, ist es sogar notwendig, dies zu tun, wenn ich den Parameter @JobNumber in der Stored Procedure auf nvarchar (max) setze und daher vermutlich nicht die Länge in C# überhaupt setzen müsste? Wenn ich dies tue, hat dies potenzielle Leistungsprobleme, wie in dieser Frage When should "SqlDbType" and "size" be used when adding SqlCommand Parameters? vorgeschlagen?

+1

hier Werfen Sie einen Blick : http://stackoverflow.com/questions/973260/what-size-do-you-use-for-varcharmax-in-your-parameter-declaration – Eugene

+0

Es wäre besser, einen Datentyp zu verwenden, der natürlich das Speichern mehrerer separater Daten unterstützt Elemente, anstatt diese Zeichenfolge. Die beiden Typen, die diese Unterstützung unterstützen, sind Tabellen selbst (in Form von separaten Zeilen für jedes Element) oder XML. –

Antwort

42

Dies ist, wie Sie nvarchar (max) explizit festgelegt:

cmd.Parameters.Add("@JobNumbers", SqlDbType.NVarChar, -1); 

Wenn Sie wirklich mit Leistung besorgt sind Sie vorbei eine Tabelle von ganzen Zahlen vielleicht zu prüfen: https://stackoverflow.com/a/10779593/465509

+0

meinst du nicht SqlDbType.NVarChar? – Eugene

+0

Nun, es hängt davon ab, welchen Datentyp Sie wollen. VarChar & NVarChar funktionieren beide. Eine nvarchar-Spalte kann alle Unicode-Daten speichern. Eine varchar-Spalte ist auf eine 8-Bit-Codepage beschränkt. Für mehr: http://stackoverflow.com/a/147302/465509 – Sam7

+0

Sie sagten sich in der Zeile über, dass es nvarchar (max) war, die gesucht wurde, also warum haben Sie dann 'SqlDbType.VarChar' verwendet? – robertc