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

OracleへのEFクエリがORA-12704をスローします:文字セットの不一致

    私はこの作者(ODP.Netマネージドドライバー-ORA-12704:生成されたコードの文字セットの不一致)に質問を更新してもらうことになりました。彼はインターセプターを使用して回避策を投稿しました。ここでもう少し詳しく説明します。 。

    まず、構成をロードするためにDBContextを装飾しました。これをスキップして、構成がある場合は構成に追加することができます:

    [DbConfigurationType(typeof(MyDbConfiguration))]
    public partial class MyContext : DbContext
    

    構成クラスを作成します:

    public class MyDbConfiguration : DbConfiguration
    {
        public MyDbConfiguration()
        {
            this.AddInterceptor(new NVarcharInterceptor()); //add this line to existing config.
        }
    }
    

    次に、インターセプターを作成します:

    public class NVarcharInterceptor : IDbCommandInterceptor
    {
        public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
            if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
                command.CommandText = command.CommandText.Replace("N''", "''");
        }
    
        public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
            if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
                command.CommandText = command.CommandText.Replace("N''", "''");
        }
    
        public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        {
            if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
                command.CommandText = command.CommandText.Replace("N''", "''");
        }
    
        public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        {
            if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
                command.CommandText = command.CommandText.Replace("N''", "''");
        }
    
        public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {
            if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
                command.CommandText = command.CommandText.Replace("N''", "''");
        }
    
        public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {
            if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
                command.CommandText = command.CommandText.Replace("N''", "''");
        }
    }
    


    1. コンテナ・データベース(CDB)でユーザー・パスワードを変更するときのエラーORA-65048

    2. 文字列を行に分割するOracleSQL

    3. 12一般的に使用されるSQL演算子

    4. SQL自然結合