c# - 两个如何从两个不同的表c#获取数据

标签 c# mysql mysqldatareader

我有两个表。我需要从食物表中获取 calorificValue 并从 calorie_tracker 表中获取 daily_gained ,然后进行一些计算。我已经编写了这段代码,我知道它效率不高。它检索 daily_gained 但未能获取 calorificValue。

MySqlCommand cmd = new MySqlCommand("SELECT name,calorificValue FROM myfitsecret.food where name=@name", cnn);
MySqlCommand cmd2 = new MySqlCommand("SELECT sportsman_id,daily_gained FROM myfitsecret.calorie_tracker where sportsman_id=@sportsman_id", cnn);
cmd2.Parameters.AddWithValue("@sportsman_id", Login.userID);

string s = (comboBox1.SelectedItem).ToString();
cmd.Parameters.AddWithValue("@name",s);
cmd2.Connection.Open();
MySqlDataReader rd = cmd2.ExecuteReader(CommandBehavior.CloseConnection);
int burned = 0;
if (rd.HasRows) // if entered username and password have the data
{
    while (rd.Read()) // while the reader can read 
    {
        if (rd["sportsman_id"].ToString() == Login.userID) // True for admin
        {
            burned += int.Parse(rd["daily_gained"].ToString());
        }
    }
}
cmd2.Connection.Close();
cmd.Connection.Open();

MySqlDataReader rd2 = cmd.ExecuteReader(CommandBehavior.CloseConnection);

if (rd2.HasRows) // if entered username and password have data
{
    while (rd2.Read()) // while the reader can read 
    {
        if (rd2["name"].ToString() == s)
        {
            burned += int.Parse(rd2["calorificValue"].ToString());
        }
    }
}
MessageBox.Show(burned+"");
DataTable tablo = new DataTable();
string showTable = "SELECT * from myfitsecret.calorie_tracker where sportsman_id=@sportsman_id";
MySqlDataAdapter adapter = new MySqlDataAdapter();
MySqlCommand showCommand = new MySqlCommand();
showCommand.Connection = cnn;
showCommand.CommandText = showTable;
showCommand.CommandType = CommandType.Text;
showCommand.Parameters.AddWithValue("@sportsman_id", Login.userID);
adapter.SelectCommand = showCommand;
adapter.Fill(tablo);

dataGridView1.DataSource = tablo;
cnn.Close();

最佳答案

为什么不直接使用标量函数 SUM 并让数据库完成其工作,而不是编写大量代码?

int burned = 0;
string s = comboBox1.SelectedItem.ToString();
cnn.Open();
string cmdText = @"SELECT SUM(calorificValue) 
                   FROM myfitsecret.food 
                   WHERE name=@name";
using(MySqlCommand cmd = new MySqlCommand(cmdText, cnn))
{
    cmd.Parameters.Add("@name", MySqlDbType.VarChar).Value = s;
    object result = cmd.ExecuteScalar();
    burned += (result != null ? Convert.ToInt32(result) : 0);
}
cmdText = @"SELECT SUM(daily_gained) 
            FROM myfitsecret.calorie_tracker 
            WHERE sportsman_id=@sportsman_id";
using(MySqlCommand cmd = new MySqlCommand(cmdText, cnn))
{
    cmd.Parameters.Add("@sportsman_id", MySqlDbType.Int32).Value = Login.userID;
    object result = cmd.ExecuteScalar();
    burned += (result != null ? Convert.ToInt32(result) : 0);
}

从代码中不可见,但连接也应该在 using 语句内创建(对于 MySql 非常重要,它对同时打开的连接非常严格)

我们还可以使用不同的方法将两个命令放在一起并用分号分隔。这称为批处理命令,它们都只需访问数据库一次即可执行。当然,我们需要使用 MySqlDataReader 进行回退,以使用 NextResult() 方法 ( see here MSDN for Sql Server ) 获取从第一个结果传递到第二个结果的两个结果

string cmdText = @"SELECT SUM(calorificValue) 
                   FROM myfitsecret.food 
                   WHERE name=@name;
                   SELECT SUM(daily_gained) 
                   FROM myfitsecret.calorie_tracker 
                   WHERE sportsman_id=@sportsman_id";
using(MySqlCommand cmd = new MySqlCommand(cmdText, cnn))
{
    // Add both parameters to the same command
    cmd.Parameters.Add("@name", MySqlDbType.VarChar).Value = s;
    cmd.Parameters.Add("@sportsman_id", MySqlDbType.Int32).Value = Login.userID;
    cnn.Open();
    using(MySqlDataReader reader = cmd.ExecuteReader())
    {
        // get sum from the first result
        if(reader.Read()) burned += Convert.ToInt32(reader[0]);

        // if there is a second resultset, go there
        if(reader.NextResult())
           if(reader.Read())
              burned += Convert.ToInt32(reader[0]);
    }
}

关于c# - 两个如何从两个不同的表c#获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37232058/

相关文章:

mysql - SQL 条件聚合函数

c# - 在 HttpWebRequest 中提交请求后无法执行此操作

c# - 自定义错误页面在实时服务器上不起作用

php - session 变量与 Mysql 表

c# - 嵌套数据读取器问题 mysql c#

c# - 从 JSON 填充多个对象

c# - 使用 phantomjs 的 Windows 身份验证

c# - UWP - 调试器附加到 .exe 但未配置

MySQL GROUP BY 数据并将分组数据分成列