我目前在向表中插入新行时遇到一些问题。问题很可能是,无论出于何种原因,该语句都围绕主键使用双引号。
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());
}
我花了最后几个小时寻找解决方案而根本没有找到任何帮助。
答案 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}");
}
我所做的只是用一个引号替换双引号并且它正常工作。