C#DB2 EF插入erorr

时间:2018-01-23 07:28:13

标签: c# entity-framework db2

我目前在向表中插入新行时遇到一些问题。问题很可能是,无论出于何种原因,该语句都围绕主键使用双引号。

select "OID" as ""OID"" 
from new table (insert into "PAQ"."TPAQ100_AUFTRAG"("EKVNR", "AUFTRAG_ERSTELLT_AM", "NACHNAME", "VORNAME", "GEBURTSDATUM", "SACHBEARBEITER_NACHNAME", "SACHBEARBEITER_VORNAME", "SACHBEARBEITER_USER", "DIENSTSTELLE", "LEI_ARZT_ANGEFORDERT", "LEI_ZAHNARZT_ANGEFORDERT", "LEI_APO_ANGEFORDERT", "LEI_KH_ANGEFORDERT", "LEI_SONSTIGE_LE_ANGEFORDERT", "GUELTIG_VON", "GUELTIG_BIS", "AUSGABEWEG", "AUFTRAG_HERKUNFT")
    values (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15, @p16, @p17))

现在我已经假装EnableEFCaseSensitivity,并且老老实实地不知道引号来自哪里。我确实使用Column属性,但不使用OID。我只设置了Key属性及其属性。列(以及表的名称)都在Caps。

错误是:

  

ERROR [42601] [IBM] [DB2 / AIX64] SQL0104N意外的令牌""""发现在"选择" OID" as"。预期的代币可能包括:""。

模特级:

    [Table("PAQ.TPAQ100_AUFTRAG")]
    public class Auftrag
    {
        [Key]
        public long OID { get; set; }

        [Required]
        [StringLength(10)]
        [Column("EKVNR")]
        public string Ekvnr { get; set; }

        [Column("AUFTRAG_ERSTELLT_AM")]
        public DateTime CreatedAt { get; set; }

        [Required]
        [StringLength(60)]
        [Column("NACHNAME")]
        public string Nachname { get; set; }

        [Required]
        [StringLength(30)]
        [Column("VORNAME")]
        public string Vorname { get; set; }

        [Column("GEBURTSDATUM", TypeName = "date")]
        public DateTime GebDat { get; set; }

        [StringLength(32)]
        [Column("SACHBEARBEITER_NACHNAME")]
        public string SachbearbeiterNachname { get; set; }

        [StringLength(32)]
        [Column("SACHBEARBEITER_VORNAME")]
        public string SachbearbeiterVorname { get; set; }

        [StringLength(20)]
        [Column("SACHBEARBEITER_USER")]
        public string SachbearbeiterUser { get; set; }

        [StringLength(7)]
        [Column("DIENSTSTELLE")]
        public string SachbearbeiterDst { get; set; }

        [Column("LEI_ARZT_ANGEFORDERT")]
        public short AerztlicheLeistungen { get; set; }

        [Column("LEI_ZAHNARZT_ANGEFORDERT")]
        public short ZahnaerztlicheLeistungen { get; set; }

        [Column("LEI_APO_ANGEFORDERT")]
        public short Arzneimittel { get; set; }

        [Column("LEI_KH_ANGEFORDERT")]
        public short KrankenhausBehandlung { get; set; }


        [Column("LEI_SONSTIGE_LE_ANGEFORDERT")]
        public short SonstigeLeistungen { get; set; }

        [Column("GUELTIG_VON", TypeName = "date")]
        public DateTime GueltigAb { get; set; }

        [Column("GUELTIG_BIS", TypeName = "date")]
        public DateTime GueltigBis { get; set; }

        [Required]
        [StringLength(1)]
        [Column("AUSGABEWEG", TypeName = "character")]
        public string AusgabeWeg { get; set; }

        [Required]
        [StringLength(1)]
        [Column("AUFTRAG_HERKUNFT", TypeName = "character")]
        public string AuftragHerkunft { get; set; }
    }

存储库功能:

public void Create(Auftrag auftrag)
{
    Logger.LogInfo($"Versuche den Auftrag für Versicherten {auftrag.Nachname}, {auftrag.Vorname} in die Auftragsdatenbank zu schreiben");
    auftrag.CreatedAt = DateTime.Now;

    _context.Auftraege.Add(auftrag);
    //Loggt die Query zwecks Fehleranalyse
    _context.Database.Log = Logger.LogInfo;
    _context.SaveChanges();
}

上下文类:

public partial class AuftragDbContext : DbContext
    {
        public AuftragDbContext(DbConnection db2Connection)
            : base(db2Connection, true)
        {
        }

        public DbSet<Auftrag> Auftraege { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Auftrag>()
                .Property(e => e.Ekvnr)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.Nachname)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.Vorname)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.SachbearbeiterNachname)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.SachbearbeiterVorname)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.SachbearbeiterUser)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.SachbearbeiterDst)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.AuftragHerkunft)
                .IsFixedLength()
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.AusgabeWeg)
                .IsFixedLength()
                .IsUnicode(false);
        }

        /// <summary>
        /// Dient dem Abfangen von Exceptions im Prozess des Sicherns der datenbankseitigen Operationen
        /// </summary>
        /// <returns></returns>
        public override int SaveChanges()
        {
            try
            {
                return base.SaveChanges();
            }
            catch (DbEntityValidationException dbValEx)
            {
                var values = dbValEx.EntityValidationErrors;
                if (values == null) throw new ArgumentNullException(nameof(values));
                throw;
            }
            catch (DbUpdateException dbUpEx)
            {
                throw dbUpEx;
            }
        }
    }
    /// <summary>
    /// Gibt die Datenbankconnection abhängig von der aktuellen Domäne zurück
    /// </summary>
    public static class AuftragContextFactory
    {
        private static string _connectionString = null;

        private static DB2Connection GetConnectionString()
        {
            if (_connectionString != null)
            {
                return new DB2Connection(_connectionString);
            }

            var connstrBulder = new DakampClientConnectionStringBuilder(EnvironmentHandler.Environment);
            var connStr = connstrBulder.GetClientConnectionString(DatabaseType.AuftragsDB);
            var db2ConStrBldr = new DB2ConnectionStringBuilder(connStr)
            {
                //Queries laufen so lange, bis sie durch sind unabhängig vom CommandTimeout
                QueryTimeout = 0,
                EnableEFCaseSensitivity = false,
                ConcurrentAccessResolution = "CurrentlyCommitted",
            };
            _connectionString = db2ConStrBldr.ConnectionString;
            return new DB2Connection(_connectionString);
        }

        public static AuftragDbContext AuftragDb => new AuftragDbContext(GetConnectionString());
    }

我花了最后几个小时寻找解决方案而根本没有找到任何帮助。

1 个答案:

答案 0 :(得分:1)

即使它不是100%令人满意的答案,你可以使用命令拦截器修改sql-query,然后再执行:

public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
    command.CommandText = command.CommandText.Replace("\"\"", "\"").Trim();
    Logger.LogInfo("ReaderExecuted: " +
                   $" IsAsync: {interceptionContext.IsAsync}, Command Text: {command.CommandText}");
}

我所做的只是用一个引号替换双引号并且它正常工作。