从 SQL 数据库读取时如何指定字段数据类型
How to specify field data type when reading from a SQL database
我有一个 SQL table 叫 "Customers"。其中有一个 CustomerNumber 字段,其值类似于“0001234567”,即它们仅由数字组成,但有些包含前导 0。所以,当我尝试 运行 类似
的东西时
sqlFetch(channel=myconn, sqtable="Customers", stringsAsFactors=FALSE)
它 returns 我的客户 table 其中 CustomerNumber 字段是数字(而不是字符),因此我丢失了所有前导 0。
有没有一种方法可以指定列的字段类型或不会运行包含所有前导 0 的替代解决方案?
您可以尝试指定一个查询字符串,如果您仍然遇到问题,您甚至可以转换该字段。
Sub Main()
Dim myConn As String = System.Configuration.ConfigurationSettings.AppSettings.Get("ConnStr")
Dim sqlConnection As SqlConnection = New SqlConnection(myConn)
Dim strSQL As String = "select cast(CustomerNumber as varchar(30)) as CustomerNumber_varchar, * from Customers"
Dim myds As DataSet
sqlConnection.Open()
Dim cmd As SqlCommand = New SqlCommand(strSQL, sqlConnection)
cmd.CommandTimeout = 60
Dim myReader As SqlDataReader = cmd.ExecuteReader()
myds = ConvertDataReaderToDataSet(myReader)
myReader.Close()
End Sub
Public Function ConvertDataReaderToDataSet(ByVal reader As SqlDataReader) As DataSet
Dim dataSet As DataSet = New DataSet()
Dim schemaTable As DataTable = reader.GetSchemaTable()
Dim dataTable As DataTable = New DataTable()
Dim intCounter As Integer
For intCounter = 0 To schemaTable.Rows.Count - 1
Dim dataRow As DataRow = schemaTable.Rows(intCounter)
Dim columnName As String = CType(dataRow("ColumnName"), String)
Dim column As DataColumn = New DataColumn(columnName, _
CType(dataRow("DataType"), Type))
dataTable.Columns.Add(column)
Next
dataSet.Tables.Add(dataTable)
While reader.Read()
Dim dataRow As DataRow = dataTable.NewRow()
For intCounter = 0 To reader.FieldCount - 1
dataRow(intCounter) = reader.GetValue(intCounter)
Next
dataTable.Rows.Add(dataRow)
End While
Return dataSet
End Function
您可以使用 as.is
参数更全面地控制列的类型,该参数在 ?sqlFetch
的详细信息部分以及 ?sqlQuery
的链接文档和?sqlGetResults
.
基本上,它要么是逻辑向量,要么是数字或字符索引的向量,指定哪些列保持不变。该载体将根据需要回收。
(请注意,即使 C API 正确 returns char 或 varchar,RODBC 也会破坏存储在数据库中的列 type.convert
作为数据库中列的数据类型。在过去的一年里,维护者没有回复我关于这个问题的 4-5 封电子邮件中的任何一封,此后我只是简单地使用了具有所需 one line modification从此以后。)
我有一个 SQL table 叫 "Customers"。其中有一个 CustomerNumber 字段,其值类似于“0001234567”,即它们仅由数字组成,但有些包含前导 0。所以,当我尝试 运行 类似
的东西时sqlFetch(channel=myconn, sqtable="Customers", stringsAsFactors=FALSE)
它 returns 我的客户 table 其中 CustomerNumber 字段是数字(而不是字符),因此我丢失了所有前导 0。
有没有一种方法可以指定列的字段类型或不会运行包含所有前导 0 的替代解决方案?
您可以尝试指定一个查询字符串,如果您仍然遇到问题,您甚至可以转换该字段。
Sub Main()
Dim myConn As String = System.Configuration.ConfigurationSettings.AppSettings.Get("ConnStr")
Dim sqlConnection As SqlConnection = New SqlConnection(myConn)
Dim strSQL As String = "select cast(CustomerNumber as varchar(30)) as CustomerNumber_varchar, * from Customers"
Dim myds As DataSet
sqlConnection.Open()
Dim cmd As SqlCommand = New SqlCommand(strSQL, sqlConnection)
cmd.CommandTimeout = 60
Dim myReader As SqlDataReader = cmd.ExecuteReader()
myds = ConvertDataReaderToDataSet(myReader)
myReader.Close()
End Sub
Public Function ConvertDataReaderToDataSet(ByVal reader As SqlDataReader) As DataSet
Dim dataSet As DataSet = New DataSet()
Dim schemaTable As DataTable = reader.GetSchemaTable()
Dim dataTable As DataTable = New DataTable()
Dim intCounter As Integer
For intCounter = 0 To schemaTable.Rows.Count - 1
Dim dataRow As DataRow = schemaTable.Rows(intCounter)
Dim columnName As String = CType(dataRow("ColumnName"), String)
Dim column As DataColumn = New DataColumn(columnName, _
CType(dataRow("DataType"), Type))
dataTable.Columns.Add(column)
Next
dataSet.Tables.Add(dataTable)
While reader.Read()
Dim dataRow As DataRow = dataTable.NewRow()
For intCounter = 0 To reader.FieldCount - 1
dataRow(intCounter) = reader.GetValue(intCounter)
Next
dataTable.Rows.Add(dataRow)
End While
Return dataSet
End Function
您可以使用 as.is
参数更全面地控制列的类型,该参数在 ?sqlFetch
的详细信息部分以及 ?sqlQuery
的链接文档和?sqlGetResults
.
基本上,它要么是逻辑向量,要么是数字或字符索引的向量,指定哪些列保持不变。该载体将根据需要回收。
(请注意,即使 C API 正确 returns char 或 varchar,RODBC 也会破坏存储在数据库中的列 type.convert
作为数据库中列的数据类型。在过去的一年里,维护者没有回复我关于这个问题的 4-5 封电子邮件中的任何一封,此后我只是简单地使用了具有所需 one line modification从此以后。)