C#MYSQL SELECT方法动态

时间:2014-05-16 14:12:12

标签: c# mysql

以下是从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;

            }
        }

谢谢!

4 个答案:

答案 0 :(得分:1)

看一下ExpandoObject。或者对于较旧的.NET,请使用Dictionary或HashMap。

您可以从Select()方法返回List。在方法内部,您可以遍历DataReader的字段,将它们映射到我提到的对象类型之一。

如何遍历数据阅读器的列 -

how can i loop through all of the columns of the OracleDataReader

如何在运行时按名称向ExpandoObject添加属性

Adding unknown (at design time) properties to an ExpandoObject

 public List<dynamic> Select(string sql) {

        var list = new List<dynamic>();

        // ... your code to connect to database, execute sql as datareader ...
        // I recommend you Google the using statement, and use that to dispose
        // your connection and reader

        while (dataReader.Read())
        {
           var obj = new ExpandoObject();
           var d = obj as IDictionary<String, object>;
           for( int index = 0; index < reader.FieldCount; index ++ )
              d[ reader.GetName( index ) ] = reader.GetString( index );

           list.Add(obj);
        }

        return list;
  }

虽然不是这个问题的范围,但您应该使用using语句,而不是像人们经常那样明确地关闭连接或在finally块中处理读者。

Should I be using SqlDataReader inside a "using" statement?

答案 1 :(得分:0)

this my sql tutorial提取此信息,认为您要做的是返回数据集或数据表。

这只是一个例子,需要改变才能在你的方法中工作,应该给你你需要的东西

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

    }

答案 2 :(得分:0)

您是否考虑使用像NPoco这样的微型ORM?

我使用许多不同类型的数据库,包括MySQL,我喜欢将它与Entity Framework结合使用来构建代表我的表和视图的类。我不在运行时使用实体框架与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");
        }
    }

在这些示例(未测试)中,您将在web.config或app.config中保存一个名为LocalMySqlServer的连接字符串,在MySQL中您将拥有一个名为users的表。您将拥有一个名为user的类,该类与数据库中的users表匹配 - 使用Entity Framework导入或手动创建。

NPoco能够做得更多,值得一试。如果你不想在生产中使用NPoco,那么你可以通过源代码查看它是如何工作的。

最后,在您的示例中,您传递了要运行的SQL语句。 NPoco使用参数化查询来降低注入攻击的风险。

答案 3 :(得分:-1)

我会避免使用数据阅读器,而是使用DataTable,你可以得到像这样的列

foreach (DataColumn column in oTable1.Columns) {
 object value1 = oRow[column.ToString()].ToString();
}