【发布时间】:2010-05-26 20:35:31
【问题描述】:
我有一个数据表。我需要根据用户输入获取某个列值。例如,假设数据表有两列 CountryID 和 CountryName。
我需要根据用户输入的国家名称在数据表中找到 CountryID。我可以打开与 DB 的连接并运行查询 select countryID from Country where countryName = @userinput。无论如何我可以在数据表上做到这一点。
【问题讨论】:
我有一个数据表。我需要根据用户输入获取某个列值。例如,假设数据表有两列 CountryID 和 CountryName。
我需要根据用户输入的国家名称在数据表中找到 CountryID。我可以打开与 DB 的连接并运行查询 select countryID from Country where countryName = @userinput。无论如何我可以在数据表上做到这一点。
【问题讨论】:
string countryName = "USA";
DataTable dt = new DataTable();
int id = (from DataRow dr in dt.Rows
where (string)dr["CountryName"] == countryName
select (int)dr["id"]).FirstOrDefault();
【讨论】:
foreach (DataRow row in Datatable.Rows)
{
if (row["CountryName"].ToString() == userInput)
{
return row["CountryID"];
}
}
虽然这可能无法直接编译,但您应该明白这一点,但我相信通过 SQL 进行查询会非常优越,因为巨大的数据表需要很长时间才能遍历所有行。
【讨论】:
我建议基于扩展方法的这种方式:
IEnumerable<Int32> countryIDs =
dataTable
.AsEnumerable()
.Where(row => row.Field<String>("CountryName") == countryName)
.Select(row => row.Field<Int32>("CountryID"));
需要引用System.Data.DataSetExtensions.dll。
【讨论】:
根据帖子的标题,我只需要从特定列中获取所有值。这是我用来实现这一目标的代码。
public static IEnumerable<T> ColumnValues<T>(this DataColumn self)
{
return self.Table.Select().Select(dr => (T)Convert.ChangeType(dr[self], typeof(T)));
}
【讨论】:
我想您可以改用 DataView 对象,这样您就可以利用 RowFilter 属性,如下所述:
http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx
private void MakeDataView()
{
DataView view = new DataView();
view.Table = DataSet1.Tables["Countries"];
view.RowFilter = "CountryName = 'France'";
view.RowStateFilter = DataViewRowState.ModifiedCurrent;
// Simple-bind to a TextBox control
Text1.DataBindings.Add("Text", view, "CountryID");
}
【讨论】:
数据表有一个 .Select 方法,该方法根据您指定的条件返回一个行数组。像这样的:
Dim oRows() As DataRow
oRows = dtCountries.Select("CountryName = '" & userinput & "'")
If oRows.Count = 0 Then
' No rows found
Else
' At least one row found. Could be more than one
End If
当然,如果用户输入包含 ' 字符,它会引发异常(例如,如果您查询数据库)。你应该转义 ' 字符(我使用一个函数来做到这一点)。
【讨论】: