【问题标题】:How can I convert database query results to an array?如何将数据库查询结果转换为数组?
【发布时间】:2011-07-29 15:38:24
【问题描述】:

如何将 MySQL 查询中返回的结果转换为 C# .Net/Mono 中的数组

据我了解,您需要使用数组将包含的项目数来定义数组,但我知道 DataReader 不会告诉您返回了很多行。那么如何定义一个数组。

到目前为止我有:

string sqlWhere;

        if ((name != None) && (name != ""))
            sqlWhere = "WHERE name LIKE '%"+name+"%'";

        if ((company != None) && (company != ""))
            if (sqlWhere == "")
                sqlWhere = "WHERE company LIKE '%"+company+"%'";
            else
                sqlWhere = sqlWhere + " AND company LIKE '%"+company+"%'";

        if ((dateFrom != None) && (dateFrom != "") && (dateTo != None) && (dateTo != ""))
            if (sqlWhere == "")
                sqlWhere = "WHERE date(timestampIn) BETWEEN '"+dateFrom+"' AND '"+dateTo+"'";
            else
                sqlWhere = sqlWhere + " AND date(timestampIn) BETWEEN '"+dateFrom+"' AND '"+dateTo+"'";

        IDbCommand dbcmd = this.dbcon.CreateCommand();
        dbcmd.CommandText = "SELECT * FROM visitors " + sqlWhere;

                    MySqlDataReader Reader = dbcmd.ExecuteReader();

                    while (Reader.Read())
            {

            }

【问题讨论】:

  • 使用上面的代码,你对 SQL 注入持开放态度——这是一个严重的安全问题!
  • 为什么要数组?创建一个几乎总是一个坏主意。如果需要,您可以将数据读取器直接绑定到网格。

标签: c# .net mysql mono


【解决方案1】:
public IList<Group> GetGroup()
        {
            Connection c = new Connection();
            String connectionString = c.ConnectionName;
            OleDbConnection conn = new OleDbConnection(connectionString);
            OleDbCommand mycmd = conn.CreateCommand();
            DataSet dspendingapps = new DataSet();
            dspendingapps.Clear();

            mycmd.CommandText = " select g.groupid,g.groupname from tbl_group g order by g.groupname ";
            conn.Open();

            OleDbDataAdapter appreader = new OleDbDataAdapter(mycmd);
            appreader.Fill(dspendingapps);
            conn.Close();

            IList<Group> g = new List<Group>();

            foreach (DataRow drapp in dspendingapps.Tables[0].Rows)
            {
                Group gg = new Group();
                gg.GroupId = Convert.ToInt16(drapp["groupid"]);
                gg.Name = drapp["groupname"].ToString();
                g.Add(gg);

            }
            return g;
        }

【讨论】:

    【解决方案2】:

    不要使用DataReader,而是使用DataAdapter 来填充DataTable。您可以看到生成的DataTable 中的总行数。

    var results = new DataTable();
    
    var adapter = new SqlDataAdapter();
    adapter.SelectCommand = dbcmd;
    dapater.Fill(results);
    

    【讨论】:

      【解决方案3】:

      您可以使用List&lt;T&gt; 在此处输入代码而不是数组来存储您的数据,其中 T 是您要存储的数据类型,例如string、int 或您的自定义数据类型。对于使用数组,我们需要在编译时指定长度,但使用List&lt;T&gt;,我们可以存储数据而不用担心长度。

      【讨论】:

        【解决方案4】:

        扩展@Deepansh Gupta 的回复:您可以考虑创建一个自定义对象或结构,其内部数据字段对应于查询结果集中返回的列(即,每个对象对应一个数据行,对象中的每个数据变量对应于柱状数据)。当您的代码遍历结果的每一行时,创建一个新的自定义对象并将其附加到您的列表中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-17
          • 1970-01-01
          • 2012-08-16
          • 2011-01-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多