参数化的SQL语句

时间:2016-01-04 14:59:48

标签: sql-server powershell parameterized-query

我正在尝试使用简单的插入查询来填充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()

我见过人们在其他帖子中讨论过不同的解决方案,但我不确定最好的方法是什么。

2 个答案:

答案 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连接也会被整理掉。