首页 > 解决方案 > 位数据类型返回 -1

问题描述

我正在使用 Visual Studio 2010 中的 Web 应用程序。我正在使用 SQL Server 2008 写入和读取数据库表。

我有一个数据库表,myTable其中有一列myColumndatatype 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从这个查询中得到的。

标签: vb.netsql-server-2008sqldatatypes

解决方案


当你得到一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的变量。您应该使用数据阅读器来获取实际类型的数据。如果你真的得到一个:IntegerBooleanInteger

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()

推荐阅读