在powershell中执行sql存储过程时参数值中的空格

时间:2014-09-14 21:25:43

标签: mysql sql powershell

我在发送msyql命令以执行存储过程时遇到问题。

这是我正在使用的代码,我有一个名为set-outage的cmdlet我已经创建了。它有参数集,其中唯一的代码就是这两行。其他一切都处理之后发生的事情。它在ExecuteNonQuery行上出错。

$query = New-Object Mysql.data.mysqlclient.mysqlcommand("set_outage('$system','$startd','$startt','$endd','$endt','$changes','$user')", (invoke-mysql))
$rdr = $query.ExecuteNonQuery()

我的所有参数都设置为

[string]$variable

存储过程是

CREATE DEFINER=`root`@`localhost` PROCEDURE `set_outage`(in system varchar(55), in startd varchar(25), in startt varchar(25), in endd varchar(25), in endt varchar(25),  in changes longtext, in user varchar(55))

BEGIN
Insert into to_process (node_name, User_Requested, Start_date, Start_time, End_Date, End_time, Started ) Values (system, user, startd, startt, endd, endt, 'no');
end

MySQL允许将文本值存储在日期和时间字段中,这样就不用担心了。我知道在这个命令中没有使用变化,但是在我解决之后它将会出现。

这里有两个例子......一个有效的......还有一个没有。

set-outage -system viper12 -startd 2014/12/12 -startt 12:00 -endd 2014/12/17 -endt 17:00 -user 'Daniel asdfsdaf' -changes 'test'

返回错误:

  

异常调用" ExecuteNonQuery"用" 0"参数:"您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在附近使用正确的语法   ' set_outage(' VIPER12'' 2014年/ 12/12',' 12:00'' 2014年/ 12/17#39 ;,' 17:00''测试','丹尼尔'在第1行"   在N:\ NOC \ Powershell Scripts \ testingmysql.ps1:194 char:9   + $ rdr = $ query.ExecuteNonQuery()   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:NotSpecified:(:) [],MethodInvocationException       + FullyQualifiedErrorId:MySqlException

如果我只是删除多余的单词或空格,如下:

set-outage -system viper14 -startd 2014/12/12 -startt 12:00 -endd 2014/12/17 -endt 17:00 -user 'Daniel' -changes 'aasdfsadfsadfsadfasfsdfsadfsatest'

我不再收到错误。我放了" "在他们周围,我已经使用过' '在他们旁边。我已经尝试将输入转换为here_strings,我已经使用了反引号......我所做的一切似乎都没有空格。我甚至试图使用@ query.prepare(),但这也没有帮助。我也试图在MySQL中单引引用变量。没运气。

如果我指示$ query的输出,它看起来像这样。

LastInsertedId    : 0
CommandText       : set_outage('viper12','2014/12/12','12:00','2014/12/17','17:00','test','Daniel asdfsdaf')
CommandTimeout    : 30
CommandType       : Text
IsPrepared        : False
Connection        : MySql.Data.MySqlClient.MySqlConnection
Parameters        : {}
Transaction       : 
EnableCaching     : False
CacheAge          : 0
UpdatedRowSource  : Both
DesignTimeVisible : False
Site              : 
Container         : 

如果我使用commandtext并直接在MySQL中使用它,它可以很好地工作。我似乎无法找到引用数据的正确方法,表明它将在变量中传递空格。你能为我指出正确的方向吗?这对我来说可能是一个愚蠢的忽视..但我仍然对这些东西有点新鲜所以要温柔:))

1 个答案:

答案 0 :(得分:1)

从我能找到的情况来看,这就是我传递信息的方式。

可能是错的......但这种方式有效......通过这种方式设置参数,并在命令字符串中传递它们。

$query = New-Object Mysql.data.mysqlclient.mysqlcommand("set_outage", (invoke-mysql))
        $query.CommandType = [System.Data.CommandType]'StoredProcedure'
        $query.Parameters.Add("user","$user")
        $query.Parameters.Add("system","$system")
        $query.Parameters.Add("changes","$changes")
        $query.Parameters.Add("startd","$startd")
        $query.Parameters.Add("startt","$startt")
        $query.Parameters.Add("endd","$endd")
        $query.Parameters.Add("endt","$endt")

如果我在mysql命令中的sql命令中有空格,这似乎只是一个问题。

我使用以下命令对此进行了测试:

set-outage -system viper3 -startd 2014/12/12 -startt 12:00 -endd 2014/12/17 -endt 17:00 -changes 'this is a test with lots of spaces' -user 'Daniel Peel' 

我没有任何问题,它运行并且存储过程按预期工作。任何额外的输入总是受欢迎的。

相关问题