vb.net - 位数据类型返回 -1
问题描述
我正在使用 Visual Studio 2010 中的 Web 应用程序。我正在使用 SQL Server 2008 写入和读取数据库表。
我有一个数据库表,myTable
其中有一列myColumn
datatype bit
。我在网络应用程序上写信给这个专栏,如下所示:
UPDATE myTable
SET myColumn = 1
这很好用,并且使用 SQL Server Management Studio,我可以看到该列已更新为TRUE,正如我所期望的那样。
在我的网络应用程序的另一部分,我像这样查询表:
sqlCmd.CommandText = "SELECT myColumn FROM myTable"
sqlRdr = sqlCmd.ExecuteReader()
While sqlRdr.Read
myColumn = sqlRdr(0)
End While
当我运行此查询时,myColumn
设置为 -1。这是怎么发生的?根据微软文档有点是
可以取值 1、0 或 NULL 的整数数据类型。
和
字符串值 TRUE 和 FALSE 可以转换为位值:TRUE 转换为 1,FALSE 转换为 0。
我不明白我是如何myColumn = -1
从这个查询中得到的。
解决方案
当你得到一bit
列的数据时,你实际上得到的是一个 32 位的数字,而不仅仅是一个位。在该 32 位数字中,每个位都设置为 1 或每个位设置为 0。当转换为Integer
使用二进制补码时,值 11111111 11111111 11111111 11111111 为 -1,因为第一位是符号位。
问题是你不应该Integer
在你的 VB 代码中使用。您应该使用 1 或 0 来表示此数据的唯一时间是 SQL 代码中的文字值。在您的 VB 代码中,您应该使用Boolean
来表示此数据,因为这就是数据。1 代表True
,0 代表False
,如果您在 SQL Server Management Studio 中查看数据,您会看到。
这意味着这里:
sqlCmd.CommandText = "SELECT myColumn FROM myTable"
sqlRdr = sqlCmd.ExecuteReader()
While sqlRdr.Read
myColumn = sqlRdr(0)
End While
该myColumn
变量应该是 type Boolean
。无论如何,该代码根本不应该编译,因为它需要Option Strict Off
并且您几乎应该始终拥有Option Strict On
. 您不应该将从数据读取器获得的引用分配给类型为或Object
的变量。您应该使用数据阅读器来获取实际类型的数据。如果你真的得到一个:Integer
Boolean
Integer
myColumn = sqlRdr.GetInt32(0)
但是,因为您将正确执行并使用Boolean
:
myColumn = sqlRdr.GetBoolean(0)
如果您想保存数据,那么您通常会使用参数,例如
sqlCmd.CommandText = "UPDATE myTable SET myColumn = @myColumn"
sqlCmd.Parameters.Add("@myColumn", SqlDbType.Bit).Value = True
sqlCmd.ExecuteNonQuery()
推荐阅读
- c++ - 禁止转换为父级,但公开父级接口(设计问题)
- python - Python 计时器线程作为类变量从不同的类实例调用 timer.start() 和 timer.cancel()
- arrays - 如何将字节数组进一步转换为图像,请参阅问题
- javascript - MongoDB aggregate, unwind, group (same array)?
- docker - Unable to host chefserver on UI
- ios - Remote notifications not working as expected
- c++ - 在考虑对齐要求时一般重载 operator new
- delphi - Delphi tethering ResourceReceived 无法更新 TLabel
- ios - iOS - 打开错误的应用程序时出现奇怪的 openURL 问题
- java - How to summarize a object type in swagger?