2017-04-14 87 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 
} 
}