2017-04-14 13 views
0

ID、英語、ポーランド語のカラムを持つFlashcardという名前のベースがあります。 名前のうちの1つから名前を取得して文字列に保存したいとします。 これは私のコードデータベースからデータを取得できません。C#

 public string AskBaseForPolishName(string englishName) 
    { 
     string polishName; 
     SqlConnect.Open(); 
     SqlCommand cmd = new SqlCommand($"select * from Flashcard where English = {englishName}", SqlConnect); 
     SqlParameter param = new SqlParameter(); 
     SqlDataReader reader = cmd.ExecuteReader(); 
     while (reader.Read()) 
     { 
      polishName = reader["Polish"].ToString(); 
     } 

     reader.Close(); 
     SqlConnect.Close(); 
     return polishName; 
    } 

と「割り当てられていない変数polishNameの使用」という、Visual Studioは警告している「戻る」行です。ベースからデータを取得できません。 何が問題なのですか?それを修正する方法はありますか?

+2

あなたはSqlParameterを作成しているのはなぜ?あなたはそれを使用しません – Tushar

+0

本当に 'using'文を使うべきです、' ExecuteReader() 'の代わりに' ExecuteScalar() 'を見てください。 –

答えて

3

ここには3つの大きな問題があります。

SqlCommand cmd = new SqlCommand($"select * from Flashcard where English = '{englishName}'", SqlConnect); 

このはすべて自身であなたの問題を解決するためにに見えるかもしれませんが、物事はまだかなり悪いです:

まず、SQLステートメント内の文字列は次のように、単一引用符で囲む必要があります。あなた自身の中に一重引用符が含まれている英語の名前を持っているとどうなるでしょうか?この見積もりは、全体のクエリを慌てて投げ捨てるでしょう。さらに悪いことに、この問題は、ハッカーがデータベースで非常に悪いことをするために使用することができます。

これを行うには二つ目は、クエリパラメータを使用することです:

SqlCommand cmd = new SqlCommand("select * from Flashcard where English = @EnglishName", SqlConnect); 
cmd.Parameters.Add("@EnglishName", SqlDbType.NVarChar, 20).Value = englishName; 

これは誤配置や悪意のある単一引用符からあなたを守ります、とだけでなく、あなたがもはや囲む心配する必要があることに気づきます値。このようにして、他にも多くの利点があります。クエリパラメータは重要:です。それらを使用してください。

最後に、クエリによって例外がスローされた場合の状況について考えてみましょう。実行フローがあなたの方法からバブルアップし、.Close()コマンドは決して起こりません。これで十分ですが、データベースにサービス拒否状況を引き起こすように十分な接続を開いたままにすることが可能です... 誰もいませんそれを使用できます! usingブロックまたはtry/finallyブロックで保護してください。

その他の小さなものもありますが、それは本当に重要な3つです。このように一緒にそれをすべて入れ:

public string AskBaseForPolishName(string englishName) 
{ 
    //it's best NOT to re-use the same connection object. Only reuse the same connection string 
    using (var cn = new SqlConnection("connection string here")) 
    using (var cmd = new SqlCommand("select Polish from Flashcard where English = @EnglishName;", cn)) 
    { 
     cmd.Parameters.Add("@EnglishName", SqlDbType.NVarChar, 20).Value = englishName; 
     cn.Open(); 
     return cmd.ExecuteScalar().ToString(); 
    } 
} 
-1

使用このコードスニペットを

static void Read() 
{ 
try 
{ 
    string connectionString = 
     "server=.;" + 
     "initial catalog=employee;" + 
     "user id=sa;" + 
     "password=sa123"; 
    using (SqlConnection conn = 
     new SqlConnection(connectionString)) 
    { 
     conn.Open(); 
     using (SqlCommand cmd = 
      new SqlCommand("SELECT * FROM EmployeeDetails", conn)) 
     { 
      SqlDataReader reader = cmd.ExecuteReader(); 

      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        Console.WriteLine("Id = ", reader["Id"]); 
        Console.WriteLine("Name = ", reader["Name"]); 
        Console.WriteLine("Address = ", reader["Address"]); 
       } 
      } 

      reader.Close(); 
     } 
    } 
} 
catch (SqlException ex) 
{ 
    //Log exception 
    //Display Error message 
} 
} 
関連する問題