从 SQL 获取列中的最后一个单元格

Posted

技术标签:

【中文标题】从 SQL 获取列中的最后一个单元格【英文标题】:Get last cell in a column from an SQL 【发布时间】:2013-11-14 09:27:06 【问题描述】:

相当具体的问题。 我正在制作一个检测文件的程序。当有一个具有特定名称的新文件时,它会将其保存到服务器。这工作正常。问题是,它保存的变量之一是一个唯一的数字,它应该随着它上传的每个文件而增加。 所以第一个文件的唯一编号为 400,下一个文件的唯一编号为 401,依此类推。

我将一个测试文件上传到服务器,所以已经有一个唯一编号为 400 的文件。 我现在想要的是我的下一个文件应该有下一个数字。 为此,它必须从第一列的最后一个单元格中获取数字。 我发现 SQL 语句是 SELECT TOP 1 * FROM EKG_Temp ORDER BY ekgmaaleid DESC。 我已经对包含 SQL 语句的命令 loadCMD 进行了注释。

表的名称是 EKG_Temp。列的名称是 ekgmaaleid,类型是 BigInt

我有兴趣将 ekgmaaleid 列中的最后一个单元格保存为我的程序中的变量,以供以后使用。

    public void SaveFile(string fileName, byte[] BlobValue)
    
        string fullPath = (folder + "/" + fileName);
        fileExtension = fileName.Substring(fileName.Length - 3);
        if (saveBool == true)
        
            SqlConnection con = new SqlConnection(@"Data Source=Irrelavant");
            SqlCommand SaveCmdTemporary = new SqlCommand("insert into EKG_Temp(ekgmaaleid,dato,borger_cprnr,raa_data,maaleformat_type) values(@ekgmaaleid,@dato,@borger_cprnr,@raa_data,@maaleformat_type)", con);
            //SqlCommand SaveCmdPermanent = new SqlCommand("insert into EKG_Temp(ekgmaaleid,dato,borger_cprnr,raa_data,maaleformat_type) values(@ekgmaaleid,@dato,@borger_cprnr,@raa_data,@maaleformat_type)", con);
            //SqlCommand LoadCmd = new SqlCommand("SELECT TOP 1 * FROM EKG_Temp ORDER BY ekgmaaleid DESC", con); //Husk at den faktisk skal vælge måleid ud fra EKG_Gemt i virkeligheden
            SqlParameter ekgmaaleidParam = new SqlParameter("@ekgmaaleid", SqlDbType.BigInt);
            SqlParameter datoParam = new SqlParameter("@dato", SqlDbType.DateTime);
            SqlParameter borger_cprnrParam = new SqlParameter("@borger_cprnr", SqlDbType.NVarChar, 50);
            SqlParameter raa_dataParam = new SqlParameter("@raa_data", SqlDbType.VarBinary, -1);
            SqlParameter maaleformat_typeParam = new SqlParameter("@maaleformat_type", SqlDbType.NVarChar, 10);
            SqlParameter loadMaaleIDParam = new SqlParameter("@ekgmaaleid", SqlDbType.BigInt);
            con.Open();
            SaveCmdTemporary.Parameters.Add(ekgmaaleidParam);
            SaveCmdTemporary.Parameters.Add(datoParam);
            SaveCmdTemporary.Parameters.Add(borger_cprnrParam);
            SaveCmdTemporary.Parameters.Add(raa_dataParam);
            SaveCmdTemporary.Parameters.Add(maaleformat_typeParam);
            //LoadCmd.Parameters.Add(loadMaaleIDParam);
            datoParam.Value = dato;
            borger_cprnrParam.Value = cpr;
            raa_dataParam.Value = BlobValue; //Kommer fra metoden FileCreated.
            maaleformat_typeParam.Value = fileExtension;
            try
            
                SaveCmdTemporary.Connection.Open();
                SaveCmdTemporary.ExecuteNonQuery();
                MessageBox.Show("File saved to database.", "BLOB Saved", MessageBoxButtons.OK, MessageBoxIcon.Information);
            
            catch (Exception ex)
            
                MessageBox.Show(ex.Message, "Save Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
            
            finally
            
                SaveCmdTemporary.Connection.Close();
                saveBool = false;
            

        
    

这是数据库的图片以及我希望它做什么。

提前致谢。

【问题讨论】:

你需要在你的表字段上寻找身份规范:它会为你增加数字......然后如果你真的需要从你的代码生成的最后一个 id,那么得到它很简单。请注意,如果您打算向用户提供文件,您至少应该有另一个标识符,这样任何人都无法获得他不打算仅通过用户另一个号码获得的文件。另请注意,最好将用户上传的文件存储在 webroot 之外。 观察:连接和命令为IDisposable;使用using 可以节省很多风险 那么您的问题到底是什么?您已经提到了必须执行的 SELECT TOP 1 语句才能获得最新数字...然后您可以在 INSERT 语句中使用它...不好但应该可以... @PrfctByDsgn 我想要类似的东西; ekgmaaleidParam.Value= TheValueILoadedFromLoadCmd + 1;我不知道如何从命令 LoadCmd 中提取该值。 尝试:int id = (int)LoadCmd.ExecuteScalar(); 【参考方案1】:

执行此操作的正确方法是创建具有identity 列的表;那么数据库会为你生成这个值。身份值插入之前的值可通过SCOPE_IDENTITY()@@IDENTITY 获得(前者是首选 - 特别是如果有触发器;后者适用于更多数据库版本,但具有优势 -例)。

在多用户数据库上,这也避免了竞争条件问题(显然只有一个连接知道最近的插入)。您只需将insert 命令更改为不指定identity 列(数据库将提供此值;您不必这样做)。

【讨论】:

我尽量不要轻率;虽然我很欣赏你的回答,而且它可能是正确的,但很遗憾我不能使用它——因为我不允许再写任何专栏。 (这是一个作业) 您不必再添加任何列,只需将 ekgmaaleid 的 Identity Specification 设置为 Yes,前提是它是整数或 UUID 类型。正如 Marc 所说,尝试以这种方式自己设置此值意味着您的应用程序不是多用户安全的。顺便说一句,有一个比 SCOPE_IDENTITY & @@IDENTITY 更好的选择,那就是使用插入语句的 OUTPUT 子句。如 INSERT INTO ... OUTPUT INSERTED.ekgmaaleid VALUES....

以上是关于从 SQL 获取列中的最后一个单元格的主要内容,如果未能解决你的问题,请参考以下文章

Google表格中的查询功能-根据另一列获取一列中的非空最后一个单元格

选择从第一个单元格到列中使用的最后一个单元格的范围

根据单元格值合并范围内的单元格,但最后一个单元格没有被合并

在列中查找值,填充'直到非空白单元格

应用公式,然后自动填充数据,直到列中的最后一个可见单元格:VBA

Pandas 用 NaN 值填充列中的单元格,从行中的其他单元格中获取值