ID为GUID时如何从数据库中获取最新行
How to get the latest row from database when ID is GUID
我在尝试从 SQL 表中提取最新行时遇到了一些问题。用户可以填写费用表,ASP.NET 文本框中的数据会发送到数据库,但是当用户提交更多数据时,我无法提取最新数据并用该数据填充文本框。我使用 GUID 作为 ID 字段。我已将 userID
存储在 Session["New"]
中。
这是我的 SQL 声明:
string str = "select * from CashFlow where userID='" + Session["New"].ToString() + "'";
在您的数据库中创建一个名为 CreateDate
和 UpdateDate
的新列。
当您在 table 中进行 Insert 时,将 UpdateDate
和 CreateDate
设置为 DateTime.Now
。当您对 table 中的行进行 Update 时,只需将 UpdateDate
设置为 DateTime.Now
之后您将需要这样的查询,对于最后创建的:
select * from CashFlow order by CreateDate desc
最后更新
select * from CashFlow order by UpdateDate desc
数据库通常没有 "latest" 的概念,所以如果您的 table 不包含某种时间戳,您就无法真正获得最新记录。
修复 - 向记录添加某种时间戳字段,以便能够 "order by" 在该字段上。例如,您可以考虑添加 "autoincrement" 字段(您必须将其添加到 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());
听起来你把整个问题都搞反了。使用 GUID 的要点是 ID 是由用户(或本例中的应用程序)生成的。
鉴于GUID是由应用程序生成的,最后的ID与上次生成的ID相同。
因此,只需使用内存中的那个,而不是使用数据库查询您知道的东西。
尝试使用 NEWSEQUENTIALID() 生成您的 GUID,然后当 ID 为 GUID 时,您可以从数据库中获取最后一行。因为它创建的 GUID 大于自 Windows 启动以来指定计算机上此函数先前生成的任何 GUID。
这是例子。
CREATE TABLE myTable (ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID());
排序并检查用户名后,您可以select排在前 1 行
string str = "SELECT TOP 1 OrderNr FROM Orders Where CustomerName = 'Maria' ORDER BY OrderNr DESC;";
只需根据您的需要在字符串中进行一些调整,但这应该可以从客户那里获取最后一行。
insert into CashFlow (Column names)
OUTPUT inserted.userID
values
(inserted values in Column )
store Return value in variable For fetch Latest Record By userID
我在尝试从 SQL 表中提取最新行时遇到了一些问题。用户可以填写费用表,ASP.NET 文本框中的数据会发送到数据库,但是当用户提交更多数据时,我无法提取最新数据并用该数据填充文本框。我使用 GUID 作为 ID 字段。我已将 userID
存储在 Session["New"]
中。
这是我的 SQL 声明:
string str = "select * from CashFlow where userID='" + Session["New"].ToString() + "'";
在您的数据库中创建一个名为 CreateDate
和 UpdateDate
的新列。
当您在 table 中进行 Insert 时,将 UpdateDate
和 CreateDate
设置为 DateTime.Now
。当您对 table 中的行进行 Update 时,只需将 UpdateDate
设置为 DateTime.Now
之后您将需要这样的查询,对于最后创建的:
select * from CashFlow order by CreateDate desc
最后更新
select * from CashFlow order by UpdateDate desc
数据库通常没有 "latest" 的概念,所以如果您的 table 不包含某种时间戳,您就无法真正获得最新记录。
修复 - 向记录添加某种时间戳字段,以便能够 "order by" 在该字段上。例如,您可以考虑添加 "autoincrement" 字段(您必须将其添加到 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());
听起来你把整个问题都搞反了。使用 GUID 的要点是 ID 是由用户(或本例中的应用程序)生成的。
鉴于GUID是由应用程序生成的,最后的ID与上次生成的ID相同。
因此,只需使用内存中的那个,而不是使用数据库查询您知道的东西。
尝试使用 NEWSEQUENTIALID() 生成您的 GUID,然后当 ID 为 GUID 时,您可以从数据库中获取最后一行。因为它创建的 GUID 大于自 Windows 启动以来指定计算机上此函数先前生成的任何 GUID。
这是例子。 CREATE TABLE myTable (ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID());
排序并检查用户名后,您可以select排在前 1 行
string str = "SELECT TOP 1 OrderNr FROM Orders Where CustomerName = 'Maria' ORDER BY OrderNr DESC;";
只需根据您的需要在字符串中进行一些调整,但这应该可以从客户那里获取最后一行。
insert into CashFlow (Column names)
OUTPUT inserted.userID
values
(inserted values in Column )
store Return value in variable For fetch Latest Record By userID