2011-02-04 73 views
1

我正在使用Microsoft Excel驱动程序将Excel文档导入adodb.recordset,以便我可以删除重复的行并将其放入SQL Server数据库中。使用odbc excel驱动程序投射数据类型

第一列的值为192,13U,JJJ等,但由于某些原因查询会将其转换为双精度值,并且具有alpha值的任何行都将转换为Null。从我可以告诉这是因为多数类型是数字而不是文本。

我试着去铸造它,但得到了一个错误。

这里是我的功能:

Function Read_Excel(ByVal sFile As String) As ADODB.Recordset 
    On Error GoTo fix_err 
    Dim rs As ADODB.Recordset 
    rs = New ADODB.Recordset 
    Dim sconn As String 

    rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient 
    rs.CursorType = ADODB.CursorTypeEnum.adOpenKeyset 
    rs.LockType = ADODB.LockTypeEnum.adLockBatchOptimistic 

    sconn = "DRIVER=Microsoft Excel Driver (*.xls); ImportMixedTypes=Text; " & "DBQ=" & sFile & ";Extended Properties='Excel 8.0;HDR=No;IMEX=1';" 
    rs.Open("SELECT Code, Description FROM [sheet1$]", sconn) 
    tot += rs.RecordCount 
    rs.Close() 
    rs.Open("SELECT Distinct * FROM [sheet1$]", sconn) 
    Read_Excel = rs 
    rs = Nothing 
    Exit Function 
fix_err: 
    Debug.Print(Err.Description + " " + _ 
       Err.Source, vbCritical, "Import") 
    Err.Clear() 
End Function 

有没有办法轻松获得第一列的文字?

编辑:当我尝试"SELECT cast(RPOCode as varchar(10)), Description FROM [sheet1$]"我得到这个错误
“[微软] [ODBC Excel驱动程序]语法错误(缺少操作员)在查询表达式 '投(代码为varchar)' Microsoft OLE DB提供程序的ODBC。驱动程序“
我试着varchar,varchar(10)和文本作为铸造类型具有相同的结果。

+1

**你得到了什么**错误?!?!我们不是心灵读者 - 你需要让我们知道! – 2011-02-04 16:34:30

+0

“[Microsoft] [ODBC Excel驱动程序]在查询表达式'cast(Code as varchar)'中的语法错误(缺少运算符)'我试过varchar和text作为铸造类型。 – AndyD273 2011-02-04 16:48:23

回答

4

尝试:

rs.Open("SELECT CStr([Code]), Description FROM [sheet1$]", sconn) 

演员是不是在喷气/ ACE SQL可用。

0

我结束了尝试ACE连接字符串,而不是一个用于Microsoft Excel驱动程序。

sconn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & sFile & ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";" 

并确保IMEX = 1部分在那里。我不认为Microsoft Excel驱动程序正确地使用扩展属性。