2

我正在使用 NHibernate 与 Burrow 和 Fluent 将数据从 SQLServer2005 传送到一个充满 FoxPro 7 dbf 的目录中。

当我尝试通过 Burrow 的 GenericDAO 保存新记录时,我得到一个异常,归结为“字段 XXX 不接受空值”,其中字段 XXX 是一个 NOT NULL 字段,它根本没有被映射,因为它不重要并且应留空。

我之前在直接使用 ADO.Net 和 OleDbConnection 时遇到过这个问题,发现在连接字符串中添加“;NULL=OFF”可以解决问题。

我已经在连接字符串中尝试了“NULL=OFF”、“NULL=NO”以及提供者的“VFPOLEDB”和“VFPOLEDB.1”。它仍然尝试自动将 NULL 插入“INSERT (field1, field2, ...) VALUES (?, ?, ? ...)”语句中缺少的字段(即,我没有映射的那些字段)。

有任何想法吗?

这是我对 FoxPro 表的流利配置:

string connString = "Provider=VFPOLEDB.1;Data Source="
  + @"D:\Documents\Work\Projects\OurProjects\Clients\Client1\Testing\Data"
  + ";NULL=NO;";

Fluently.Configure(nhCfg)
  .Database(JetDriverConfiguration.Standard.ConnectionString(connString)
  .Dialect<GenericDialect>().Driver<OleDbDriver>())
  .Mappings(m => m.FluentMappings.AddFromAssembly(
    Assembly.Load("OurProduct.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")))
  .BuildConfiguration();

映射类,这些被插入的实际表有几十个未映射的字段,所有字段都不是空的,它们在新记录上都应该是空白的:

    public class ClientMap : ClassMap<Client>
    {
        public ClientMap() {
            Id(x => x.PersonId).GeneratedBy.Assigned();
            Map(x => x.LastName).Length(15);
            Map(x => x.FirstName).Length(15);
            Map(x => x.MiddleName).Column("midname").Length(1);
            Map(x => x.Address1).Length(40);
            Map(x => x.Address2).Length(40);
            Map(x => x.City).Length(20);
            Map(x => x.State).Length(2);
            Map(x => x.ZipCode).Length(9);
            Map(x => x.Gender).Length(30);
            Map(x => x.Ethnicity).Length(30);
            Map(x => x.MaritalStatus).Column("marital").Length(30);
            Map(x => x.LivingArrangement).Column("livarrange").Length(30);
            Map(x => x.PovertyLevel).Column("povlevel").Length(30);
            Map(x => x.BirthDate);
            Map(x => x.AssessmentNotes).Column("assnotes");
        }
    }
4

2 回答 2

1

执行以下操作似乎可以解决问题,但我认为需要为每个新的工作单元(BurrowFramework 初始化)做。

        var sess = bf.GetSession(typeof(Client));

        var dbCmd = sess.Connection.CreateCommand();

        dbCmd.CommandType = System.Data.CommandType.Text;
        dbCmd.CommandText = "SET NULL OFF";

        sess.Transaction.Enlist(dbCmd);


        dbCmd.ExecuteNonQuery();
于 2009-12-09T21:16:40.617 回答
0

OLE-DB 属性DBPROP_VFPOLEDB_NULL等效于 SET NULL。

于 2009-12-10T13:20:47.973 回答