C#Mysql多个查询
本文关键字:查询 C#Mysql | 更新日期: 2023-09-27 18:20:32
我正在尝试构建一个小的状态工具。我需要得到多个查询的结果(大约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);
}
}
您不必每次执行一个查询时都关闭连接,只需关闭分配给该连接的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);
.........
数据表非常棒
使用数据表是一种很好的读写方法。它还提供了对数据表所能做的所有事情的奢侈功能,比如将其直接签名到数据网格控件,在断开连接时进行排序、选择和删除。
下面的示例假设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(或本应用于读取数据表的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
{
}
}
简洁的数据表非常灵活。一旦表包含数据,您就可以对表运行自己的选择,在写回之前,您可以设置或重置需要更新的行,默认情况下,数据表会跟踪您在表中更新的行。不要忘记数据库中所有表的主键列。
对于多个查询,如果可能,请考虑在数据库表之间使用联接,或者如果数据相关,则使用同一表,或者如果列计数和数据类型相同,则使用UNION-sql语法。您可以在select中"创建"额外的列,以区别UNION的哪个部分的数据。
还可以考虑使用CASE WHEN sql语法来有条件地选择来自不同来源的数据。