我正在使用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();
映射类,这些插入的实际表有几十个未映射的字段,都是NOT NULL,它们在新记录中都应该是空白的:
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");
}
}
答案 0 :(得分: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();
答案 1 :(得分:0)
OLE-DB属性DBPROP_VFPOLEDB_NULL等效于SET NULL。