C# C MYSQL选择方法动态
下面是一个从mysql表中选择的方法。然而,我觉得它不是很有活力。从PHP开始,我所做的就是向函数发送一个查询,并在变量中接收其数据。情况似乎已不再如此 我的问题变化很大。有时它们只得到一行和一列。下次它可能会收集1000行和所有列。使用下面的列表不是很动态,我不希望为每个可能的场景构建一个select方法 我希望运行我的查询,返回数据,让我用它做我想做的事情C# C MYSQL选择方法动态,c#,mysql,C#,Mysql,下面是一个从mysql表中选择的方法。然而,我觉得它不是很有活力。从PHP开始,我所做的就是向函数发送一个查询,并在变量中接收其数据。情况似乎已不再如此 我的问题变化很大。有时它们只得到一行和一列。下次它可能会收集1000行和所有列。使用下面的列表不是很动态,我不希望为每个可能的场景构建一个select方法 我希望运行我的查询,返回数据,让我用它做我想做的事情 public List<string>[] Select(string query) {
public List<string>[] Select(string query)
{
//Create a list to store the result
List<string>[] list = new List<string>[3];
list[0] = new List<string>();
//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();
//Read the data and store them in the list
while (dataReader.Read())
{
list[0].Add(dataReader["id"] + "");
list[1].Add(dataReader["name"] + "");
list[2].Add(dataReader["age"] + "");
}
//close Data Reader
dataReader.Close();
//close Connection
this.CloseConnection();
//return list to be displayed
return list;
}
else
{
return list;
}
}
谢谢 看看ExpandoObject。对于较旧的.NET,请使用字典或HashMap 您可以从Select方法返回列表。在该方法中,您可以遍历DataReader的字段,将它们映射到我提到的一种对象类型 如何在数据读取器的列之间循环- 如何在运行时按名称向ExpandooObject添加属性 虽然实际上不属于这个问题的范围,但您应该使用语句,而不是像人们经常做的那样显式关闭连接或在finally块中处理读取器 从这里可以看出,您想做的是返回一个数据集或数据表 这只是一个示例,需要进行修改才能在您的方法中工作,但它应该能满足您的需要
string cs = @"server=localhost;userid=user12;
password=34klq*;database=mydb";
MySqlConnection conn = null;
try
{
conn = new MySqlConnection(cs);
conn.Open();
string stm = "SELECT * FROM Authors";
MySqlDataAdapter da = new MySqlDataAdapter(stm, conn);
DataSet ds = new DataSet();
da.Fill(ds, "Authors");
DataTable dt = ds.Tables["Authors"];
dt.WriteXml("authors.xml");
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
{
Console.WriteLine(row[col]);
}
Console.WriteLine("".PadLeft(20, '='));
}
} catch (MySqlException ex)
{
Console.WriteLine("Error: {0}", ex.ToString());
} finally
{
if (conn != null)
{
conn.Close();
}
}
我将避免使用数据读取器,而是使用DataTable,您可以得到如下列
foreach (DataColumn column in oTable1.Columns) {
object value1 = oRow[column.ToString()].ToString();
}
你有没有想过使用像这样的微型ORM 我使用许多不同类型的数据库,包括MySQL,我喜欢将其与实体框架结合使用,以构建表示我的表和视图的类。我不在MySQL运行时使用实体框架——从历史上看,它非常慢。 然后我有一个数据访问层,它保存了我用来访问数据的所有方法 使用NPoco的内联SQL的典型方法可能如下所示:
public user GetUser(int userId)
{
using (var db = new Database("LocalMySqlServer"))
{
var sql = NPoco.Sql.Builder.Append("SELECT * FROM users where ID=@0", userId);
var myList = db.FirstOrDefault<user>(sql);
return myList;
}
}
public List<user> GetUsers()
{
using (var db = new Database("LocalMySqlServer"))
{
return db.Fetch<user>("SELECT * FROM users");
}
}
在这些未测试的示例中,您将有一个名为LocalMySqlServer的连接字符串保存在web.config或app.config中,而在MySQL中,您将有一个名为users的表。您将拥有一个名为user的类,该类与数据库中的users表相匹配—使用Entity Framework导入或手动创建
NPoco有更多的能力,值得一试。如果您不想在生产中使用NPoco,那么作为开源软件,您可以运行源代码以了解它是如何工作的
最后,在您的示例中,您传递了希望运行的SQL语句。NPoco使用参数化查询来降低注入攻击的风险。你是说C没有更好的方法来处理数据库数据?@user3218338-我一点也不这么说。C有很多方法。这完全取决于您喜欢哪种抽象级别。我想发送一个查询,然后接收一组数据。不管查询是什么,只要它是正确的,选择查询。你有没有像我刚才建议的那样用谷歌ExpandObject或字典?您可以遍历DataReader的字段,并动态地将它们添加到对象或记录类型中,以从Select方法返回。您可以从SelectSee返回一个列表查看我的答案更新,2 StackOverflow答案,以便构建动态选择方法。如果不清楚,我将用一个例子再次修改。
public user GetUser(int userId)
{
using (var db = new Database("LocalMySqlServer"))
{
var sql = NPoco.Sql.Builder.Append("SELECT * FROM users where ID=@0", userId);
var myList = db.FirstOrDefault<user>(sql);
return myList;
}
}
public List<user> GetUsers()
{
using (var db = new Database("LocalMySqlServer"))
{
return db.Fetch<user>("SELECT * FROM users");
}
}