使用ACE OLEDB提供程序查询CSV时数据类型不匹配

时间:2017-04-27 17:25:50

标签: powershell oledbcommand

我正在尝试使用Microsoft ACE OLEDB提供程序查询CSV文件。当我在where子句中添加“ PrctBusy> 60 ”时,我收到错误“数据类型在条件表达式中不匹配。”我搜索了StackOverFlow并使用谷歌搜索解决方案,我认为这不是一个不常见的问题。根据我的读数,它看起来是数据类型问题。 PrctBusy列中的数据全部为数字。我想我需要强迫它成为数字,但我还没有找到解决方案。

以下是我目前正在使用的代码:

$ArrayNameUtil = "000198701258"
$CatNameUtil = "FE_DIR"

$sdLocalPath = "D:\Logs\SANData\Perf"
$InputCSV = "VMaxSANReportUtilFile.csv"
$csv = Join-Path $sdLocalPath $InputCSV

$provider = (New-Object System.Data.OleDb.OleDbEnumerator).GetElements() |     Where-Object { $_.SOURCES_NAME -like "Microsoft.ACE.OLEDB.*" }
if ($provider -is [system.array]) { $provider = $provider[0].SOURCES_NAME } else {  $provider = $provider.SOURCES_NAME }
$connstring = "Provider=$provider;Data Source=$(Split-Path $csv);Extended Properties='text;HDR=$firstRowColumnNames;';"
$firstRowColumnNames = "Yes"
$delimiter = ","
$tablename = (Split-Path $csv -leaf).Replace(".","#")

$conn = New-Object System.Data.OleDb.OleDbconnection
$conn.ConnectionString = $connstring

$provider = (New-Object System.Data.OleDb.OleDbEnumerator).GetElements() |     Where-Object { $_.SOURCES_NAME -like "Microsoft.ACE.OLEDB.*" }
if ($provider -is [system.array]) { $provider = $provider[0].SOURCES_NAME } else {  $provider = $provider.SOURCES_NAME }
$connstring = "Provider=$provider;Data Source=$(Split-Path $csv);Extended Properties='text;HDR=$firstRowColumnNames;';"
$firstRowColumnNames = "Yes"
$delimiter = ","
$tablename = (Split-Path $csv -leaf).Replace(".","#")

$conn = New-Object System.Data.OleDb.OleDbconnection
$conn.ConnectionString = $connstring
$conn.Open()
#
$sql = "SELECT TimeStamp, count(PrctBusy) AS Above60  FROM [$tablename] WHERE array = '$ArrayNameUtil' and Category like '$CatNameUtil' and PrctBusy > 60 Group by TimeStamp "

$cmd = New-Object System.Data.OleDB.OleDBCommand
$cmd.Connection = $conn
$cmd.CommandText = $sql

$dtp = New-Object System.Data.DataTable
$dtp.Load($cmd.ExecuteReader())

1 个答案:

答案 0 :(得分:0)

由于从TessellatingHeckler到Codeproject的指针以及一些跟进查询,我领先于http://aspdotnetcodes.com/Importing_CSV_Database_Schema.ini.aspx。我发现与CSV文件位于同一目录中的schema.ini文件可以指定数据类型。

schema.ini文件最终采用以下格式:

[VMaxSANReportUtilFile.csv] 
 ColNameHeader=True 
 Format=CSVDelimited 
 Col1=Array Text Width 20 
 Col2=TimeStamp Text Width 20 
 Col3=Category Text Width 20 
 Col4=Instance Text Width 20 
 Col5=PrctBusy Short 
 Col6=QueUtil Short

我经历了几次修订,以确保ACE OLE DB提供程序的数据类型正确。如果列已命名,则名称必须位于schema.ini文件中。