我正在从美国农业部食品API中提取各种食物的营养成分报告。我使用powershell脚本来处理请求,USDA文档规定每个请求最多有1500条记录。我可以将值一直拉到max = 164但是当我尝试将其更改为165时,我在“S”附近得到错误的语法错误。有什么可能导致这个的任何线索?
下面的代码和错误PS:
Function Add-APIData ($server, $database, $text)
{
$scon = New-Object System.Data.SqlClient.SqlConnection
$scon.ConnectionString = "SERVER=$server;DATABASE=$database;Integrated Security=true"
$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.Connection = $scon
$cmd.CommandText = $text
$cmd.CommandTimeout = 0
$scon.Open()
$cmd.ExecuteNonQuery()
$scon.Close()
$cmd.Dispose()
$scon.Dispose()
}
//this is where the max value is stored
[string]$webstring = "https://api.nal.usda.gov/ndb/nutrients/?format=json&max=164&api_key=CLJnYzvrhMBcFtoQ4hohIL4Scs3tiRpOFXS7UhHM&nutrients=205&nutrients=204&nutrients=208&nutrients=269&fg=0100"
$webget = New-Object System.Net.WebClient
$result = $webget.DownloadString($webstring)
$result = ConvertFrom-Json $result
$add = @()
foreach ($r in $result.report.foods){
$add += "INSERT INTO BRUH VALUES ('" + $r.ndbno + "','" + $r.name + "')"
}
Add-APIData -server "NATHAN\SQLEXPRESS" -database "Lab2" -text $add
错误:
使用“0”参数调用“ExecuteNonQuery”的异常:“'S'附近的语法不正确。 字符串')'后面的未闭合引号。“ 在行:12 char:5 + $ cmd.ExecuteNonQuery() + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:SqlException
答案 0 :(得分:1)
最有可能的是,您的数据中有一个撇号(单引号)。因为您将字符串连接到INSERT
语句中,所以数据库无法正确解析这些字符串,这是SQL注入攻击的主要原因之一!
如果您将查询输出到控制台然后将其粘贴到SSMS中,语法突出显示将很快显示给您。
第二种(远程)可能性是您超出了查询的最大允许长度。
更改您的代码以使用参数化查询(example)并一次执行一个INSERT
,而不是同时执行一个非常大的批处理。