我正在为Enterprise Architect编写一个加载项,我需要操作内部脚本。 我想将自己的函数添加到现有脚本中。
脚本存储在脚本列 t_script 表中。
不幸的是,脚本没有在API中公开,所以我必须解决这个问题,并在数据库上使用更新查询来更新脚本。
问题是脚本在sql更新查询中使用时往往会使用大量可能造成问题的字符,但我并不热衷于编写自己的转义函数。
所以我试过的是这个
public void addCode(string functionCode)
{
this._code += functionCode;
SqlCommand sqlCommand = new SqlCommand("update t_script set script = @functionCode where ScriptID = " + this.scriptID );
sqlCommand.Parameters.AddWithValue("@functionCode",this._code);
this.model.executeSQL(sqlCommand.CommandText);
}
我希望sqlCommand.CommandText会给我实际要执行的sql字符串,但它并没有。它基本上仍然是我用它创建的字符串,它没有替换" @ functionCode"。
另一个困难是我的SQL字符串需要适用于EA
支持的所有DBMS类型有没有人有更好的解决方案,然后编写我自己的转义函数?
答案 0 :(得分:1)
因为我没有真正找到某种现有的功能,所以我不得不求助于编写自己的转义功能。
这就是我想出的。它似乎适用于MS-Access,FireBird,SLQ服务器,MySQL和Oracle(我还没有对其他人进行过测试)
/// <summary>
/// escapes a literal string so it can be inserted using sql
/// </summary>
/// <param name="sqlString">the string to be escaped</param>
/// <returns>the escaped string</returns>
public string escapeSQLString(string sqlString)
{
string escapedString = sqlString;
switch ( this.repositoryType)
{
case RepositoryType.MYSQL:
case RepositoryType.POSTGRES:
// replace backslash "\" by double backslash "\\"
escapedString = escapedString.Replace(@"\",@"\\");
break;
}
// ALL DBMS types: replace the single qoutes "'" by double single quotes "''"
escapedString = escapedString.Replace("'","''");
return escapedString;
}
编辑:修改了关于反斜杠转义的注释后的代码
答案 1 :(得分:0)
我认为您不应期望SqlCommand
解析在服务器上完成的参数。
至于多DBMS问题,我看看像NHibernate这样的问题。它不是你可以在最后一刻发布的东西,但它确实支持EA运行的大多数数据库。