将字符串添加到 char[x] 类型的 SQL 服务器字段的正确方法是什么?
What is the correct way to add a string to SQL Server field of type char[x]?
我正在 PowerShell 中编写脚本以利用我的 SQL Server 2000 数据库中的存储过程。为了利用带参数的存储过程,我使用 AddWithValue()
方法 sqlcmd.Parameters
。我试图将一个字符串插入到数据类型为 char
大小为 8 的列中。我一直在使用 AddWithValue()
方法,但我不断收到以下两个错误之一:
Cannot convert value "aamstest" to type "System.Char". Error: "String must be exactly one character long."
At D:\scripts\SCADAViewBulkAdd\scadaview_bulk_add.ps1:196 char:2
+ $SqlCmd.Paramters.AddWithValue("@USNAME",[char]$USNAME);
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastParseTargetInvocation
You cannot call a method on a null-valued expression.
At D:\scripts\SCADAViewBulkAdd\scadaview_bulk_add.ps1:197 char:2
+ $SqlCmd.Paramters.AddWithValue("@GRNAME",$GRNAME);
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
存储过程:
CREATE PROCEDURE spAddUserToGroup
@USNAME char(8), @GRNAME char(8)
AS
BEGIN
INSERT INTO GLOBE_USER_GROUP
VALUES (@USNAME, @GRNAME)
END
GO
AddWithValue()
从这里调用:
# Call SQL Stored Procedure spAddUserToGroup
function SpAddUserToGroup ($usnameParam,$grnameParam)
{
$SqlConnection = New-Object System.DATA.SqlClient.SqlConnection;
$SqlConnection.ConnectionString = "SERVER=server01;DATABASE=FIGDB;UID=y;PWD=y";
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
# Indicate working with stored procedure
$SqlCmd.CommandType=[System.Data.CommandType]'StoredProcedure';
# Supply name of stored procedure
$SqlCmd.CommandText = "spAddUserToGroup";
$SqlCmd.Connection = $SqlConnection;
# Set stored procedure parameters
$USNAME = $usnameParam;
$GRNAME = $grnameParam;
Write-Host $USNAME
Write-Host $GRNAME
# Add parameters to string
$SqlCmd.Paramters.AddWithValue("@USNAME",[char]$USNAME);
$SqlCmd.Paramters.AddWithValue("@GRNAME",$GRNAME);
# Initialize SQL Adapter
#$SqlAdapter = New-Object System.Data.SqlClient.SqlAdapter;
#$SqlAdapter.SelectCommand = $SqlCmd;
...
}
问题: 如何使用 PowerShell 使用存储过程将字符串插入到 char[8]
类型的列中?我的错误是由于调用 AddWithValue()
不正确还是我处理变量类型不当造成的?
新答案
事实证明,您可以指定参数名称,但并非必须如此。我认为您的实际问题是您拼写了 Parameter 错误,这就是为什么 SQL 不接受您的输入。
将您的代码更改为此,它应该可以工作。
$SqlCmd.Parameters.AddWithValue("@USNAME",[char]$USNAME);
$SqlCmd.Parameters.AddWithValue("@GRNAME",$GRNAME);
旧答案,错误
我认为调用存储过程时不应该指定参数名称。试试这个:
更改这两行:
$SqlCmd.Paramters.AddWithValue("@USNAME",[char]$USNAME);
$SqlCmd.Paramters.AddWithValue("@GRNAME",$GRNAME);
为此:
$SqlCmd.Paramters.AddWithValue([char]$USNAME,$GRNAME)
此外,PowerShell 不需要行结束字符,例如分号。
我正在 PowerShell 中编写脚本以利用我的 SQL Server 2000 数据库中的存储过程。为了利用带参数的存储过程,我使用 AddWithValue()
方法 sqlcmd.Parameters
。我试图将一个字符串插入到数据类型为 char
大小为 8 的列中。我一直在使用 AddWithValue()
方法,但我不断收到以下两个错误之一:
Cannot convert value "aamstest" to type "System.Char". Error: "String must be exactly one character long."
At D:\scripts\SCADAViewBulkAdd\scadaview_bulk_add.ps1:196 char:2
+ $SqlCmd.Paramters.AddWithValue("@USNAME",[char]$USNAME);
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastParseTargetInvocationYou cannot call a method on a null-valued expression.
At D:\scripts\SCADAViewBulkAdd\scadaview_bulk_add.ps1:197 char:2
+ $SqlCmd.Paramters.AddWithValue("@GRNAME",$GRNAME);
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
存储过程:
CREATE PROCEDURE spAddUserToGroup
@USNAME char(8), @GRNAME char(8)
AS
BEGIN
INSERT INTO GLOBE_USER_GROUP
VALUES (@USNAME, @GRNAME)
END
GO
AddWithValue()
从这里调用:
# Call SQL Stored Procedure spAddUserToGroup
function SpAddUserToGroup ($usnameParam,$grnameParam)
{
$SqlConnection = New-Object System.DATA.SqlClient.SqlConnection;
$SqlConnection.ConnectionString = "SERVER=server01;DATABASE=FIGDB;UID=y;PWD=y";
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
# Indicate working with stored procedure
$SqlCmd.CommandType=[System.Data.CommandType]'StoredProcedure';
# Supply name of stored procedure
$SqlCmd.CommandText = "spAddUserToGroup";
$SqlCmd.Connection = $SqlConnection;
# Set stored procedure parameters
$USNAME = $usnameParam;
$GRNAME = $grnameParam;
Write-Host $USNAME
Write-Host $GRNAME
# Add parameters to string
$SqlCmd.Paramters.AddWithValue("@USNAME",[char]$USNAME);
$SqlCmd.Paramters.AddWithValue("@GRNAME",$GRNAME);
# Initialize SQL Adapter
#$SqlAdapter = New-Object System.Data.SqlClient.SqlAdapter;
#$SqlAdapter.SelectCommand = $SqlCmd;
...
}
问题: 如何使用 PowerShell 使用存储过程将字符串插入到 char[8]
类型的列中?我的错误是由于调用 AddWithValue()
不正确还是我处理变量类型不当造成的?
新答案
事实证明,您可以指定参数名称,但并非必须如此。我认为您的实际问题是您拼写了 Parameter 错误,这就是为什么 SQL 不接受您的输入。
将您的代码更改为此,它应该可以工作。
$SqlCmd.Parameters.AddWithValue("@USNAME",[char]$USNAME);
$SqlCmd.Parameters.AddWithValue("@GRNAME",$GRNAME);
旧答案,错误
我认为调用存储过程时不应该指定参数名称。试试这个:
更改这两行:
$SqlCmd.Paramters.AddWithValue("@USNAME",[char]$USNAME);
$SqlCmd.Paramters.AddWithValue("@GRNAME",$GRNAME);
为此:
$SqlCmd.Paramters.AddWithValue([char]$USNAME,$GRNAME)
此外,PowerShell 不需要行结束字符,例如分号。