C# Mysql несколько запросов
Я пытаюсь создать маленький инструмент статуса. Мне нужно получить результаты нескольких запросов (около 4-5). Общая настройка соединения и "как читать данные" уже сделаны, но я не могу понять, как выполняется другой запрос.
Все, что я нашел при поиске, это для SqlClient. Я полностью перегружен этим.
Вот мой код (будьте терпеливы, я новичок в этом):
private void button1_Click(object sender, EventArgs e)
{
if(listView1.Items.Count > 1)
{
listView1.Items.Clear();
}
var listMember = new List<string>{};
var listOnline = new List<string>{};
// SQL PART //
string connString = "Server=10*****;Port=3306;Database=e***;Uid=e***;password=********************;";
MySqlConnection conn = new MySqlConnection(connString);
MySqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT fullname,online FROM member WHERE active = '1' ORDER BY online DESC";
try
{
conn.Open();
}
catch (Exception ex)
{
listView1.Items.Add("Error: " + ex);
}
MySqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
listMember.Add(reader["fullname"].ToString());
listOnline.Add(reader["online"].ToString());
}
conn.Close();
// SQL ENDING //
// SET ENTRIES TO LISTVIEW //
int counter = 0;
foreach(string member in listMember)
{
ListViewItem item = new ListViewItem(new[] { member, listOnline.ElementAt(counter) });
item.ForeColor = Color.Green;
listView1.Items.Add(item);
counter++;
}
}
Я не совсем уверен, как будет выглядеть дизайн / макет в конце, поэтому я хотел бы просто добавить результаты в списки в sql-части для последующей обработки данных из списков.
Действительно ли мне нужно настроить полностью новое соединение после conn.Close()? Или есть другой способ? Я могу только представить: 5 запросов с их собственным соединением,try,catch и 2 циклами... это будет около 100-200 строк только для получения результатов из 5 запросов. Разве это не слишком много для такой легкой вещи?
Надеюсь на помощь. Привет.
Согласно новым комментариям мой последний код:
Верхний:
public partial class Form1 : Form
{
public static string connString = "Server=10****;Port=3306;Database=e****;Uid=e****;password=****;";
public Form1()
{
InitializeComponent();
MySqlConnection conn = new MySqlConnection(connString); // Error gone!
}
Часть тела:
public void QueryTwoFields(string s, List<string> S1, List<string> S2)
{
try
{
MySqlCommand cmd = conn.CreateCommand(); // ERROR: conn does not exist in the current context.
cmd.CommandType = CommandType.Text;
string command = s;
cmd.CommandText = command;
MySqlDataReader sqlreader = cmd.ExecuteReader();
while (sqlreader.Read())
{
S1.Add(sqlreader[0].ToString());
S2.Add(sqlreader[1].ToString());
}
sqlreader.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void button1_Click(object sender, EventArgs e)
{
if(listView1.Items.Count > 1)
{
listView1.Items.Clear();
}
var listMember = new List<string>{};
var listOnline = new List<string>{};
using (conn) // ERROR: conn does not exist in the current context.
{
conn.Open();
///...1st Query
QueryTwoFields("SELECT fullname,online FROM member WHERE active = '1' ORDER BY online DESC",listMember,listOnline);
//...2nd query
//QueryTwoFields("your new Select Statement", otherList, otherList);
}
}
2 ответа
Вам не нужно закрывать соединение каждый раз, когда вы выполняете один запрос раньше, чем закрывать sqlreader, назначенный этому соединению. Наконец, когда все ваши запросы были выполнены, вы закрываете соединение. Рассмотрим также использование использования:
Вы также можете определить метод для выполнения вашего запроса, чтобы ваш код не был повторяющимся:
public void QueryTwoFields(string s, List<string> S1, List<string> S2)
///Select into List S1 and List S2 from Database (2 fields)
{
try
{
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.Text;
string command = s;
cmd.CommandText = command;
MySqlDataReader sqlreader = cmd.ExecuteReader();
while (sqlreader.Read())
{
S1.Add(sqlreader[0].ToString());
S2.Add(sqlreader[1].ToString());
}
sqlreader.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void button1_Click(object sender, EventArgs e)
{
if(listView1.Items.Count > 1)
{
listView1.Items.Clear();
}
var listMember = new List<string>{};
var listOnline = new List<string>{};
// SQL PART //
using (conn)
{
conn.Open();
///...1st Query
QueryTwoFields("SELECT fullname,online FROM member WHERE active = '1' ORDER BY online DESC",listmember,listonline)
//...2nd query
QueryTwoFields("your new Select Statement",myOtherList1,myOtherlist2)
....
}
}
РЕДАКТИРОВАТЬ: Имейте в виду, что вы не можете определить метод QueryTwoFields внутри обработчика кнопки. Вы должны определить это снаружи (см. Код выше). Также определите ваши данные подключения в начале программы:
namespace MyProject
{
/// <summary>
/// Defiine your connectionstring and connection
/// </summary>
///
public partial class Form1 : Form
{ public static string connString = "Server=10*****;Port=3306;Database=e***;Uid=e***;password=********************;";
MySqlConnection conn = new MySqlConnection(connString);
.........
Datatables фантастические
Использование таблицы данных - хороший способ чтения и записи. И он поставляется с роскошью того, что вы можете сделать с таблицей данных - например, присвоение его непосредственно элементу управления сеткой данных, сортировка, выбор и удаление, пока он отключен.
В приведенном ниже примере предполагается, что свойство соединения MySqlConnection управляется вызовами ваших собственных методов OpenConnection() и CloseConnection(), которые не показаны.
Простая демонстрационная демонстрационная версия:
public DataTable Select(string query = "")
{
//Typical sql: "SELECT * FROM motorparameter"
DataTable dt = new DataTable();
//Open connection
if (this.OpenConnection() == true)
{
//Create Command
MySqlCommand cmd = new MySqlCommand(query, connection);
//Create a data reader and Execute the command
MySqlDataReader dataReader = cmd.ExecuteReader();
dt.Load(dataReader);
//close Data Reader
dataReader.Close();
//close Connection
this.CloseConnection();
//return data table
return dt;
}
else
{
return dt;
}
}
В случае обратной записи данных в базу данных - укажите SQL, который вы использовали при чтении (или использовали бы для чтения в таблицу данных):
public void Save(DataTable dt, string DataTableSqlSelect)
{
//Typically "SELECT * FROM motorparameter"
string query = DataTableSqlSelect;
//Open connection
if (this.OpenConnection() == true)
{
//Create Command
MySqlCommand mySqlCmd = new MySqlCommand(query, connection);
MySqlDataAdapter adapter = new MySqlDataAdapter(mySqlCmd);
MySqlCommandBuilder myCB = new MySqlCommandBuilder(adapter);
adapter.UpdateCommand = myCB.GetUpdateCommand();
adapter.Update(dt);
//close Connection
this.CloseConnection();
}
else
{
}
}
Аккуратная вещь, которую можно получить, очень гибкая. Вы можете выполнить свои собственные выборки для таблицы, если она содержит данные, и перед обратной записью вы можете установить или сбросить, какие строки необходимо обновить, и по умолчанию таблица данных отслеживает, какие строки вы обновляете в таблице. Не забывайте столбцы первичного ключа для всех таблиц в БД.
Для нескольких запросов рассмотрите возможность использования соединения между таблицами базы данных или одной и той же таблицей, если данные связаны, или используйте синтаксис sql UNION, если число столбцов и тип данных совпадают. Вы всегда можете "создать" свой дополнительный столбец в списке выбора, чтобы отличать, какие данные поступают из какой части UNION.
Также рассмотрите возможность использования синтаксиса CASE WHEN sql для условного выбора данных из разных источников.