如何从强类型数据集中的数据表中获取不同的值

时间:2011-12-23 07:25:14

标签: c# .net vb.net sql-server-2008-r2 strongly-typed-dataset

我使用的是强类型数据集,并且有很多表格。

问题是现在我想从

过滤数据
GetData()

具有类似

的查询的函数
select * from table_name

如何从中过滤特定的表和不同的值。此外,如果我尝试过滤它返回所有列但休息有空值除了我问的那个,所以我不能将它作为数据源分配给datagrid或组合框

我该怎么做..

3 个答案:

答案 0 :(得分:0)

你的问题不是很清楚。我所理解的是,您有一个数据集中有多个表。现在您要根据表名进行过滤。如果通过在单个存储过程中编写多个选择查询来返回数据集中的多个表,则无法在sql中命名表。您必须通过硬编码方式访问它。 另一种方法是你可以在第0个位置添加一个表,并在该表中添加表的名称以及在返回查询时它将在DataSet中的位置。因此,存储过程中的第一个查询将返回一个表,该表具有表的名称和它们在DataSet中的位置之间的映射。现在GetData()函数会变得非常简单。

function DataTable GetData(string tableName)
{
  //Supposing 0th table is mapping table with 2 columns, One contains Name and another   position
   var pos = ds.Tables[0].where(x => x[0] == tableName).Select(x => x[1]).firstOrDefault();
   var table = ds.Tables[pos];
   return table;
}

答案 1 :(得分:0)

DataTable的Select()方法怎么样?

DataRow[] filtered = someDataSet.SomeDataTable.Select("Status = 'Active'");

修改
在OP的评论后更新了代码示例

using System.Linq;
...
DataRow[] rows = someDataSet.SomeDataTable.Select("Status = 'Active'");
string[] columnValues = row.Select(x => x["SomeColumnName"].ToString());

注意,两种Select()方法不同。第一种是过滤行的DataTable方法。第二个是linq扩展方法,它将行数组转换为字符串数组。

答案 2 :(得分:0)

当我理解你的问题时,我做了一些快速尝试帮助的事情,代码可以改进,必须是,我怎么说我做得很快。

Public Module DataSetExtensions
    <Runtime.CompilerServices.Extension()>
    Public Function [Select](ds As DataSet, table As String, ParamArray campos() As String) As DataTable
        Dim dt As New DataTable
        Dim sourceTable = (From t As DataTable In ds.Tables _
            Where t.TableName = table).SingleOrDefault

        Dim columnas = From c As DataColumn In sourceTable.Columns Where campos.Contains(c.ColumnName)

        columnas.ToList.ForEach(Sub(c) dt.Columns.Add(c.ColumnName))

        For Each row As DataRow In sourceTable.Rows
            Dim newRow As DataRow = dt.NewRow
            For Each col As DataColumn In sourceTable.Columns
                If columnas.Contains(col) Then
                    newRow(col.ColumnName) = row(col)
                End If
            Next
            dt.Rows.Add(newRow)
        Next

        Return dt
    End Function

    <Runtime.CompilerServices.Extension()>
    Public Function [Select](table As DataTable, ParamArray campos() As String) As DataTable
        Dim dt As New DataTable

        Dim columnas = From c As DataColumn In table.Columns Where campos.Contains(c.ColumnName)

        columnas.ToList.ForEach(Sub(c) dt.Columns.Add(c.ColumnName))

        For Each row As DataRow In table.Rows
            Dim newRow As DataRow = dt.NewRow
            For Each col As DataColumn In table.Columns
                If columnas.Contains(col) Then
                    newRow(col.ColumnName) = row(col)
                End If
            Next
            dt.Rows.Add(newRow)
        Next

        Return dt
    End Function
End Module

这样的呼叫

Using ds As New DataSet1()
    Using ta As New DataSet1TableAdapters.BCR_SOLICITUDTableAdapter()
        ta.Fill(ds.BCR_SOLICITUD)
        Dim dt As DataTable
        ' First extended method
        dt = ds.Select("BCR_SOLICITUD", "Numero", "Estado", "Descripción")
        ' Second extended method
        dt = ds.BCR_SOLICITUD.Select("Numero","Estado", "Descripción")
        'Code here
        dt.Dispose
        dt=Nothing
    End Using
End Using

您可以在DataTable中使用,但这不是主题。 我希望它可以帮到你。