从 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从此以后。)