sql >> データベース >  >> RDS >> Sqlserver

.NETから、(SQLパラメーターを使用して)SqlCommandオブジェクトによって生成された完全なSQL文字列を取得できますか?

    すべてのパラメーター名をそれらの値に置き換える単純なループは、最終結果と同様の結果を提供しますが、いくつかの問題があります。

    1. SQLはパラメータ値を使用して実際に再構築されることはないため、改行や引用符などを考慮する必要はありません。
    2. コメント内のパラメータ名は、実際にその値として処理されることはありませんが、そのまま残されます

    それらを配置し、@NAMEのように同じ文字で始まるパラメータ名を考慮に入れます および@NAME_FULL 、すべてのパラメータ名を、そのパラメータの代わりになる値に置き換えることができます:

    string query = cmd.CommandText;
    foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
    {
        query = query.Replace(p.ParameterName, p.Value.ToString());
    }
    

    ただし、これには1つの問題が残っています。つまり、パラメータが文字列の場合、最初は次のようになります。

    SELECT * FROM yourtable WHERE table_code = @CODE
    

    次のようになります:

    SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES
    

    これは明らかに正当なSQLではないため、いくつかのパラメータタイプも考慮する必要があります。

    DbType[] quotedParameterTypes = new DbType[] {
        DbType.AnsiString, DbType.Date,
        DbType.DateTime, DbType.Guid, DbType.String,
        DbType.AnsiStringFixedLength, DbType.StringFixedLength
    };
    string query = cmd.CommandText;
    
    var arrParams = new SqlParameter[cmd.Parameters.Count];
    cmd.Parameters.CopyTo(arrParams, 0);
    
    foreach (SqlParameter p in arrParams.OrderByDescending(p => p.ParameterName.Length))
    {
        string value = p.Value.ToString();
        if (quotedParameterTypes.Contains(p.DbType))
            value = "'" + value + "'";
        query = query.Replace(p.ParameterName, value);
    }
    


    1. Knex.jsはSQLインジェクションを防ぎますか?

    2. Geekbench3を使用したデータベースサーバーのパフォーマンスの評価

    3. 緯度経度に基づいてmysqlから結果を取得します

    4. タイムゾーンのあるPostgresqldate_truncは、ゾーンを1時間シフトします