【问题标题】:using DataSet in Console Application?在控制台应用程序中使用数据集?
【发布时间】:2016-02-13 06:10:26
【问题描述】:

我试图弄清楚如何呈现我(应该)从 SQL 查询中获得的信息。这是我的代码:

        this.cmd = connection.CreateCommand();
        this.cmd.CommandText = "SELECT * FROM servers WHERE id > " + x + " AND id < " + y;
        this.adapter = new MySqlDataAdapter( this.cmd );
        this.adapter.SelectCommand = this.cmd;
        this.dataset = new DataSet();
        this.adapter.Fill( dataset );
        return this.dataset;

当我使用控制台应用程序时,如何使用 this.dataset 呈现信息?谢谢

【问题讨论】:

  • 查询结果将在数据集中的第一个表(也是唯一一个表)中。只需取出第一个表并循环抛出行,打印出数据。
  • 我不完全明白怎么做,你有例子吗?
  • 看看这篇文章,看看是否有帮助。 stackoverflow.com/questions/10822304/iterate-through-dataset
  • 非常小心使用这样的字符串替换将值放入 sql 查询中。这是让您的应用被黑的好方法。

标签: c# sql


【解决方案1】:

这是一个令人惊讶的涉及(但直截了当)的问题。他们使用的集合类很难使用。我想出了一个基本的实现。它不会尝试在正确的列中排列行值,但输出比 Juran 的要好一些。

主要答案在ToPrettyString() 扩展方法中。由于框架的缺陷,大多数其他扩展方法只是为了让生活更轻松。

using System;
using System.Collections.Generic;
using System.Data;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var ds = new DataSet();
            var customersTable = ds.Tables.Add("Customers");
            customersTable.Columns.AddRange("FirstName", "LastName", "Id", "Address");
            customersTable.Rows.Add("Bob", "Sagget", 1, "123 Mockingbird Lane");
            customersTable.Rows.Add("John", "Doe", 2, "1600 Pennsylvanie Ave");
            customersTable.Rows.Add("Jane", "Doe", 3, "100 Main St");

            Console.WriteLine(ds.ToPrettyString());
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }

    static class ExtensionMethods
    {    
        public static string ToPrettyString(this DataSet ds)
        {
            var sb = new StringBuilder();
            foreach (var table in ds.Tables.ToList())
            {
                sb.AppendLine("--" + table.TableName + "--");
                sb.AppendLine(String.Join(" | ", table.Columns.ToList()));
                foreach (DataRow row in table.Rows)
                {
                    sb.AppendLine(String.Join(" | ", row.ItemArray));
                }
                sb.AppendLine();
            }
            return sb.ToString();
        }

        public static void AddRange(this DataColumnCollection collection, params string[] columns)
        {
            foreach (var column in columns)
            {
                collection.Add(column);
            }
        }       

        public static List<DataTable> ToList(this DataTableCollection collection)
        {
            var list = new List<DataTable>();
            foreach (var table in collection)
            {
                list.Add((DataTable)table);
            }
            return list;
        }

        public static List<DataColumn> ToList(this DataColumnCollection collection)
        {
            var list = new List<DataColumn>();
            foreach (var column in collection)
            {
                list.Add((DataColumn)column);
            }
            return list;
        }
    }
}

输出:

--客户--

名字 |姓氏 |身份证 |地址

鲍勃|萨格特 | 1 | 123知更鸟巷

约翰 |能源部 | 2 |宾夕法尼亚大街 1600 号

简 |能源部 | 3 |主街 100 号

【讨论】:

    【解决方案2】:
    foreach (DataTable table in dataSet.Tables)
    {
        foreach (DataRow row in table.Rows)
        {
            foreach (DataColumn column in table.Columns)
            {
                object item = row[column];
                // read column and item
                Console.WriteLine("item ", item );
            }
        }
    }
    

    【讨论】:

    • 打印所有值,每行一个值。我想这会有点丑陋。您能否完善您的实现以打印所有列标题,然后为每一行设置一行?
    • @user2454991 没有指定如何呈现它。只是给了他一些提示。是的,最好添加列标题
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2017-07-04
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    相关资源
    最近更新 更多