“从数据库获取的ID请求”

huangapple go评论82阅读模式
英文:

Id request from the database

问题

I'm trying to write the id request from the database. This is how I wrote it:

public int QueryId(String query)
{
    var temp = this.connection;
    MySqlCommand verifica = new MySqlCommand(query, connection);
    var queryResult = verifica.ExecuteScalar();
    return Convert.ToInt32(verifica.ExecuteScalar());
} 

This is how I make use of the function:

MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
    nomeCorrente = reader.GetString("nome");
    cognomeCorrente = reader.GetString("cognome");
    idCorrente = db.QueryId("SELECT id FROM thewishlist.user WHERE email='" + user.Text + "'");
}

reader.Close();
db.CloseConnection();

It does not generate errors, but when I run the project and log out the user gives me the following error:

MySql.Data.MySqlClient.MySqlException There is already an open DataReader associated with this Connection which must be closed first.

英文:

I'm trying to write the id request from the database. This is how I wrote it:

public int QueryId(String query)
{
    var temp = this.connection;
    MySqlCommand verifica = new MySqlCommand(query, connection);
    var queryResult = verifica.ExecuteScalar();
    return Convert.ToInt32(verifica.ExecuteScalar());
} 

This is how I make use of the function:

        MySqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            nomeCorrente = reader.GetString("nome");
            cognomeCorrente = reader.GetString("cognome");
            idCorrente = db.QueryId("SELECT id FROM thewishlist.user WHERE email='" + user.Text + "'");
        }

        reader.Close();
        db.CloseConnection();

It does not generate errors, but when I run the project and log out the user gives me the following error:

> MySql.Data.MySqlClient.MySqlException There is already an open DataReader associated with this Connection which must be closed first.

答案1

得分: 2

错误非常明显。我建议您使用 using 语句,并且由于您只返回一列,可以使用 ExecuteScalar 而不是 ExecuteReader。因此,您的代码将如下所示:

var id = 0;
var query = "SELECT ID FROM thewishlist.user WHERE email = @email";
using (var con = new SqlConnection(this.connection))
{
    using (var cmd = new SqlCommand(query, con))
    {
        con.Open();
        cmd.Parameters.Add("@email", SqlDbType.NVarChar).Value = user.Text;

        id = (int)cmd.ExecuteScalar();
    }
}//连接将在此处自动关闭,对象将被处理

return id;

另外,为了防止 SQL 注入,您应该始终使用参数化的 SQL 查询。

英文:

The error is pretty clear. I suggest you make use of using statement and also since you're only returning one column you and use ExcecuteScalar instead of ExecuteReader. So your code will look something like:

var id = 0;
var query = "SELECT ID FROM thewishlist.user WHERE email = @email";
using (var con = new SqlConnection(this.connection))
{
   using (var cmd = new SqlCommand(query, con))
   {
       con.Open();
       cmd.Parameters.Add("@email", SqlDbType.NVarChar).Value = user.Text;

       id = (int)cmd.ExecuteScalar();
    }
}//connection will auto close here and object will get disposed

return id;

Also to prevent sql injection you should always use paramertised sql queries.

答案2

得分: 0

如Jason所说,你应该首先关闭阅读器,然后调用db.QueryId来执行新的查询,我修改了你的代码如下:

using (MySqlDataReader reader = cmd.ExecuteReader())
{               
    while (reader.Read())
    {
        nomeCorrente = reader.GetString("nome");
        cognomeCorrente = reader.GetString("cognome");                 
    }
    reader.Close();              
}
idCorrente = db.QueryId("SELECT id FROM thewishlist.user WHERE email='" + user.Text + "'");
db.CloseConnection();
英文:

As Jason said that, you should close the reader firstly, then call db.QueryId to execute the new query, I modifed your code as follows:

 using (MySqlDataReader reader = cmd.ExecuteReader())
        {               
            while (reader.Read())
            {
                nomeCorrente = reader.GetString("nome");
                cognomeCorrente = reader.GetString("cognome");                 
            }
            reader.Close();              
        }
        idCorrente = db.QueryId("SELECT id FROM thewishlist.user WHERE email='" + user.Text + "'");
        db.CloseConnection();

huangapple
  • 本文由 发表于 2020年1月4日 00:27:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/59582006.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定