【问题标题】:PowerShell - select number with decimal separator (DB2 SQL)PowerShell - 选择带小数点分隔符的数字 (DB2 SQL)
【发布时间】:2020-05-25 07:53:16
【问题描述】:

在使用 PowerShell 选择 DB2 数据时,无法弄清楚如何包含小数点分隔符。

DB2 表包含带有商品价格的列:

+------+---------+
| Item |  Price  |
+------+---------+
| A    | 99,104  |
| B    | 27,05   |
| C    | 320,001 |
+------+---------+

这是获取此数据的 Powershell 脚本的一部分:

$SQL = "SELECT Item, Price FROM Inventory"
$connection = New-Object System.Data.Odbc.OdbcConnection
$connection.ConnectionString = "DSN=$DNS;UID=$USERNAME;password=$PASSWORD"

$connection.open() | Get-Item -ErrorAction Stop 
$cmd = New-object System.Data.Odbc.OdbcCommand($SQL,$connection)
$result = New-Object system.Data.DataSet
(New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($result) # here comma gets removed from Price
$connection.close()

$result.Tables[0] | Export-Csv -NoTypeInformation -Delimiter -Encoding UTF8 $OutputFile

这会以某种方式选择不带小数的数据,这是不正确的 - 价格现在非常高:

99104
2705
320001

我虽然在 Export-Csv 期间删除了逗号,所以添加了 -UseCulture,但结果是一样的。选择数据时似乎删除了逗号:

New-Object system.Data.odbc.odbcDataAdapter($cmd)

我的问题是如何解决这个问题?是否有额外的参数或这里缺少什么?

【问题讨论】:

  • 我认为这与您的文化设置有关。 “十进制”分隔符设置在那里[逗号用于某些,点用于其他,可能使用其他人]。您可能需要设置该分隔符或手动更正它。我不知道如何将其设置为仅用于一种用途。 [脸红]
  • 问题可能出在 DataSet 默认区域设置中。尝试在使用之前将 DataSet 的 Locale 属性设置为 $result.Locale = [cultureinfo]::CurrentCulture
  • 您好,用几种不同的文化设置(da-DK、en-US、en-GB)进行了测试,但结果是相同的。 (New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($result) 删除小数点分隔符。尝试阅读并弄清楚如何向当前代码添加其他参数:docs.microsoft.com/en-us/dotnet/api/…
  • 价格是什么数据类型?如果在 select 语句中将其转换为 varchar 会怎样?
  • @vonPryz ,我不知道数据类型,但 CASE(Price AS VARCHAR(10)) 有效,谢谢!我想知道是否可以在不修改 SQL 语句的情况下解决此问题,但可以通过 PowerShell 解决。

标签: powershell db2 powershell-5.0


【解决方案1】:

我还不能发表评论。

正如其他人所问,数据库中价格列的数据类型是什么?根据您的输出,它是左对齐的,因此它似乎不是数字类型。

在这里用 db2sample 数据库中的 PRODUCT 表做一个简单的测试: 而且,您也可以尝试使用 IBM.Data.Db2 .Net 提供程序而不是使用 ODBC。

$dbFactory = [System.Data.Common.DbProviderFactories]::GetFactory('IBM.Data.DB2')
$connection = $dbFactory.CreateConnection()
$connection.ConnectionString = "Database=SAMPLE"
$connection.Open()
$da = $dbFactory.CreateDataAdapter()


$ds = new-object "System.Data.DataSet"  
$cmd = $dbFactory.CreateCommand()
$cmd.Connection = $connection

$cmd.CommandText = "SELECT PID, PRICE FROM PRODUCT"
$da.SelectCommand = $cmd 

$da.Fill($ds)
$ds.Tables[0]

产生预期的十进制格式。

PID        PRICE
---        -----
100-100-01  9,99
100-101-01 19,99
100-103-01 49,99
100-201-01  3,99


$ds.Tables[0].Columns[1].DataType

IsPublic IsSerial Name                                     BaseType                                                                                             
-------- -------- ----                                     --------                                                                                             
True     True     Decimal                                  System.ValueType 

【讨论】:

  • 请把这个放在问题中。这就是您提供的所有补充信息应该去的地方......
  • 抱歉,我无权编辑他的问题.. 没明白你的意思。
  • 啊!我误读了你是谁。对此感到抱歉... [blush] ///// 参加本网站的游览可以获得更多积分。我认为是 100 分,但我不确定。
  • 啊,np @lee_dailey。它发生了;-)
猜你喜欢
  • 2022-06-10
  • 2013-07-08
  • 1970-01-01
  • 2021-09-14
  • 2010-11-13
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多