2016-01-04 80 views
0

我想使用简单的插入查询来填充SQL表。目前,我的剧本由连接字符串创建查询,但我想参数化查询,以避免收到以下错误:参数化的SQL语句

Exception calling "ExecuteNonQuery" with "0" argument(s): "String or binary data would be truncated.

目前我设置我的连接,就像这样:

$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() 

我见过的人讨论不同的溶胶在其他帖子中提到这一点,但我不确定最好的方法是什么。

回答

1

参数化不会消除这个问题,它只会将它移动到不同的代码段。

您的Servers表的设计使得一个或多个字段小于您尝试插入其中的值。首先解决这个问题 - 您对数据大小做出了不正确的假设。

+0

嗯...这就是我最初的想法,但没有发现任何数据,看起来被截断了2000个行。我会更近一点,谢谢你。 –

+0

调试时,输出'$ commandtext',然后复制并粘贴到SSMS中。它应该抛出同样的错误。 – alroc

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