【问题标题】:How to specify field data type when reading from a SQL database从 SQL 数据库读取时如何指定字段数据类型
【发布时间】:2016-03-17 17:21:57
【问题描述】:

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

sqlFetch(channel=myconn, sqtable="Customers", stringsAsFactors=FALSE)

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

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

【问题讨论】:

    标签: sql r rodbc


    【解决方案1】:

    您可以使用as.is 参数更全面地控制列的类型,该参数记录在?sqlFetch 的详细信息部分以及?sqlQuery?sqlGetResults 的链接文档中。

    基本上,它要么是一个逻辑向量,要么是一个数字或字符索引向量,指定哪些列保持不变。该载体将根据需要回收。

    (请注意,RODBC 将使用 type.convert 破坏存储在数据库中的列即使 C API 正确返回 char 或 varchar 作为数据库中列的数据类型。维护者没有在过去的一年里,我回复了关于这个问题的 4-5 封电子邮件中的任何一封,从那以后我就简单地使用了带有所需 one line modification 的 RODBC 的分叉版本。)

    【讨论】:

    • 4-5 封电子邮件?我想我在第二次之后就放弃了;)
    • @Ben 好吧,大约一半是给 r-sig-db,另一半是专门给维护者的。 :)
    【解决方案2】:

    您可以尝试指定查询字符串,如果仍有问题,您甚至可以强制转换字段。

    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
    

    【讨论】:

    • 我认为语言错误。
    • 肯定是错误的语言。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多