C#DB2 EF Insert erorr
我目前在向表中插入新行时遇到一些问题。问题很可能是,无论出于何种原因,语句的主键周围都有双引号C#DB2 EF Insert erorr,c#,entity-framework,db2,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", "
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))
现在我已经在false上启用了EnableEFCaseSensitivity
,老实说,我不知道这些引用是从哪里来的。我确实使用了列
属性,但不用于OID
。我只设置了键
属性,就这样。列(以及表的名称)都是大写的
错误是:
错误[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());
}
公共部分类AuftragDbContext:DbContext
{
公共AuftragDbContext(数据库连接db2Connection)
:base(db2Connection,true)
{
}
公共数据库集Auftraege{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Property(e=>e.Ekvnr)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.Nachname)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.Vorname)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.SachbearbeiterNachname)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.SachbearbeiterVorname)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.sachbearbeinteruser)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.SachbearbeiterDst)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.AuftragHerkunft)
.IsFixedLength()
.IsUnicode(假);
modelBuilder.Entity()
.属性(e=>e.Ausgabeeg)
.IsFixedLength()
.IsUnicode(假);
}
///
///目前,银行运营项目中存在例外情况
///
///
公共覆盖int SaveChanges()
{
尝试
{
返回base.SaveChanges();
}
捕获(DbEntityValidationException dbValEx)
{
var values=dbValEx.EntityValidationErrors;
如果(values==null)抛出新的ArgumentNullException(nameof(values));
投掷;
}
catch(DbUpdateException dbUpEx)
{
抛出dbUpEx;
}
}
}
///
///这是一个很好的例子
///
公共静态类AuftragContextFactory
{
私有静态字符串_connectionString=null;
私有静态DB2Connection GetConnectionString()
{
if(_connectionString!=null)
{
返回新的DB2Connection(_connectionString);
}
var connstrBulder=new DakampClientConnectionStringBuilder(EnvironmentHandler.Environment);
var connStr=connstrBulder.GetClientConnectionString(DatabaseType.AuftragsDB);
var db2ConStrBldr=新的DB2ConnectionStringBuilder(connStr)
{
//劳芬·索兰格(laufen so lange)的问题,请您回答
QueryTimeout=0,
EnableEFCaseSensitivity=false,
ConcurrentAccessResolution=“CurrentlyCommitted”,
};
_connectionString=db2ConStrBldr.connectionString;
返回新的DB2Connection(_connectionString);
}
公共静态AuftragDbContext AuftragDb=>newauftragdbContext(GetConnectionString());
}
在过去的几个小时里,我一直在搜索一个解决方案,但没有找到任何有用的解决方案。尽管这不是一个100%令人满意的答案,但您可以使用命令拦截器修改sql查询,然后再执行查询:
public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
command.CommandText = command.CommandText.Replace("\"\"", "\"").Trim();
Logger.LogInfo("ReaderExecuted: " +
$" IsAsync: {interceptionContext.IsAsync}, Command Text: {command.CommandText}");
}
public void reader执行(DbCommand命令,DbCommandInterceptionContext interceptionContext)
{
command.CommandText=command.CommandText.Replace(“\”\”,“\”).Trim();
Logger.LogInfo(“ReaderExecuted:”+
$“IsAsync:{interceptOnContext.IsAsync},命令文本:{Command.CommandText}”);
}
我所做的只是用一个引号替换双引号,它工作正常。我假设这是由Entity Framework生成的语句?如果是,是哪个版本?这也引出了一个问题:如果使用
列属性怎么办?它是EF 6.1.3,我尝试使用列属性作为键(OID),但没有任何更改。恐怕这是DB2数据提供程序中的一个奇怪错误。您可能会在他们的产品站点上提出问题。同时,您可以通过从a中的查询字符串中删除双引号来解决此问题。您可以继承自DbCommandInterceptor
,并重写相应的方法来修改命令的文本。