我正在尝试使用简单的插入查询来填充SQL表。目前,我的脚本通过连接字符串来创建查询,但我想参数化查询以避免出现以下错误:
使用“0”参数调用“ExecuteNonQuery”的异常:“字符串或二进制数据将被截断。
目前我正在设置我的连接,如下所示:
$conn = New-Object System.Data.SqlClient.SQLConnection
$ConnectionString = "Server=$SQLServer;Database=$SQLDatabase;Integrated Security=True;Connect Timeout=0"
$conn.ConnectionString = $ConnectionString
$conn.Open()
我的非参数化查询如下所示:
$commandText = "INSERT INTO Servers (Name, OS, Notes, OSOwner) VALUES('$myvm', '$operatingSystem', '$desc', '$owner')"
$command = $conn.CreateCommand()
$command.CommandText = $commandText
$command.ExecuteNonQuery()
我见过人们在其他帖子中讨论过不同的解决方案,但我不确定最好的方法是什么。
答案 0 :(得分:1)
参数化无法解决问题,只需将其移至不同的代码段。
您的Servers
表的设计使得一个或多个字段小于您尝试插入其中的值。首先修复一下 - 您对数据大小做出了错误的假设。
答案 1 :(得分:1)
alroc是正确的,因为您看到的错误与数据大小有关;提供参数化的答案,这是我的建议:
function execSQL($sqlQuery) {
try {
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection
$sqlConnection.ConnectionString = "Server=$SqlServer; Database=$sqlDB; Application Name=$appName; Trusted_Connection=True"
$sqlCmd.CommandTimeout = 60
$sqlCmd.CommandText = $sqlQuery
$sqlCmd.Connection = $sqlConnection
$sqlCmd.ExecuteNonQuery()
}
catch [system.exception] {
"$_ `r`nSQL Servername: $SqlServer" #send to log file
}
finally {
$SqlConnection.Close()
$SqlConnection.Dispose()
}
}
$appName = "brief description of what the SQL connection is being used for"
$sqlQuery = @"
INSERT INTO Servers (Name, OS, Notes, OSOwner)
VALUES(@myvm, @operatingSystem, @desc, @owner)
"@
$sqlCmd = New-Object System.Data.SqlClient.SqlCommand
$sqlCmd.Parameters.AddWithValue("@myvm", $myvm) | Out-Null
$sqlCmd.Parameters.AddWithValue("@operatingSystem", $operatingSystem) | Out-Null
$sqlCmd.Parameters.AddWithValue("@desc", $desc) | Out-Null
$sqlCmd.Parameters.AddWithValue("@owner", $owner) | Out-Null
execSQL $sqlQuery
在连接字符串中提供应用程序名称有助于DBA了解审核连接时的连接。在try / catch / finally结构中包装SQL内容允许我们捕获错误,但更重要的是,即使抛出错误,SQL连接也会被整理掉。