2012-01-09 20 views
0

私はこの手順をサイトに書きました。文字列を入力パラメータ(ユーザー名)として取得し、関連するテーブルを参照してレコードを探し、プロシージャの出力として「ID」フィールドを返します。 これはうまくいきますが、他の英語の入力を受けた場合、ターゲットレコードを見つけられず、 "-1"を出力として返すという(大きな)問題があります。 訪問者はペルシア語を使用しており、私はSQL Serverでそれを観察しました。照合は "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

を使用しています:

は、selectコマンドで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/)つまり、データベースのエンコーディングをローカライズされたエンコードの代わりにUnicodeに設定することは、常に良い考えです。 – Hossein

+0

@ジョンハンナ:ありがとう、あなたは絶対に正しい。 –

関連する問題