获取转义的多语法 sql 更新字符串
本文关键字:sql 更新 字符串 语法 转义 获取 | 更新日期: 2023-09-27 18:31:34
我正在为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类型上运行
- SQL Server 2000、2005、2008 和 2012
- MySQL
- 甲骨文 9i、10g、11g 和 12c
- PostgreSQL
- 默德
- Sybase Adaptive Server Anywhere
- 微软访问
- 进度开放边缘
- 火鸟
没有人有比编写我自己的转义函数更好的解决方案?
因为我并没有真正找到某种现有的功能,所以我不得不求助于编写自己的转义函数。
这就是我想出的。它似乎适用于MS-Access,FireBird,SLQ Server,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;
}
编辑:修复了有关反斜杠转义的评论后的代码
我认为您不应该期望SqlCommand
解析参数,这是在服务器上完成的。
至于多DBMS问题,我会看看像NHibernate这样的东西。这不是你可以在最后一刻加入的东西,但它确实支持EA运行的大多数数据库。