获取转义的多语法 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
  • 微软访问
  • 进度开放边缘
  • 火鸟

没有人有比编写我自己的转义函数更好的解决方案?

获取转义的多语法 sql 更新字符串

因为我并没有真正找到某种现有的功能,所以我不得不求助于编写自己的转义函数。

这就是我想出的。它似乎适用于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运行的大多数数据库。