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

时间:2014-11-24 04:50:17

标签: c# sql sql-server oracle enterprise-architect

我正在为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的
  • Oracle 9i,10g,11g和12c
  • 的PostgreSQL
  • MSDE
  • Sybase Adaptive Server Anywhere
  • MS Access
  • Progress OpenEdge
  • 火鸟

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

2 个答案:

答案 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运行的大多数数据库。