У меня есть хранимая процедура, которая принимает переменную, содержащую данные не на английском языке. Я знаю, что мы можем использовать N
для этого. Но он не работает с переменными. Как я могу добиться этого?
Я хочу сделать что-то подобное, но это не работает. Ниже моя хранимая процедура.
Create Procedure tempUpdateCustomerSurvey
(
@FeedbackText nvarchar(1000)
)
As
Begin
Update tblCustomerSurvey
Set GeneralFeedbackText = @FeedbackText
Where CustomerSurveyID = 1000
End
Он хранит '??????' в таблице.
Если я выполню этот SP с данными, как показано ниже, он не сработает.
Declare @GeneralFeedbackText Nvarchar(1000) = 'नमस्कार'
Exec tempUpdateCustomerSurvey @GeneralFeedbackText
Знайте, что хранимая процедура принимает данные из кода C#. Ниже приведен основной метод C#, который вызывает хранимую процедуру.
public static Feedback InsertSurvey(int CustomerSurveyID, string GeneralFeedbackText)
{
try
{
int intDBReturnValue = Convert.ToInt32(SqlHelper.ExecuteScalar(SystemSettings.GetDBConnection(),
"tempUpdateCustomerSurvey",
CustomerSurveyID,
GeneralFeedbackText));
Feedback f = new Feedback(FeedbackService.DB_OP_SPECIFICATION.INSERT, intDBReturnValue, "Customer survey");
f.ProcessExceptionOrCustomErrorIfAvailable(-1, "System couldn't verify the survey information.");
return f;
}
catch (Exception ex)
{
return new Feedback(FeedbackService.DB_OP_SPECIFICATION.INSERT, ex, "Customer survey");
}
}
N
для строкового литерала, поэтому он преобразуется обратно в строка varchar не в формате Unicode - вот почему вы получаете эти вопросительные знаки в своей таблице.... работает так, как задумано - просто всегда используйте префиксN
при инициализации переменныхnvarchar
из строки литералы! - person marc_s   schedule 10.02.2020EXEC tempUpdateCustomerSurvey N'Yorvalue'
, а неEXEC tempUpdateCustomerSurvey 'Yorvalue'
- person Martin Smith   schedule 10.02.2020'??????'
, то вы передали'नमस्कार'
в свой параметр, а неN'नमस्कार'
. Это мы можем сделать безопасный вывод. Вам нужно исправить, как вы вызываете SP. - person Larnu   schedule 10.02.2020EXEC dbo.tempUpdateCustomerSurvey @FeedbackText = N'नमस्कार';
@KomalR . (Предположим, что схема по умолчанию —dbo
, поскольку SP был создан без объявленной схемы.) - person Larnu   schedule 10.02.2020@FeedbackText
использует параметр и имеет правильный тип данных. - person Martin Smith   schedule 10.02.2020can't reproduce
. Опубликуйте, как строка, которая передает неанглийский текст. Вот где проблема - person Panagiotis Kanavos   schedule 10.02.2020N
, вы используете ASCII. Если вы используете параметризованные запросы сnvarchar
параметрами, у вас не будет проблем - person Panagiotis Kanavos   schedule 10.02.2020@GeneralFeedbackText Nvarchar(1000) = 'नमस्कार'
вы забыли здесь префиксN
, поэтому строка обрабатывается как ASCII. Однако если вы используете параметризованные запросы в C#, вам вообще не придется об этом беспокоиться. - person Panagiotis Kanavos   schedule 10.02.2020SqlHelper
? Используете ли вы древние блоки приложений Microsoft? Если да, то похоже, что должен получить правильный тип данных параметра из кода здесь agilechai.com/source/SqlHelper-Source-Code-cs.html. Вы можете попробовать передать параметры вместо необработанных значений, чтобы убедиться, что используется правильный тип (и вызвать перегрузкуExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters)
- person Martin Smith   schedule 10.02.2020ExecuteNonQuery
в любом случае, поскольку хранимый процесс не возвращает скалярный результат. - person Martin Smith   schedule 10.02.2020