C# C MYSQL选择方法动态

C# C MYSQL选择方法动态,c#,mysql,C#,Mysql,下面是一个从mysql表中选择的方法。然而,我觉得它不是很有活力。从PHP开始,我所做的就是向函数发送一个查询,并在变量中接收其数据。情况似乎已不再如此 我的问题变化很大。有时它们只得到一行和一列。下次它可能会收集1000行和所有列。使用下面的列表不是很动态,我不希望为每个可能的场景构建一个select方法 我希望运行我的查询,返回数据,让我用它做我想做的事情 public List<string>[] Select(string query) {

下面是一个从mysql表中选择的方法。然而,我觉得它不是很有活力。从PHP开始,我所做的就是向函数发送一个查询,并在变量中接收其数据。情况似乎已不再如此

我的问题变化很大。有时它们只得到一行和一列。下次它可能会收集1000行和所有列。使用下面的列表不是很动态,我不希望为每个可能的场景构建一个select方法

我希望运行我的查询,返回数据,让我用它做我想做的事情

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");
        }
    }