获取表中列中的第一个值的 SQL 是什么

本文关键字:SQL 是什么 第一个 获取 | 更新日期: 2023-09-27 18:32:13

我想重构这段代码,因为它看起来很浪费,古怪而奇怪:

public string getVersion()
{
    try
    {
        string dynSQL = "SELECT * FROM invHeader";
        DataSet workSites = dbconn.getDataSet(dynSQL);
        //Go thru dataset and display the working files
        //Only need one, although we'll be duplicating the version
        //per each site as a check value during upgrades
        //return workSites.Tables[0].Rows
        foreach (DataRow row in workSites.Tables[0].Rows)
        {
            sVersion = row["ID"].ToString();
            break;
        }
    }
    catch (Exception ex)
    {
        Duckbill.ExceptionHandler(ex, "InvHeader.getVersion");
    }
    return sVersion;
} // getVersion

我想我可以把它改成这样:

public string getVersion()
{
    try
    {
        string dynSQL = "SELECT FIRST ID FROM invHeader"; // I also tried "SELECT 1 ID FROM invHeader"
        DataSet workSites = dbconn.getDataSet(dynSQL);
        return workSites.Tables[0].Rows[0]["ID"].ToString();
    }
    catch (Exception ex)
    {
        Platypus.ExceptionHandler(ex, "InvHeader.getVersion");
    }
} // getVersion

。但两个查询都没有返回我想要的(第一行中的 ID 值)。那么SQL是什么来做到这一点。

顺便说一句,我知道这应该是某种标量调用,但是在这些相互依赖的本土,自卷方法中发生了许多时髦的Rube Goldberg式的事情,我不敢碰; 不过,这个小小的清理应该是可行的,而不会在我的战利品中颤抖。

更新

我想我跳枪授予答案 - SQL Server CE 查询分析器中的"从 invHead 中选择前 1 个 ID"的结果是:

FAILED: SELECT TOP 1 ID FROM invHeader 
Error: x800...._E_ERRORSINCOMMAND
Native Error: (25501)
Description: There was an error parsing the query. [Token line number, Token line offset, Token in error,,]
Interface defining error: IID_ICommand
Paaram. 0:1
Param. 1: 8
Param. 2:0
Param. 3: TOP
Param. 4:
Param. 5:

这似乎很神秘,但我确实知道的一件事是SQL Server CE Query Analyzer"并不好笑"。

更新 2

我发现了这种类似的东西更令人震惊的代码气味;不仅方法的名称让你相信它返回一个值(嗯,确实如此,这是真的);但是当它这样做时,它从一个潜在的大表中获取所有记录,以便简单地(再次)抓取第一个。

写这篇文章的猫真的有可能没有收到关于挥霍使用"SELECT *"的备忘录警告吗?

我可以提交匿名参赛作品参加代码混淆竞赛吗?

public string getINVSite()
{
    string  siteStr   = "";
    string  dSQL      = "";
    DataSet workSites;
    dSQL      = "SELECT * FROM inventory";
    dbconn    = DBConnection.GetInstance();
    workSites = dbconn.getDataSet( dSQL );
#if true
//            DataRow row = workSites.Tables[0].Rows[0];
    siteStr = "1";
    if (workSites.Tables.Count > 0)
    {
        if(workSites.Tables[0].Rows.Count>0)
            siteStr = workSites.Tables[0].Rows[0]["ID"].ToString();
    }
    return( siteStr );
#else
    //Go thru dataset and display the working files
    foreach( DataRow row in workSites.Tables[0].Rows )
    {
        return( row["ID"].ToString() );
    }
    return( "" );
#endif
} // getINVSite

现在你知道我所承担的重担了;如果带着怜悯感动,就把钱捐给你选择的慈善机构。

更新 3

对不起,ctacke; 感谢您的帮助,但这太像兔子洞了; 原始代码虽然值得疯帽子,但有效;我有更臭的鱼要炸,所以我会离开它,至少现在。我试过这个:

public string getVersion()
{
    string conStr = "Data Source = " + dbconn.filename;
    MessageBox.Show(string.Format("conStr in InvHeader.getVersion() is {0}", conStr));//TODO: Remove after testing
    try
    {
        using (SqlCeConnection connection = new SqlCeConnection(conStr))
        {
            connection.Open();
            using (SqlCeCommand command = new SqlCeCommand("SELECT ID FROM invHeader", connection))
            using (SqlCeDataReader reader = command.ExecuteReader())
            {
                if (reader.Read())
                {
                    string s = reader.GetString(0);
                    MessageBox.Show(string.Format("version InvHeader.getVersion() is {0}", s));//TODO: Remove after testing
                    return s;// reader.GetString(0);
                }
                else
                {
                    // no result
                    return null;
                }
            }
        }
    }
    catch (Exception ex)
    {
        Pterodactyl.ExceptionHandler(ex, "InvHeader.getVersion");
        return string.Empty;
    }
}

。我仍然得到一个例外;在第一个 MessageBox.Show() 中看到连接字符串后,我看不到第二个。

获取表中列中的第一个值的 SQL 是什么

在MS SQL Server CE中,它是TOP (N)

SELECT TOP (1) ID 
FROM invHeader 
ORDER BY ???

ORDER BY如果您不希望返回任意记录。

不要使用数据集。 曾。

下面是一个很好的第一遍。 如果通过 TableDirect 对 id 字段进行索引,它可以做得更快,但我会先运行它以查看性能是否可以接受。

public string GetVersion()
{
    using (var connection = new SqlCeConnection("my connection string"))
    {
        connection.Open();
        using (var command = new SqlCeCommand("SELECT id FROM invHeader", connection))
        using (var reader = command.ExecuteReader())
        {
            if (reader.Read())
            {
                return reader.GetString(0);
            }
            else
            {
                // no result
                return null;
            }
        }
    }
}

从 invHeader 中选择前 1 个 ID

避免使用

DataSet,使用 SqlCommand 和 ExecuteScalar 方法。

编辑

此代码应该是等效的、功能性的且速度更快:

public string getVersion()
{
    try
    {
        // Use TOP (N) http://technet.microsoft.com/en-us/library/bb686896.aspx
        string dynSQL = "SELECT TOP (1) ID FROM invHeader";
        return (string)(new SqlCeCommand(dynSQL, dbconn.getConnection()).ExecuteScalar());
    }
    catch (Exception ex)
    {
        Platypus.ExceptionHandler(ex, "InvHeader.getVersion");
    }
} // getVersion   
假设dbconn

是一个类,可以给你一个调用dbconn.getConnection()的SqlCeConnection。