【问题标题】:How can I get the single val from a SQL Server CE query that returns one column from one row?如何从从一行返回一列的 SQL Server CE 查询中获取单个值?
【发布时间】:2014-08-20 18:03:56
【问题描述】:

我需要从表的一列,任何记录中检索 val(所有记录中的 val 在任何给定时间都应该相同;也就是说,如果它是“3”,那么它将是“3”在所有这些中;如果是“17”,则在所有这些中都是“17”(或“42”或其他)。

所以我看到了这样的遗留代码:

DataSet ds = dbconn.getDataSet("SELECT siteNo FROM workTables");

foreach (DataRow row in ds.Tables[0].Rows)
{
    siteNum = row["siteNo"].ToString();
}

...这可行,但看起来很笨拙且浪费,因为可以循环通过大量记录,并且只使用最后一个循环的值。

所以我试图用这段代码“切入正题”:

String siteNum = ds.Tables[0].Rows.ToString();

...但出现异常,因为 siteNum 是 System.Data.DataRowCollection

然后我尝试了这个:

String siteNum = ds.Tables[0].Rows[0].ToString();

...但出现异常,因为 siteNum 是 System.Data.DataRow

所以我终于恢复到旧的 kludgy 代码,几乎是这样修改它:

DataSet ds = dbconn.getDataSet("SELECT siteNo FROM workTables");

foreach (DataRow row in ds.Tables[0].Rows)
{
    siteNum = row["siteNo"].ToString();
    // just need the first one
    break;
}

这可行,但我确信它不是“首选方法”。谁知道“更好”的方法?

【问题讨论】:

    标签: dataset sql-server-ce row windows-ce windows-embedded-compact


    【解决方案1】:

    使用ExecuteScalar 返回结果集中第一行的第一列:

    var result = connection.ExecuteScalar("SELECT siteNo FROM workTables");
    if((result != null) && (result != DBNull.Value))
    {
        site = Convert.ToInt32(result);
    }
    

    【讨论】:

    • 至少值得试验一下,看看 TableDirect 调用是否更快,因为它会完全避免查询处理器。这取决于表中的数据量。
    【解决方案2】:

    只需将您的查询更改为 SELECT TOP 1 siteNo FROM workTables 这样可以最大限度地减少服务器上的处理和网络流量。

    【讨论】:

    • 我会试试,但我不确定 SQL CE 是否支持。
    • 我没有使用过 SQL Server CE,但我想它是受支持的。如果不是,那么您可以将 TOP 1 更改为 Max(siteNo),也许支持 max 函数?正确的方法是使用一个输出参数的存储过程,是否支持存储过程?如果您必须检索所有数据并且只获取第一行,只需这样做:string sitenum = ds.Tables[0].Rows[0]["siteNo"].ToString();
    • 不,没有 SP;我也不认为 Max 是受支持的。它是一个非常精简的 SQL 子集;它应该被称为卡戴珊版或类似的东西。
    • 希望 TOP 1 得到支持。如果不是,您可以像我之前展示的那样从第一行获取值: string sitenum = ds.Tables[0].Rows[0]["siteNo"].ToString();
    • 我喜欢你的 "ds.Tables[0].Rows[0]["siteNo"].ToString();"优于“Top 1”;行得通。
    猜你喜欢
    • 2012-11-21
    • 2019-03-09
    • 2018-10-21
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多