对于声明为float的Server列,INFORMATION_SCHEMA报告的数值精度为53,而ADO.NET SqlDataReader.GetSchemaTable()方法报告15。这种明显差异的原因是什么?
下面是VB中的一个最小代码示例:
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发布于 2019-08-28 17:37:41
基本上,53在bits,15在digits。
浮点数(n)其中n是用科学表示法存储浮点数的尾数的位数,因此,它决定了精度和存储大小。如果指定了n,则它必须是介于1和53之间的值。默认值n为53。
在ADO.NET中,所有数字数据类型的"NumericPrecision“表示数据类型可以存储的十进制数。
https://stackoverflow.com/questions/57697356
复制相似问题