【问题标题】:How to get the latest row from database when ID is GUIDID为GUID时如何从数据库中获取最新行
【发布时间】:2016-03-11 14:27:37
【问题描述】:

我在尝试从 SQL 表中提取最新行时遇到了一些问题。用户可以填写费用表格并将来自 ASP.NET 文本框的数据发送到数据库,但是当用户提交更多数据时,我无法提取最新数据并使用该数据填充文本框。我使用 GUID 作为 ID 字段。我已将userID 存储在Session["New"] 中。

这是我的 SQL 语句:

string str = "select * from CashFlow where userID='" + Session["New"].ToString() + "'"; 

【问题讨论】:

  • 您可以插入一个名为insert_date 的新列并将其设置为默认为CURRENT_TIMESTAMP
  • 发布您的代码和数据库中的几行
  • imageshack.com/i/pboHrQbpp imageshack.com/i/pbRUK27Lp 链接我的代码的屏幕截图,谢谢!
  • 我尝试在我的表中插入一个新列,但出现错误,它不允许我保存和应用更改 - 没关系它有效
  • 操作。您不是刚刚为新行创建了 GUID 吗?为什么不直接搜索呢?

标签: c# mysql asp.net sql-server guid


【解决方案1】:

在您的数据库中创建一个名为CreateDateUpdateDate 的新列。

当您在表格中插入时,将UpdateDateCreateDate 设置为DateTime.Now。当您对表中的行进行更新时,只需将UpdateDate 设置为DateTime.Now

之后,您将需要这样的查询,最后创建:

select * from CashFlow order by CreateDate desc

最后更新

select * from CashFlow order by UpdateDate desc

【讨论】:

  • 我尝试将日期时间写入数据库,但出现错误。这是我使用的代码:com.Parameters.AddWithValue("@date", DateTime.Now);我得到的错误是:无法将显式值插入时间戳列
  • @Tak 尝试使用 DATETIME 类型,至少这在 ms sql 中有效。
  • 谢谢,解决了这个问题。我现在可以把时间写到桌子上了。谢谢!
  • 好吧,DATETIME 类型修复有所帮助,我仍然在尝试修复负载情况
【解决方案2】:

尝试使用 NEWSEQUENTIALID() 生成您的 GUID,然后当 ID 为 GUID 时,您可以从数据库中获取最后一行。因为它创建的 GUID 大于自 Windows 启动以来此函数在指定计算机上先前生成的任何 GUID。

这是一个例子。 CREATE TABLE myTable (ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID());

【讨论】:

    【解决方案3】:

    数据库通常没有“最新”的概念,因此如果您的表不包含某种时间戳,您就无法真正获得最新记录。

    修复 - 在记录中添加某种时间戳字段,以便能够在该字段上“排序”。例如,您可以考虑添加“自动增量”字段(您必须将其添加到 PK - mysql auto-increment on a non-primary key)。


    附注 - 请使用参数化查询而不是使用字符串连接构造查询 - Parameterized Query for MySQL with C#

    近似样本(假设您有 TimeStamp 字段):

    var selectCommand = "SELECT * FROM CashFlow WHERE userID=@userId ORDER BY TimeStamp";
    var cmd = new MySqlCommand(readCommand);
    cmd.Parameters.AddWithValue("@userId", Session["New"].ToString());
    

    【讨论】:

      【解决方案4】:

      听起来你把整个问题都倒过来了。使用 GUID 的意义在于 ID 是由用户(或本例中的应用程序)生成的。

      鉴于 GUID 是由应用程序生成的,最后一个 ID 与上次生成的 ID 相同。

      因此,只需使用内存中的那个,而不是使用数据库查询来查询您知道的内容。

      【讨论】:

        【解决方案5】:

        您可以在排序和检查用户名后选择前 1 行

        string str = "SELECT TOP 1 OrderNr FROM Orders Where CustomerName = 'Maria' ORDER BY OrderNr DESC;";
        

        只需根据您的需要对字符串进行一些调整,但这应该可以从假设客户那里获得最后一行。

        【讨论】:

          【解决方案6】:
           insert into CashFlow (Column names)
                OUTPUT inserted.userID
              values
             (inserted values in Column )
          
               store Return value in variable For fetch Latest Record By userID
          

          【讨论】:

            猜你喜欢
            • 2016-08-26
            • 1970-01-01
            • 2010-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-31
            • 1970-01-01
            • 2013-09-02
            相关资源
            最近更新 更多