簡體   English   中英

無法使用C#從數據庫檢索數據

[英]Can't retrieve data from database using c#

我的基礎名稱為Flashcard,其ID為ID,英語,波蘭語。 我想從其中之一中檢索名稱並將其保存到字符串。 這是我的代碼

        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”。 我無法從基礎檢索數據。 有什么問題以及如何解決?

這里有三大錯誤。

首先,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;

這將保護您免受錯誤放置或惡意的單引號的影響,並且還請注意,您不再需要擔心封裝該值。 這樣做還有許多其他好處。 查詢參數很重要 使用它們。

最后,考慮一下如果查詢拋出異常,將會發生什么情況。 執行流將冒出您的方法,並且.Close()命令將永遠不會發生。 做到這一點就足夠了,有可能使足夠多的連接保持打開狀態,從而在數據庫上造成拒絕服務的情況…… 沒有人可以使用它! 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();
    }
}

使用此代碼段

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM