2

NHibernateとBurrowおよびFluentを使用して、SQLServer2005からFoxPro7dbfでいっぱいのディレクトリにデータをシャトルしています。

BurrowのGenericDAOを使用して新しいレコードを保存しようとすると、「フィールドXXXはnull値を受け入れません」という例外が発生します。ここで、フィールドXXXはNOT NULLフィールドであり、重要ではないため、まったくマップされていません。空白のままにします。

以前、ADO.NetとOleDbConnectionを直接使用しているときにこれに遭遇し、接続文字列に「; NULL=OFF」を追加すると問題が解決することがわかりました。

接続文字列に「NULL=OFF」、「NULL = NO」、プロバイダーに「VFPOLEDB」と「VFPOLEDB.1」を試してみました。それでも、「INSERT(field1、field2、...)VALUES(?、?、?...)」ステートメントから欠落しているフィールド(つまり、マップしなかったフィールド)にNULLを自動的に挿入しようとします。

何か案は?

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");
        }
    }
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は、SETNULLと同等です。

于 2009-12-10T13:20:47.973 に答える