【问题标题】:Get value of one column as string where other column value is specified string?将一列的值作为字符串获取,而其他列的值是指定的字符串?
【发布时间】:2015-07-07 13:11:16
【问题描述】:

我可以在 C# 中使用 DataTable.Select(filterStatement); 执行此操作吗?

或者我应该使用 Linq?

我有一个 SQL 查询,它返回一个包含 [Username] 和 [LastUpdated] 两列的 DataTable dt2。

我想从 [LastUpdated] 列中获取一个字符串,其中 [Username] 列等于一个字符串。

以防万一,这两种数据类型在 SQL 表中都设置为 varchar(50)。

我会发布一张图片,但我还不能,第一次发布,数据表只是

用户名|上次更新时间
....admin2 | 2015-04-27...

在这种情况下,如果我能得到 [Username] = 'admin2' 的第二列的值。

我在 C# 中尝试了以下内容:

string timestamp = "";
DataRow[] dt2result = dt2.Select("Username = 'admin2'");
timestamp = dt2result[1].ToString();

我明白了

System.IndexOutOfRangeException: 索引超出数组范围

我尝试只使用不带括号 [] 的 DataRow dt2result = dt2.Select("Username = 'admin2'");,但我明白了

“无法将类型'Sytem.Data.DataRow[]'隐式转换为'System.Data.DataRow'”

我尝试过不同的索引,例如 dt2result[0]dt2result[1][0] 等,以及 dt2result.GetValue(0)

我知道这是一个基本问题,但请全面回答!

提前致谢!

【问题讨论】:

  • 为什么要使用 varchar 作为日期时间字段? (最后更新)
  • 因为我是 SQL 的新手,它是我尝试的第一个数据类型,它会隐含地采用我从 C# 传递它时的格式中的“DateTime.Now”值跨度>
  • 尝试在sql中使用datetime字段,并在c#中将其转换为DateTime
  • 请改用 datetime 或 datetime2,如果您是新手,我建议您改用 Entity Framework。或 SqlDataReader。不要使用数据表/数据集/Sqladapter。
  • 这是一种可以加快页面加载速度的做法吗?

标签: c# sql linq select datatable


【解决方案1】:
DataRow dt2result = dt2.Select("Username = 'admin2'").First();

会给你正确的行(我假设)。然后得到正确的列:

var timestamp=dtresult[1].ToString();

以下内容也应该有效:

var timestamp=dt2.Select("Username = 'admin2'")[0][1].ToString();

【讨论】:

  • 正如其他人所质疑的那样,不确定为什么要使用字符串来存储日期时间数据类型。另外,为什么要通过 EF 将数据读入数据表而不是强类型对象,甚至直接使用 SqlDataReader? DataTables/DataSets 很少使用正确的东西。
  • 您在几秒钟内就回答了我正在寻找的内容。我忽略了 .First() 因为我还没有引用 Linq。我将自己限制在令人沮丧的 c# 中。谢谢你们的建议。本周我将研究 SQLDataReader,对于我们使用的许多较小的查询来说,这听起来是正确的(我在一家小型家具连锁店工作)
【解决方案2】:

在这种情况下,如果我能得到第二列的值 [用户名] = 'admin2'。

您有多种获取LastUpdated 列值的方法。

使用您当前的代码:

DataRow[] dt2result = dt2.Select("Username = 'admin2'");

你会得到一个DataRow的数组,你可以检查你的数组的长度并访问第一行:

DataRow firstRow = dt2result[0];

并选择您需要的第二列的值:

var lastUpdatedValue = firstRow[1];

然后有一个LINQ选项

var lastUpdatedValue =  dt2.AsEnumerable()
    .Where(r => r.Field<string>("Username") == "admin2")
    .Select(r => r.Field<string>("LastUpdated"))
    .FirstOrDefault();

我正在使用r.Field&lt;string&gt;("LastUpdated"),因为您的LastUpdated 列具有varchar 数据类型。顺便说一句,如果您使用DateTime 特定类型来存储日期和时间值会更好。

【讨论】:

    猜你喜欢
    • 2013-09-10
    • 2020-11-30
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多