首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server INFORMATION_SCHEMA报告的浮动精度与ADO.NET GetSchemaTable()不同?

Server INFORMATION_SCHEMA报告的浮动精度与ADO.NET GetSchemaTable()不同?
EN

Stack Overflow用户
提问于 2019-08-28 17:25:38
回答 1查看 32关注 0票数 0

对于声明为float的Server列,INFORMATION_SCHEMA报告的数值精度为53,而ADO.NET SqlDataReader.GetSchemaTable()方法报告15。这种明显差异的原因是什么?

下面是VB中的一个最小代码示例:

代码语言:javascript
复制
Private Sub MinimalCodeExample(conn As DbConnection)
  Try
    CreateTestTable(conn)
    Dim precisionFromInformationSchema As Integer =
      GetPrecisionFromInformationSchema(conn) ' 53
    Dim precisionFromADONETSchemaTable As Integer =
      GetPrecisionFromADONETSchemaTable(conn) ' 15

    ' Why does this assertion fail, 53 <> 15?
    Debug.Assert(precisionFromInformationSchema = precisionFromADONETSchemaTable)
  Finally
    CleanUpTestTable(conn)
  End Try
End Sub

Private Sub CreateTestTable(conn As DbConnection)
  Dim cmd As DbCommand = conn.CreateCommand()
  cmd.CommandText = "CREATE TABLE STACKOVERFLOWEXAMPLE(value float)"
  cmd.ExecuteNonQuery()
End Sub

Private Function GetPrecisionFromInformationSchema(conn As DbConnection) As Integer
  Using cmd As DbCommand = conn.CreateCommand()
    cmd.CommandText = "SELECT NUMERIC_PRECISION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='STACKOVERFLOWEXAMPLE'"
    Return CInt(cmd.ExecuteScalar())
  End Using
End Function

Private Function GetPrecisionFromADONETSchemaTable(conn As DbConnection) As Integer
  Using cmd As DbCommand = conn.CreateCommand()
    cmd.CommandText = "SELECT value FROM STACKOVERFLOWEXAMPLE"
    Using reader As DbDataReader = cmd.ExecuteReader(CommandBehavior.SchemaOnly Or CommandBehavior.KeyInfo)
      Using dt As DataTable = reader.GetSchemaTable()
        Return CInt(dt.Select("ColumnName='value'").Single()("NumericPrecision"))
      End Using
    End Using
  End Using
End Function

Private Sub CleanUpTestTable(conn As DbConnection)
  Using cmd As DbCommand = conn.CreateCommand()
    cmd.CommandText = "DROP TABLE STACKOVERFLOWEXAMPLE"
    cmd.ExecuteNonQuery()
  End Using
End Sub
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-28 17:37:41

基本上,53在bits,15在digits

浮点数(n)其中n是用科学表示法存储浮点数的尾数的位数,因此,它决定了精度和存储大小。如果指定了n,则它必须是介于1和53之间的值。默认值n为53。

浮动和真实(TSQL)

在ADO.NET中,所有数字数据类型的"NumericPrecision“表示数据类型可以存储的十进制数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57697356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档