2012-01-09 6 views
0

Я написал эту процедуру на сайте. он берет строку в качестве входного параметра (имя пользователя) и просматривает связанную таблицу, чтобы узнать ее запись и вернуть поле «ID» в качестве вывода процедуры. эта работа прекрасна, но есть одна (основная) проблема, когда она берет ввод на другом английском языке, она не может найти целевую запись и возвращает «-1» в качестве вывода. Посетители используют персидский язык, и я наблюдал его на своем SQL-сервере. Сортировка - «Persian_100_CI_AI», а мои строковые поля - «nvarchar». Что мне делать, чтобы решить эту проблему? я использую SQL-Server 2008.как решить эту проблему SQL и иностранного языка?

большое спасибо

protected int GetThisUserID(string uname) 
{ 
    string returnvalue = ""; 
    int returnintegervalue = -1; 
    SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["OldEagleConnectionString"].ToString()); 
    try 
    { 
     //SqlCommand command = new SqlCommand("SELECT [ID] FROM [Customers] WHERE ([Uname] = '" + User.Identity.Name.ToString() + "'", connection); 
     //SqlCommand command = new SqlCommand("SELECT * FROM [Customers] WHERE ([Uname] = '" + User.Identity.Name.ToString() + "')", connection); 
     SqlCommand command = new SqlCommand("SELECT * FROM [Customers] WHERE ([Uname] = '" + uname + "')", connection); 

     connection.Open(); 
     SqlDataReader reader = command.ExecuteReader(); 

     if (reader.HasRows) 
     { 
      while (reader.Read()) 
      { 
       returnvalue = reader["ID"].ToString(); 

       returnintegervalue = Int32.Parse(returnvalue); 
      } 
     } 
    } 
    catch (SqlException ex) 
    { 
     Response.Write(ex.Message.ToString()); 
     returnvalue = ex.Message.ToString(); 
    } 
    finally 
    { 
     connection.Close(); 
     SqlConnection.ClearPool(connection); 
    } 
    return returnintegervalue; 
} 
+2

эй также просто интересно в вашем коде, если вы только ожидаете, что ID будет возвращен .. тогда почему вы выбираете * из своей таблицы ..? вид дорогостоящего .. – MethodMan

+2

используйте параметры, чтобы избежать SQL-инъекции. – dotjoe

+0

Вам необходимо использовать UNICODE, как показано здесь: http://msdn.microsoft.com/en-us/library/ms180059.aspx –

ответ

0

Я ненавижу, чтобы ответить на мой собственный вопрос, но здесь это:

должны добавить N в выберите команду, просто например:

SqlCommand command = new SqlCommand("SELECT * FROM [Customers] WHERE ([Uname] = N'" + uname + "')", connection); 

проблема решена!

Без N строка принимается за varchar, а преобразование теряет символы за пределами, поддерживаемые кодировкой базы данных varchar.

+0

Добавлено объяснение, почему это имеет значение. Ваш код по-прежнему небезопасен, хотя, если кто-то решит утверждать, что его имя пользователя было 'haha ', удалить из [Customers]; выберите «haha», тогда у вас не останется клиентов. Действительно, вы должны использовать параметры, но если вы безумно стараетесь делать что-то тяжело, по крайней мере, переходите в 'uname.Replace (" '","' '")', так что вы правильно избежали строки, переданной в –

+0

[Хорошо ответить на ваши вопросы и принять их.] (Http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/) By путь, устанавливающий кодировку базы данных в Unicode вместо локализованной кодировки, всегда является хорошей идеей. – Hossein

+0

@JonHanna: Благодарю вас, вы абсолютно правы. –

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

  • Нет связанных вопросов^_^