2016-05-14 5 views
0

У меня есть две таблицы. Мне нужно получить calorificValue из таблицы продуктов и daily_gained из таблицы calorie_tracker, чтобы затем произвести некоторые вычисления. Я написал этот код, я знаю, что он не эффективен , Он извлекает daily_gained, но не получает calorificValue.как два получить данные из 2 разных таблиц C#

MySqlCommand cmd = new MySqlCommand("SELECT name,calorificValue FROM myfitsecret.food where [email protected]", cnn); 
MySqlCommand cmd2 = new MySqlCommand("SELECT sportsman_id,daily_gained FROM myfitsecret.calorie_tracker where [email protected]_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 [email protected]_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(); 
+0

Когда вы говорите «не удалось», вы получаете исключение? – abrown

+0

@abrown rd2.HasRows возвращает False. Так что я не могу достичь калорийности с стола. – ekn

+0

Я знаю, что это кажется очевидным, уверены ли вы, что у вас есть данные в базе данных для этого конкретного пользователя? Можете ли вы проверить, что параметр @name не установлен на значение по умолчанию пустой строки? – abrown

ответ

2

Почему вы не используете скалярную функцию SUM и не позволяете базе данных выполнять свою работу вместо написания большого количества кода?

int burned = 0; 
string s = comboBox1.SelectedItem.ToString(); 
cnn.Open(); 
string cmdText = @"SELECT SUM(calorificValue) 
        FROM myfitsecret.food 
        WHERE [email protected]"; 
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 [email protected]_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); 
} 

Не видно из кода, но и соединение должно быть создано внутри с помощью оператора (очень важно с MySql, что является очень ограничительным с одновременно открытых соединений)

Мы могли бы также использовать другой подход ввода две команды вместе и разделяя их точкой с запятой. Это называется пакетными командами, и оба они выполняются только с одной поездкой в ​​базу данных. Конечно, мы должны Откат с помощью MySqlDataReader, чтобы получить два результата, при переходе от первого ко второму, используя метод NextResult() (see here MSDN for Sql Server)

string cmdText = @"SELECT SUM(calorificValue) 
        FROM myfitsecret.food 
        WHERE [email protected]; 
        SELECT SUM(daily_gained) 
        FROM myfitsecret.calorie_tracker 
        WHERE [email protected]_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]); 
    } 
} 
+0

он дает ошибку .MySqlDbType не содержит определения для Int. @ Steve – ekn

+0

О да, это MySqlDbType.Int32 в MySql .... исправлено – Steve

+0

@ Steve Опять же, он не находит калорийности из таблицы :(name type is string Я изменил Varchar на строку, это не сработало – ekn

0

Ваши вопросы могут быть вокруг закрытия соединения, а затем пытается чтобы открыть его снова. В любом случае это довольно неэффективно для закрытия и открытия соединений.

MySqlCommand cmd = new MySqlCommand("SELECT name,calorificValue FROM myfitsecret.food where [email protected]", cnn); 
string s = (comboBox1.SelectedItem).ToString(); 
cmd.Parameters.AddWithValue("@name",s); 


MySqlCommand cmd2 = new MySqlCommand("SELECT SUM(daily_gained) FROM myfitsecret.calorie_tracker where [email protected]_id", cnn); 
cmd2.Parameters.AddWithValue("@sportsman_id", Login.userID); 
cnn.Open(); 

MySqlDataReader rd = cmd.ExecuteReader(); 

if (rd.HasRows) // if entered username and password have data 
{ 
    while (rd.Read()) // while the reader can read 
    { 
     burned += int.Parse(rd["calorificValue"].ToString()); 
    } 
} 

burned = cmd2.ExecuteScalar(); 
MessageBox.Show(burned+""); 
cnn.Close(); 

 Смежные вопросы

  • Нет связанных вопросов^_^