- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有名为tbl_invent的表的sqlite DB,在窗体加载时,它用表中的内容填充了datagridview。问题是我有字段名cost和sell_price,它们的字段都带有小数点,并且在加载表格时它仅显示数字而不是小数。
样品:
表格= 1.75,DGV = 1.00
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
connect()
Dim da As New SQLiteDataAdapter("select * from tbl_Invent", connection)
Dim ds As New DataSet
da.Fill(ds, "tbl_Invent")
DataGridView1.DataSource = ds
DataGridView1.DataMember = "tbl_Invent"
DataGridView1.Columns(6).ValueType = GetType(Single)
DataGridView1.Columns(6).DefaultCellStyle.Format = "N2"
DataGridView1.Columns(7).ValueType = GetType(Single)
DataGridView1.Columns(7).DefaultCellStyle.Format = "N2"
connection.Close()
da.Dispose()
End Sub
最佳答案
您没有指出正在使用的数据库提供程序,但是标准提供程序(来自SQLite开发人员)将看到Integer
并将数据映射到不允许小数的NET Int32
类型。 Real
将保存小数,与Decimal
相同。there is no other type in SQLite. there is only "Text", "Integer", "Real" and "Blob"
是的,但这适用于SQLite数据库,而不适用于数据库提供程序。标准的DB Provider巧妙地编写为能够将4种基本类型转换为各种NET类型,从而使实际的存储类型/格式成为实现细节。
提供者代码包括许多步骤,查找表,子系统,字典和执行转换的方法。甚至还有一种定义自定义类型名称的方法。以下是工作原理的一般说明。
SQLite NET Provider识别的列类型名称
字节,字节
INT8,INTEGER8,TINYSINT(字节)
UINT8,UNSIGNEDINTEGER8,TINYINT(字节)
整数(短,长,有符号,无符号等)
BIGINT,BIGUINT,COUNTER,IDENTITY,INT,INT16,INT32,INT64,INTEGER,INTEGER16,INTEGER32,INTEGER64,LONG,SMALLINT,SMALLUINT,UINT,UINT16,UINT32,UINT64,ULONG,UNSIGNEDINTEGER,UNSIGNEDINTEGEREGER16,UN64EDINTEDEGEREGER16,UN64
布尔型
BIT,布尔,布尔,逻辑,是
文字/字串
CHAR,CLOB,LONGCHAR,LONGTEXT,LONGVARCHAR,MEMO,NCHAR,NOTE,NTEXT,NVARCHAR,STRING,TEXT,VARCHAR,VARCHAR2
数字
双重,浮动,真实;单(单)
小数
货币,十进制,货币,数字,数字
BLOB
二进制,BLOB,常规,图像,OLEOBJECT,RAW,VARBINARY
约会时间
DATE,DATETIME,SMALLDATE,TIME,TIMESTAMP
图形用户界面
GUID,唯一身份验证者
来源:SQLiteDbTypeMap
中的SQLiteConvert.cs
(版本1.0.103; 2016年9月)。
本质上,DBProvider以适当的SQLite类型存储数据,但在回读它时,它将使用表定义中使用的类型将数据转换回NET类型。 SQLite提供程序包括一个大型SQLiteConvert
类,可以为您完成所有转换。
尽管对于SQLite奉献者来说这似乎是常识,但我找不到狂野记载的文档。大多数站点只是重新格式化SQLite网站内容。它可能记录在帮助文件中,但是我的主题没有内容。根据列表,很容易意外使用有效名称并发现其有效。
该列表合并了其他DB使用的最常见的符号,以及一些NET类型。例如,可以将Boolean
定义为BIT, BOOL, BOOLEAN, LOGICAL or YESNO
。因此,此表定义是合法的并且具有完整功能:
CREATE TABLE LiteColTypes (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT,
ItemDate DATETIME,
Char3 CHAR (3),
UINT32 UINT32,
Value INT16,
VarChar5 VARCHAR (5),
GCode GUID,
Price DECIMAL,
ItemImg IMAGE,
Active BOOL,
NotActive YESNO
);
DateTime
选项。
/// <summary>
/// Builds and returns a map containing the database column types
/// recognized by this provider.
/// </summary>
/// <returns>
/// A map containing the database column types recognized by this
/// provider.
/// </returns>
private static SQLiteDbTypeMap GetSQLiteDbTypeMap()
{
return new SQLiteDbTypeMap(new SQLiteDbTypeMapping[] {
new SQLiteDbTypeMapping("BIGINT", DbType.Int64, false),
new SQLiteDbTypeMapping("BINARY", DbType.Binary, false),
new SQLiteDbTypeMapping("BIT", DbType.Boolean, true),
new SQLiteDbTypeMapping("BLOB", DbType.Binary, true),
new SQLiteDbTypeMapping("BOOL", DbType.Boolean, false),
new SQLiteDbTypeMapping("BOOLEAN", DbType.Boolean, false),
...
new SQLiteDbTypeMapping("GUID", DbType.Guid, false),
new SQLiteDbTypeMapping("IMAGE", DbType.Binary, false)
... (many more)
DbType
对于该过程至关重要。
SQLiteDbTypeMap
将它识别的许多许多列名称与
DbType
关联,该列用于确定要返回的NET数据类型。该列表足够全面,可以为您转换除1或2种类型之外的所有类型。
GUID
和
IMAG
*都存储为
BLOB
,但是
GUID
类型名称与不同的
DbType
关联,这使得BLOB的返回不同于
IMAGE
BLOB的返回。 。
DbType
来查找要使用的SQLite类型(“相似性”)。如果使用
AddWithValue
或(过时的)
Add(object, object)
重载,则DBProvider会猜测该类型。猜测,但是不要那样做。
cmd.Parameters.Add("@g", DbType.Binary).Value = myGuid.ToByteArray();
' // add trailing semicolons for c#
cmd.Parameters.Add("@n", DbType.String).Value = "Ziggy"
cmd.Parameters.Add("@dt", DbType.DateTime).Value = DateTime.Now
cmd.Parameters.Add("@c3", DbType.StringFixedLength, 3).Value = "XYZ123" '// see notes
cmd.Parameters.Add("@u", DbType.UInt16).Value = 3
cmd.Parameters.Add("@g", DbType.Guid).Value = myGuid
cmd.Parameters.Add("@p", DbType.Decimal).Value = 3.14D
'// 'ToByteArray()' is an extension method to convert
cmd.Parameters.Add("@img", DbType.Binary).Value = myImg.ToByteArray()
cmd.Parameters.Add("@act", DbType.Boolean).Value = True
DbType
描述传递的数据,而不是您认为应如何保存(例如
DbType.Guid
,而不是
Binary
表示
Guid
)。提供者将执行大多数转化。
DbType.Image
,因此需要字节数组转换。
Char()/VarChar()
字段指定大小不会限制保存的字符数。这似乎是一个错误,因为保存的字符数超过定义的字符数可能会阻止该行加载。
UInt16
的作用相反:尝试传递超出范围的值,例如UInt16的-5,将导致
Overflow Exception
。但是对于已存储的值,它将返回
65531
。
Decimal(9,2)
)似乎无关紧要。内部表提供固定的精度和大小。
DbType.DateTime
。永远都不需要传递特定格式的字符串。提供者知道事情。 (请参阅下面的DateTime选项。)
.Value = DateTime.Now.Date
。
DbType
,这就是为什么它很重要。使用正确的数据可确保数据可以往返。避免使用
AddWithValue
。
// Dim SQL = "SELECT * FROM LiteColTypes" ' for VB
string SQL = "SELECT * FROM LiteColTypes";
...
dbCon.Open();
Dim dt As New DataTable();
dt.Load(cmd.ExecuteReader());
dgv.DataSource = dt;
DataColumn
的数据类型均符合预期:
Name ---> System.String (maxLen = 2147483647)
ItemDate ---> System.DateTime
Char3 ---> System.String (maxLen = 3)
UINT16 ---> System.UInt16
VarChar5 ---> System.String (maxLen = 5)
GCode ---> System.Guid
Price ---> System.Decimal
ItemImg ---> System.Byte[]
Active ---> System.Boolean
NotActive ---> System.Boolean
BLOB
,但返回的方式不同。活动(
BOOL
)和非活动(
YESNO
)使用不同的类型名称,但返回相同的数据类型。一切都按要求工作。
TIME
作为列类型名称不能按预期方式工作。它不会解析
DateTime.Now.TimeofDay
(
Timespan
)。该表将TIME映射到
DbType.DateTime
。
DbType.DateTime2
或
.DateTimeOffset
。这些在转换器查找中丢失,因此数据以无效格式(版本1.0.103.0)存储为文本。
Kind
始终返回为
Unspecified
。解决此问题的方法之一是将
datetimekind
添加到您的连接字符串中:
`...;datetimekind=Utc;`
`...;datetimekind=Local;`
Kind
值设置
DateTime
,但不转换该值。
BindDateTimeWithKind
连接标志。保存时,它将转换日期以匹配连接的
DateTimeKind
:
Private LiteConnStr = "Data Source='C:\Temp\demo.db';Version=3;DateTimeKind=Utc;"
...
Dim dt As New DateTime(2011, 2, 11, 11, 22, 33, 444, DateTimeKind.Local)
Using dbCon = New SQLiteConnection(LiteConnStr)
dbCon.Flags = SQLiteConnectionFlags.Default Or
SQLiteConnectionFlags.BindDateTimeWithKind
...
cmd.Parameters.Add("@dt", DbType.DateTime).Value = dt
' == 2011-02-11 17:22:33.444Z note the hour
BindDateTimeWithKind
会将其保存为UTC以匹配连接。由于“ DateTimeKind = Utc;”而返回UTC日期。连接设置。
DateTimeKind
用于读取的日期,而
BindDateTimeWithKind
在保存日期时起作用。个别而言,它们似乎会使情况更糟。整个数据库一起成为基于UTC(或本地)的日期,日期统一保存并读取为同一
Kind
-您无需执行任何操作。
ConnectionFlags
手动操作很麻烦,要在连接字符串中指定它们:
connx = "...;datetimekind=Utc;flags='Default, BindDateTimeWithKind';"
Kind
处理对于
DbDataReader
至少适用于Dapper。但是,当使用
DataTable
时,日期的
Kind
仍未指定。显然,这是由于
DateTimeMode
中的
DataColumn
属性引起的,并且可能是Microsoft的一项设计决策,即不假定列中的所有日期始终都是相同的
Kind
。这也体现在其他数据库中。
DataTable
中读取并“伪装”为未指定的UTC日期不会在更新中再次转换。
Kind
相关选项可能非常有用。要启用Ticks,请使用
DateTimeFormat
连接字符串选项:
Private LiteConnStr = "...;datetimekind=Utc;DateTimeFormat=Ticks;..."
'e.g: 634939900800000000
DateTimeFormat
选项包括CurrentCulture,ISO8601(默认设置),JulianDay和UnixEpoch。无需更改列类型名称即可使用这些格式之一。现在仍然是日期,SQLite Provider根据连接标志处理实现细节。
DBType
关联,该
DbType
确定实际的返回数据类型
DateTimeKind
可确保数据往返
BindDateTimeWithKind
和
关于vb.net - SQLite不能正确存储小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44298684/
我有几个问题。我是 Visual Basic 这个领域的新手,所以不要取笑我。 1.) VB.NET之间有什么区别和 VB ? 2.) 我需要为 Windows 开发基本的应用程序。(如记事本)我应该
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是框架 3.5 的新手。我注意到,在创建 Web 内容表单时,除了 aspx.vb 页面之外,它还会创建一个 aspx.designer.vb 页面。谁能向我解释一下它们之间的区别以及它们的用途吗?
我只是想知道 VB.NET 和 VB 2010 是否相同。 我只是想知道。 最佳答案 VB 2010 是 VB.Net 的最新版本。 Microsoft 在 VB 2005 版本中删除了 VB 的“.
我是框架 3.5 的新手。我注意到,在创建 Web 内容表单时,除了 aspx.vb 页面之外,它还会创建一个 aspx.designer.vb 页面。谁能向我解释一下它们之间的区别以及它们的用途吗?
我正在尝试将 VB 函数移植到 VB.NET,但我无法使该函数正常工作并正确更新。 rFormat = Format(Format(Value, fmt), String$(Len(fmt), "@"
如何在VB中注释多行代码/代码块? 最佳答案 VB 在语言级别上没有这样的构造。它有使用撇号字符的单行注释: ' hello world ' this is a comment Rem this is
我正在使用我在 VB2005 中创建的表单在按下按钮时打开程序,然后在文本字段中显示进程 ID(再次按下按钮时)。当我运行它时,表单将打开程序 (Notepad.exe) 但当我单击按钮查看进程 ID
我正在尝试添加一个从 vb.net 创建的 dll,并且想将其导入到现有的 vb 6 项目中,但它给了我错误“无法添加对指定文件的引用”。 。有人知道如何解决这个问题吗? 最佳答案 需要遵循以下步骤:
我有一个数据 GridView 。右键单击它会显示一个上下文菜单,但它始终位于右上角。我想要它,以便菜单出现在用户右键单击的单元格上。它可能是单元格 1 或单元格 2 或其他。 谢谢福尔坎 最佳答案
我只是在 Visual Studio 2010 中使用 Visual Basic。有人知道我将如何制作“浏览文件夹(或文件)”按钮吗?我对 VB 真的很陌生,我只是在寻找一些简单的帮助:) 最佳答案
这次感到困惑... 最简单的代码行有时可能起作用,有时却没有。首先,我认为问题在于我试图读取DWORD的值,但是由于我可以从某些键读取DWORD值,所以这一定不是问题。现在的问题似乎是,如果 key
我的代码中有此方法: Private Sub Display() Received.AppendText(" - " & RXArray) End Sub 这两个调用之间有什么区别:
我正在创建一个宏程序来记录和回放鼠标和键盘输入。录制效果很好,鼠标播放也一样,但是我在播放键盘输入时遇到了麻烦——特别是在释放之前按住一个键几秒钟。这不等同于重复按键。这是我尝试过的: 技巧 1:Me
我最近刚刚了解了 VB.NET 中静态局部变量的使用,并想知道它在延迟加载属性中的潜在用途。 考虑以下示例代码。 Public Class Foo Implements IFoo End Clas
VB 有一个 C# 没有的特性,在项目级别导入命名空间(我的项目>引用>导入命名空间)。当新人在源代码控制之外检查项目时,我们的自定义导入不包括在内。这个 VB 特定的导入命名空间存储在哪里? 最佳答
我已将我的问题缩小到这个简单的案例,但似乎无法找到发生了什么: 我有两个表单,一个只有一个按钮,另一个是空的。 单击按钮时,form1 隐藏和显示 form2 出现时,form2隐藏,form1再次显
为什么下面的简单代码会失败?无论我使用 LinearGradientMode 的哪个值,这段代码总是用从左到右的渐变填充路径。 graphPath 是在别处创建的 GraphicPath 对象(基本上
我可以多快替换字符串中的字符? 所以这个问题的背景是这样的:我们有几个应用程序通过套接字相互通信并与客户端的应用程序通信。这些套接字消息包含不可打印的字符(例如 chr(0)),需要用预定的字符串(例
如何从任何文件中读取原始字节数组... Dim bytes() as Byte ..然后将该字节数组写回新文件? 我需要它作为一个字节数组来做一些处理。 我目前正在使用: 阅读 Dim fInfo
我是一名优秀的程序员,十分优秀!