我有一个表,每行需要一个时间戳来标记插入的时间.我没有很多数据库经验,但有些东西告诉我,这最好在数据库端自动处理,例如通过存储过程.
在MS SQL中有一个timestamp数据类型,但是阅读它,它被视为一系列数字而不是C#中的DateTime对象.所以如果我不得不进行转换,那么它不能只是一个NVARCHAR数据类型吗?
所以简单地说,当插入到表中时,什么是最简单的方法(自动?)将时间戳放在一行上?
编辑:表定义非常简单.它目前只有两列,但仍缺少时间戳列.
SqlCommand command = con.CreateCommand();
command.CommandText = "INSERT INTO Bio VALUES (" +
"@ID, @Name)";
command.Parameters.AddWithValue("ID",number);
command.Parameters.AddWithValue("Name", name);
try
{
SqlDataReader thisReader = command.ExecuteReader();
thisReader.Close();
}
catch { // Do something };
Run Code Online (Sandbox Code Playgroud)
解决方案好的,它现在有效.我首先尝试通过Visual Studio 2008中的"服务器资源管理器"窗口添加新列.找到我的数据库,右键单击并选择"新建查询".然后键入类似的东西
ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate())
Run Code Online (Sandbox Code Playgroud)
但我收到了消息
不支持ALTER TABLE SQL构造在图和标准窗格中无法以图形方式表示查询.
所以我用图形方式添加了它.首先"打开表定义"并在"数据类型"下的"列名称"和"日期时间"下添加CreatedDate.删除允许空值检查.然后在我添加的列属性中
getutcdate()
Run Code Online (Sandbox Code Playgroud)
在"默认值或绑定"行中的"常规"部分下.每当插入新行时,数据库会自动将当前日期和时间作为时间戳.
在表中创建一个CreatedDate列创建如下:
ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate())
Run Code Online (Sandbox Code Playgroud)
编辑:如果之后您希望在每次更新该记录时更新值,您可以将GetUtcDate()重新分配给该列或另一个(我称之为Createddate,因此不应在更新中使用,但您可以添加另一个一个或重命名为Modifieddate).我肯定会在存储过程中包含此类列的更新,而UPDATE这里不需要触发器.
SQL Server"timestamp"类型与标准"timestamp"不同:它更准确地说是"rowversion".不推荐使用数据类型"timestamp".有关所有这些,请参阅MSDN
最简单的方法是在表上使用GETDATE或GETUTCDATE对DEFAULT进行DEFAULT,以便SQL Server自动维护它
编辑:更新
您可以使用此语法进行更新
UPDATE T SET col = @x, UpdatedDateTime = DEFAULT WHERE ...
Run Code Online (Sandbox Code Playgroud)
这很有用,因为默认约束确定的值不是代码.因此,如果您更改默认值(例如,从GETDATE切换到GETUTCDATE),则更改约束,而不是代码
| 归档时间: |
|
| 查看次数: |
8946 次 |
| 最近记录: |