nVarchar и SqlParameter - PullRequest
       17

nVarchar и SqlParameter

2 голосов
/ 19 января 2011

Я разрабатываю приложение, которое должно поддерживать несколько языков. Для решения проблемы специальных символов я использую NVarhcar для своих текстовых полей. Так что мой SQL-запрос для текстового поля

insert into tbl_text(text)values(N'Chci tančit v oblasti')

Моя проблема - поместить его в SqlCommand, который "insert into tbl_text(text)values(N@text)". Конечно, он сохраняет "N@text" в таблице БД.

Ребята, вы знаете, как это сделать? Я использую C # и SQL 2008.

Извините, если мне было трудно понять мой вопрос. Мой английский плохой = /

Ответы [ 5 ]

4 голосов
/ 19 января 2011

Добавить (строка, объект) устарело по этой причине (из Пабло Кастро из команды SQL Server):

Проблема в том, что и C #, и компиляторы VB.NET будут выставлять очень странное поведение для этого кода:

command.Parameters.Add («@ p», 0);

Вы можете ожидать, что это будет использовать перегрузка, которая принимает объект и присвойте ему значение 0, но вместо этого он выберет перегрузку, которая занимает SqlDbType как второй параметр! В Чтобы избежать этого (и потенциально другие) неясность между Добавить (строка, sqldbtype) и Добавить (строка, объект), мы устарели Добавить (строка, объект) и представил AddWithValue (строка, объект). В Вообще, с несколькими перегрузками где отличительный параметр Тип «объект» в одном из них является опасная вещь.

2 голосов
/ 19 января 2011

Вы должны параметризовать ваши вставки с помощью SqlParameters , которые позволяют вам явно указывать тип данных.(Кроме того, это избавляет вас от головной боли при определении атаки на SQL-сервер, вызванной вашим запросом).

Пример:

SqlCommand cmd  = new SqlCommand("insert into tbl_text (text) values(@MYTEXT)", myConnection);
cmd.Parameters.Add(new SqlParameter("@MYTEXT", SqlDbType.NVarChar)).Value = "Chci tančit v";
cmd.ExecuteNonQuery();
1 голос
/ 19 января 2011

Не ставьте «N» перед именем параметра, оно используется только при использовании строковой константы, чтобы указать, что это строка в кодировке Юникод. Итак, ваш запрос должен быть:

insert into tbl_text(text) values (@text)
0 голосов
/ 14 октября 2016

Вот простой пример

String filePath = @"D:\" + FileName;
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = 
    @"DECLARE @TraceId INT = (SELECT MAX(id) FROM sys.traces WITH (NOLOCK))
    SET @TraceId=@TraceId+1

    DECLARE @File NVARCHAR(256);
    Set @File= (@filePath)

    SET @TraceId=@TraceId+1 --Var olandan bir fazla

    DECLARE @MaxFileSize BIGINT = 1 /* max size of file as MegaByte*/
    DECLARE @FileCount INT = 1024 /* max file count for write*/

    exec sp_trace_create @traceid = @TraceId OUTPUT,
                                    @options = 2,
                                    @tracefile = @File,
                                    @maxfilesize = @MaxFileSize, 
                                    @stoptime = NULL,
                                    @filecount = @FileCount

    SELECT @TraceId";

command.Parameters.Add(new SqlParameter("@filePath", SqlDbType.NVarChar)).Value = filePath;
0 голосов
/ 19 января 2011

Использовать SQLParameters .

Вот простой пример:

var cmd = _dbCon.CreateCommand();
cmd.CommandText =
    "insert into tbl_text (textfield) values(@textfield)";
cmd.Parameters.Add(new SQLParameter("@textfield", "Chci tančit v oblasti"));
cmd.ExecuteScalar();
...