我的基地名为Flashcard,列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;
}
并在第34行返回" Visual Studio警告,"使用未分配的变量polishName"。我无法从基地检索数据。 什么错了,怎么解决?
答案 0 :(得分: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;
这将保护您免受错误放置或恶意单引号的影响,并注意您不再需要担心附上该值。这样做还有许多其他好处。查询参数重要。使用它们。
最后,考虑一下如果查询引发异常会发生什么。执行流程将从您的方法中冒出来,.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();
}
}
答案 1 :(得分:-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
}
}