2014-01-13 4 views
17

У меня есть следующий код, чтобы тянуть назад DataTable с помощью хранимой процедуры и ввода параметров строки @JobNumbers, которая динамически создаваемые строки чисел заданий (и, следовательно, длина неизвестна):Как создать NVarchar (max) Sqlparameter в 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); 
     } 

Как вы можете видеть, что в настоящее время я устанавливаю параметр JobNumber на длину 4000, что должно быть достаточно, чтобы принять около 500 номеров заданий и должно быть достаточно. Тем не менее, есть вероятность, что в этом случае может потребоваться больше. Итак, мне было интересно, есть ли способ установить параметр в эквивалентный тип параметра sql nvarchar (max)?

Я рассмотрел различные подобные вопросы (What's the best method to pass parameters to SQLCommand?), но никто не говорит, можете ли вы (или не можете) это сделать. Во-вторых, это даже необходимо сделать, если я установил параметр @JobNumber в хранимой процедуре на nvarchar (max), и поэтому, по-видимому, мне не нужно было бы устанавливать длину в C# вообще? Если я это сделаю, это будет иметь потенциальные проблемы с производительностью, как предложено в этом вопросе When should "SqlDbType" and "size" be used when adding SqlCommand Parameters??

+1

Посмотрите здесь : http://stackoverflow.com/questions/973260/what-size-do-you-use-for-varcharmax-in-your-parameter-declaration – Eugene

+0

Лучше использовать тип данных, который, естественно, поддерживает хранение нескольких отдельных данных вместо этой строки. Два типа, которые выпрыгивают в качестве поддержки, - это сами таблицы (в виде отдельных строк для каждого элемента) или XML. –

ответ

42

Это, как вы явно установить NVARCHAR (макс):

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

Если вы действительно обеспокоены производительности вы можете рассмотреть вопрос о переходе таблица целых чисел: https://stackoverflow.com/a/10779593/465509

+0

Разве вы не имеете в виду SqlDbType.NVarChar? – Eugene

+0

Ну, это зависит от того, какой тип данных вы хотите. Работают VarChar и NVarChar. Столбец nvarchar может хранить любые данные Unicode. Столбец varchar ограничен 8-разрядной кодовой страницей. Для получения дополнительной информации: http://stackoverflow.com/a/147302/465509 – Sam7

+0

Вы сказали себе в строке выше, что это был nvarchar (max), который был нужен, так почему вы тогда использовали 'SqlDbType.VarChar'? – robertc

Смежные вопросы