从SQL数据库读取时如何指定字段数据类型

时间:2015-12-11 17:51:17

标签: sql r rodbc

我有一个名为“Customers”的SQL表。在它是CustomerNumber字段,其值类似于“0001234567”,即它们仅由数字组成,但有些包括前导0。所以,当我尝试运行类似

的东西时
sqlFetch(channel=myconn, sqtable="Customers", stringsAsFactors=FALSE)

它返回我的customers表,其中CustomerNumber字段是数字(而不是字符),因此我丢失了所有那些前导0。

有没有办法可以为列或替代解决方案指定字段类型,而不会截断我所有的前导0?

2 个答案:

答案 0 :(得分:3)

您可以使用as.is参数更全面地控制列的类型,?sqlFetch的详细信息部分以及?sqlQuery和{{的链接文档中对此进行了说明1}}。

基本上,它是逻辑向量或数字或字符索引的向量,指定要保持不变的列。该矢量将根据需要进行回收。

(请注意,即使C API正确返回char或varchar 作为数据库中列的数据类型,RODBC也会使用?sqlGetResults 来破坏存储在数据库中的列。在过去的一年里,我在这个问题上的4-5封电子邮件都没有回复,从那时起我就一直使用RODBC的分叉版本和所需的one line modification。)

答案 1 :(得分:-1)

您可以尝试指定查询字符串,如果仍有问题,甚至可以投射该字段。

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