我试图检查数据库表中是否有任何行具有用户名和朋友用户名。如果有的话我必须在字符串中取友谊状态并返回该字符串 这是代码:
string query = "Select * from tblfriend where username = '" + username + "'and friend = '" + friendname + "'";
SqlCommand cmd = new SqlCommand(query, con);
SqlDataReader reader = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
rows = dt.Rows.Count;
if (rows > 0)
{
friendship = reader["friendshipstatus"].ToString();
}
但是它给出了一条错误信息:
无效调用在读取器关闭时调用MetaData。 你们可以提一下吗?
答案 0 :(得分:0)
由于您从同一个阅读器加载DataTable,因此可能会在加载完成后关闭。
作为Side节点,您最好使用参数,使用语句等,如下所示
string queryString = "Select [friendshipstatus] from [tblfriend] where [username] = @username and [friend] = @friend";
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(queryString, connection))
{
command.Parameters.AddWithValue("@username", username);
command.Parameters.AddWithValue("@friend", friendname );
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
if(reader.Read()) // you have matching record if this condition true
{
friendship = reader.GetString(0); // get the value of friendshipstatus
}
}
}
答案 1 :(得分:0)
您正在使用阅读器填充数据表,然后当它已用于此时 - 尝试再次使用它。
有更好的方法可以从db中检索单个值(查找ExecuteScalar),但要使当前代码可以替换最后一行
friendship = dt.rows[0].["friendshipstatus"].ToString()
这将从您填充的数据表中获取数据而不是封闭的阅读器。
答案 2 :(得分:0)
如果要将数据读入表
,则应使用dataadapterDataTable dt = new DataTable();
// Create new DataAdapter
using (SqlDataAdapter a = new SqlDataAdapter(query, con))
{
// Use DataAdapter to fill DataTable
a.Fill(dt);
// read data here
}
rows = dt.Rows.Count;
if (rows > 0)
{
friendship = dt.Rows[0]["friendshipstatus"].ToString();
}