2017-04-14 83 views
0

我的基地名爲Flashcard,列ID,英語,波蘭語。 我想從其中一箇中檢索名稱並將其保存爲字符串。 這是我的代碼無法使用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; 
    } 

和線「返回」 Visual Studio的警告,即「使用未賦值的變量polishName的」。我無法從基地檢索數據。 什麼是錯的,以及如何解決它?

+2

你爲什麼要創建的SqlParameter?你還沒有使用它 – Tushar

+0

你真的應該使用'using'語句,也可以使用'ExecuteScalar()'而不是使用'ExecuteReader()' –

回答

3

這裏有三大錯誤。

首先,SQL語句中的字符串必須用單引號,像這樣:

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

這可能似乎全部由自己來解決你的問題,但事情仍然很糟糕。想想如果你有一個英文名字本身包含一個單引號字符會發生什麼?該引用會使整個查詢出現重擊。更糟的是,這個問題可以被黑客用來在你的數據庫中做非常糟糕的事情。

所以,我們要做的第二件事是使用查詢參數:

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

這將保護你從錯誤放置或惡意的單引號,注意以及您不再需要擔心封閉值。這樣做還有其他許多好處。查詢參數是重要。使用它們。

最後,想想如果查詢引發異常會發生什麼。執行流程會從你的方法中冒出來,並且命令永遠不會發生。做到這一點就足夠了,並且可以將足夠的連接掛起來,以便在數據庫上創建拒絕服務情況... 沒有人可以使用它!通過using塊或try/finally塊來防止這種情況發生。

還有一些其他的小事情,但這些是真正重要的三件事。把它放在一起這樣的:

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 
} 
}