【发布时间】:2020-01-29 21:07:08
【问题描述】:
我有一个 PowerShell 脚本,它从注册表中读取日期,然后在 SQL 查询中使用它
# get date from registry
$avdate = (readregistry -regpath "HKLM:\SOFTWARE\MCAFEE\agent" -targetval "InstallTime") -as [DateTime]
$avdate = $avdate.tostring("yyyy-MM-dd HH:mm:ss")
# query, ExecQuery() makes calls to the database, EscapeQuote() is for string formatting
$returnRS = ExecQuery("exec SystemCheckerVBS_UpdateComputer '" + (EscapeQuote($serialNumber)) + "','" + (EscapeQuote($computerName)) + "',3,'$hostip','$hostmac','$avdate','$ostype','$osbit','$spver','$sdc'")
#query function
function local:ExecQuery($sqlStr){
#write-host "query: $sqlstr" #debug
$SqlCmd.CommandText = $sqlStr
$SqlAdapter.SelectCommand = $SqlCmd
$dataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
return $dataSet
}
在运行它产生的查询时(使用“1”参数调用“Fill”的异常:“将数据类型 varchar 转换为 datetime 时出错。”)。使用“yyyMMdd”格式也不起作用,也不能直接将其作为日期时间对象传递。 这里是 SQL 过程接收数据的地方,只有过程中的其他用途被传递到插入和更新语句中而无需更改。没有其他变量是或处理日期时间。
@I_AntiVirusDate datetime = '2001-01-01 00:00:01'
这是格式问题、语法问题还是其他原因?
【问题讨论】:
-
嗨。这是需要Minimal, Reproducible Example 回答的问题类型。从您现有的帖子中,我们不知道注册表中的数据是什么样的,或者被调用的存储过程是做什么的。请编辑您的问题以包含相关详细信息,以便我们可以重现问题并帮助您确定原因。谢谢。
-
另外,我会指出,通过将参数嵌入字符串中,您的代码很容易受到 SQL 注入攻击。您应该将它们作为实际参数添加到
$SqlAdapter.Parameters上。见bobby-tables.com
标签: sql sql-server powershell datetime