![](/img/trans.png)
[英]How to Insert values to strongly typed DataSet from code and then show it from RDLC reporting page?
[英]How to get distinct values from a datatable in strongly typed dataset
我正在使用強類型數據集,並且其中有很多表。
現在的問題是我想從中過濾數據
GetData()
具有類似查詢的功能
select * from table_name
我如何過濾特定的表並從中區分出不同的值。 另外,如果我嘗試對其進行過濾,則返回所有列,但其余字段為空值,但我要求的除外,因此我無法將其作為數據源分配給datagrid
或combobox
我怎樣才能做到這一點..
您的問題不是很清楚。 我了解的是,數據集中有多個表。 現在,您要根據表名稱進行過濾。 如果要通過在單個存儲過程中編寫多個選擇查詢來返回數據集中的多個表,則無法用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;
}
數據表的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擴展方法,它將行的數組轉換為字符串的數組。
當我理解您的問題時,我做了一些快速的嘗試來幫助您,代碼可以得到改進,而且必須如此,我說我做得很快。
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中使用using,但這不是主題。 希望對您有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.