88

我有一个DataTable从 SQL 查询填充到本地数据库的数据,但我不知道如何从中提取数据。主要方法(在​​测试程序中):

static void Main(string[] args)
{
    const string connectionString = "server=localhost\\SQLExpress;database=master;integrated Security=SSPI;";
    DataTable table = new DataTable("allPrograms");

    using (var conn = new SqlConnection(connectionString))
    {
        Console.WriteLine("connection created successfuly");

        string command = "SELECT * FROM Programs";

        using (var cmd = new SqlCommand(command, conn))
        {
            Console.WriteLine("command created successfuly");

            SqlDataAdapter adapt = new SqlDataAdapter(cmd);

            conn.Open(); 
            Console.WriteLine("connection opened successfuly");
            adapt.Fill(table);
            conn.Close();
            Console.WriteLine("connection closed successfuly");
        }
    }

    Console.Read();
}

我用来在我的数据库中创建表的命令:

create table programs
(
    progid int primary key identity(1,1),
    name nvarchar(255),
    description nvarchar(500),
    iconFile nvarchar(255),
    installScript nvarchar(255)
)

如何将数据提取DataTable到有意义的表单中?

4

7 回答 7

171

DataTable 具有.RowsDataRow 元素的集合。

每个 DataRow 对应于数据库中的一行,并包含一组列。

要访问单个值,请执行以下操作:

 foreach(DataRow row in YourDataTable.Rows)
 { 
     string name = row["name"].ToString();
     string description = row["description"].ToString();
     string icoFileName = row["iconFile"].ToString();
     string installScript = row["installScript"].ToString();
 }
于 2009-08-28T10:22:23.577 回答
26

您可以将数据表设置为许多元素的数据源。

例如

网格视图

中继器

数据列表

等等等等

如果您需要从每一行中提取数据,那么您可以使用

table.rows[rowindex][columnindex]

或者

如果您知道列名

table.rows[rowindex][columnname]

如果您需要迭代表,那么您可以使用 for 循环或 foreach 循环,例如

for ( int i = 0; i < table.rows.length; i ++ )
{
    string name = table.rows[i]["columnname"].ToString();
}

foreach ( DataRow dr in table.Rows )
{
    string name = dr["columnname"].ToString();
}
于 2009-08-28T10:21:56.667 回答
12

DataTable当您有多种数据类型(不仅仅是字符串)时,从 a 中提取数据的最简单方法是使用Field<T>程序集中可用的扩展方法System.Data.DataSetExtensions

var id = row.Field<int>("ID");         // extract and parse int
var name = row.Field<string>("Name");  // extract string

MSDNField<T>方法:

提供对 DataRow 中每个列值的强类型访问。

这意味着当您指定类型时,它将验证并取消装箱对象。

例如:

// iterate over the rows of the datatable
foreach (var row in table.AsEnumerable())  // AsEnumerable() returns IEnumerable<DataRow>
{
    var id = row.Field<int>("ID");                           // int
    var name = row.Field<string>("Name");                    // string
    var orderValue = row.Field<decimal>("OrderValue");       // decimal
    var interestRate = row.Field<double>("InterestRate");    // double
    var isActive = row.Field<bool>("Active");                // bool
    var orderDate = row.Field<DateTime>("OrderDate");        // DateTime
}

它还支持可为空的类型:

DateTime? date = row.Field<DateTime?>("DateColumn");

这可以简化从中提取数据的过程,DataTable因为它消除了将对象显式转换或解析为正确类型的需要。

于 2019-01-24T23:37:39.863 回答
5

请考虑使用如下代码:

SqlDataReader reader = command.ExecuteReader();
int numRows = 0;
DataTable dt = new DataTable();

dt.Load(reader);
numRows = dt.Rows.Count;

string attended_type = "";

for (int index = 0; index < numRows; index++)
{
    attended_type = dt.Rows[indice2]["columnname"].ToString();
}

reader.Close();
于 2014-03-27T11:10:44.303 回答
3

除非你有特定的理由来做原始的 ado.net,否则我会看看使用像 nHibernate 或 LINQ to SQL 这样的 ORM(对象关系映射器)。这样,您可以查询数据库并检索要使用的对象,这些对象是强类型的并且更易于使用恕我直言。

于 2009-08-28T10:36:20.727 回答
-1
  var table = Tables[0]; //get first table from Dataset
  foreach (DataRow row in table.Rows)
     {
       foreach (var item in row.ItemArray)
         {
            console.Write("Value:"+item);
         }
     }
于 2015-10-28T16:14:04.850 回答
-1

请注意,使用 DataAdapter 时不需要打开和关闭连接。

所以我建议请更新此代码并删除连接的打开和关闭:

        SqlDataAdapter adapt = new SqlDataAdapter(cmd);

conn.Open(); // 这行代码是不必要的

        Console.WriteLine("connection opened successfuly");
        adapt.Fill(table);

conn.Close(); // 这行代码是不必要的

        Console.WriteLine("connection closed successfuly");

参考文档

此示例中显示的代码没有显式打开和关闭连接。如果发现连接尚未打开,Fill 方法会隐式打开 DataAdapter 正在使用的连接。如果 Fill 打开了连接,它也会在 Fill 完成时关闭连接。当您处理诸如填充或更新之类的单个操作时,这可以简化您的代码。但是,如果您正在执行需要打开连接的多个操作,则可以通过显式调用 Connection 的 Open 方法、对数据源执行操作,然后调用 Connection 的 Close 方法来提高应用程序的性能。您应该尽量保持与数据源的连接尽可能短暂地打开,以释放资源供其他客户端应用程序使用。

于 2017-08-09T20:53:53.380 回答