我有一个名为“Customers”的SQL表。在它是CustomerNumber字段,其值类似于“0001234567”,即它们仅由数字组成,但有些包括前导0。所以,当我尝试运行类似
的东西时sqlFetch(channel=myconn, sqtable="Customers", stringsAsFactors=FALSE)
它返回我的customers表,其中CustomerNumber字段是数字(而不是字符),因此我丢失了所有那些前导0。
有没有办法可以为列或替代解决方案指定字段类型,而不会截断我所有的前导0?
答案 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