当数据是来自 sql 服务器数据库的时间戳类型时,“FastDatalistView”中是否存在错误?
Is there a bug in `FastDatalistView` when data is type timestamp from sql server db?
我正在使用 ObjectListView wrapper
,特别是 FastDatalistView
。使用 Visual Studio 可视化编辑器,我按如下方式配置了 FastDatalistView
。
AlternateRowBackColor = ControlLight
AutoGenerateColumns = True
Columns = {nothing} (Configured by the wrapper at runtime)
DataSource = None (Set in code at runtime)
FullRowSelect = True
GridLines = True
MultiSelect = False
OwnerDraw = True
ShowGroups = False
View = Details
请注意,我依赖包装器的 AutoGenerateColumns
功能来自动生成 header 列文本和方面名称,并且我指望包装器在没有我的代码的情况下将数据加载到列表中对它做任何事。为什么?因为我的 select 语句可以而且将由任何列 name/sql 服务器数据类型和 table 名称构成,可以在任何 sql 服务器 2014 数据库
中找到
我的代码的相关部分:
dataTable_X = new DataTable();
dataTable_X.Clear();
dataTable_X = dataAccessLayer.QueryDbGetRecords({arguments needed to construct select statement in QueryDbGetRecords});
if (dataTable_X.Rows.Count <= 0)
{
MessageBox.Show("The selected table has no records.", "XXXXXXX`", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
this.fastDataListViewTableKeys.DataSource = dataTable_X;
this.fastDataListViewTableKeys.RebuildColumns();
fastDataListViewTableKeys.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
fastDataListViewTableKeys.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
dataTable_X.Dispose();
- 有效的场景:
我执行select X from Y order by XXXXXXX
。 X
是 sql 服务器 2014 varchar(50)
类型。数据的一个例子是 9876-1234
。 select 语句将 406,000 行检索到数据 table 中。 FastDatalistView
显示数据成功。
- 另一种可行的方案:
我执行select X from Y order by XXXXXXX
。 X
是 sql 服务器 2014 int
类型。数据的一个例子是 36
。 select 语句将 20 行检索到数据 table 中。 FastDatalistView
显示数据成功。
- 失败的场景:
我执行select X from Y order by X
。 X
是 sql 服务器 2014 timestamp
类型。数据的一个例子是 0x0000000000F0F5DD
。 select 语句将 100,000 行检索到数据 table 中。 FastDatalistView
显示列标题。垂直滚动条和隔行背景色表示列表中有很多项,但没有显示数据。
我使用调试器检查了 fastDataListViewTableKeys
object。 fastDataListViewTableKeys.Columns.Results View[0].AspectName
是预期的 X
。我不确定我应该在 fastDataListViewTableKeys
中的哪个位置查看列表数据
是否 FastDatalistView
无法将 sql 服务器 timestamp
数据转换为可显示版本,而 int
、varchar
,或者,大概是它检测到并字符串化的其他类型??
timestamp
是 rowversion 的已弃用同义词。它用于乐观并发,没有可显示的形式或用法。它与时间、连续值、唯一性或产生任何有意义的排序顺序无关。来自文档
Is a data type that exposes automatically generated, unique binary numbers within a database. rowversion is generally used as a mechanism for version-stamping table rows. The storage size is 8 bytes. The rowversion data type is just an incrementing number and does not preserve a date or a time. To record a date or time, use a datetime2 data type.
唯一的保证是,如果一行被修改,rowversion
值将自动设置为大于先前值的值。如果同时修改多行,服务器可能会决定批量生成新值。
只需不要将其添加到网格中。如果您想要 high-resolution 日期时间类型,请使用具有您想要的精度的 datetime2`。
rowversion
也不能用于 检测 和检索更改的记录,方法是检索 rowversion
值高于某个存储值的行。为此,请使用所有 SQL 服务器版本和版本
中可用的 Change Tracking
我正在使用 ObjectListView wrapper
,特别是 FastDatalistView
。使用 Visual Studio 可视化编辑器,我按如下方式配置了 FastDatalistView
。
AlternateRowBackColor = ControlLight
AutoGenerateColumns = True
Columns = {nothing} (Configured by the wrapper at runtime)
DataSource = None (Set in code at runtime)
FullRowSelect = True
GridLines = True
MultiSelect = False
OwnerDraw = True
ShowGroups = False
View = Details
请注意,我依赖包装器的 AutoGenerateColumns
功能来自动生成 header 列文本和方面名称,并且我指望包装器在没有我的代码的情况下将数据加载到列表中对它做任何事。为什么?因为我的 select 语句可以而且将由任何列 name/sql 服务器数据类型和 table 名称构成,可以在任何 sql 服务器 2014 数据库
我的代码的相关部分:
dataTable_X = new DataTable();
dataTable_X.Clear();
dataTable_X = dataAccessLayer.QueryDbGetRecords({arguments needed to construct select statement in QueryDbGetRecords});
if (dataTable_X.Rows.Count <= 0)
{
MessageBox.Show("The selected table has no records.", "XXXXXXX`", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
this.fastDataListViewTableKeys.DataSource = dataTable_X;
this.fastDataListViewTableKeys.RebuildColumns();
fastDataListViewTableKeys.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
fastDataListViewTableKeys.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
dataTable_X.Dispose();
- 有效的场景:
我执行select X from Y order by XXXXXXX
。 X
是 sql 服务器 2014 varchar(50)
类型。数据的一个例子是 9876-1234
。 select 语句将 406,000 行检索到数据 table 中。 FastDatalistView
显示数据成功。
- 另一种可行的方案:
我执行select X from Y order by XXXXXXX
。 X
是 sql 服务器 2014 int
类型。数据的一个例子是 36
。 select 语句将 20 行检索到数据 table 中。 FastDatalistView
显示数据成功。
- 失败的场景:
我执行select X from Y order by X
。 X
是 sql 服务器 2014 timestamp
类型。数据的一个例子是 0x0000000000F0F5DD
。 select 语句将 100,000 行检索到数据 table 中。 FastDatalistView
显示列标题。垂直滚动条和隔行背景色表示列表中有很多项,但没有显示数据。
我使用调试器检查了 fastDataListViewTableKeys
object。 fastDataListViewTableKeys.Columns.Results View[0].AspectName
是预期的 X
。我不确定我应该在 fastDataListViewTableKeys
中的哪个位置查看列表数据
是否 FastDatalistView
无法将 sql 服务器 timestamp
数据转换为可显示版本,而 int
、varchar
,或者,大概是它检测到并字符串化的其他类型??
timestamp
是 rowversion 的已弃用同义词。它用于乐观并发,没有可显示的形式或用法。它与时间、连续值、唯一性或产生任何有意义的排序顺序无关。来自文档
Is a data type that exposes automatically generated, unique binary numbers within a database. rowversion is generally used as a mechanism for version-stamping table rows. The storage size is 8 bytes. The rowversion data type is just an incrementing number and does not preserve a date or a time. To record a date or time, use a datetime2 data type.
唯一的保证是,如果一行被修改,rowversion
值将自动设置为大于先前值的值。如果同时修改多行,服务器可能会决定批量生成新值。
只需不要将其添加到网格中。如果您想要 high-resolution 日期时间类型,请使用具有您想要的精度的 datetime2`。
rowversion
也不能用于 检测 和检索更改的记录,方法是检索 rowversion
值高于某个存储值的行。为此,请使用所有 SQL 服务器版本和版本