2017-09-26 26 views
3

ここもう一度私は助けを求めています。 :) F#を使用してMySQLデータベースにデータを挿入しようとしています。 私のスキーマは、3つのテーブル(実験、遺伝子および結果)が含まれます。今すぐすべてのテーブルのMySQLデータベースにデータを挿入してください

Experiments   |  Results   |  Gene 
Experiment id  |  Experiment id  |  Gene id 
Experiment name  |  Gene id   |  Gene Name       
        |  Value    | 

を、私はSQLProviderを使用してDBにデータを追加しようとしています。

let db = sql.GetDataContext() 

let gene_tb = db.Vp32.Genes 
let exp_tb = db.Vp32.Experiments 
let results_tb = db.Vp32.Results 

let createNewInput (genename: string) (expname: string) res = 
    let newRes = results_tb.Create() 
    let newGene = gene_tb.Create() 
    let newExp = exp_tb.Create() 

    newGene.GeneName <- genename 
    newExp.ExpName <- expname 
    newRes.ResultVal <- Some res 

createNewInput "test1" "experiment_test1" (float32 999.5) 

db.SubmitUpdates() 

私はそれが結果値実験や遺伝子IDSにリンクされていることを理解させるために問題を抱えています。送信しようとするとエラーが発生します: "フィールド 'Exp_id'にはデフォルト値"がありません。まあ、それは他のテーブルのIDでなければならないので、デフォルト値はありません。ああ、..これらのIDは自動増加に設定されています。 さらに、新しいデータを追加するたびに、実験名が既にテーブルに存在する場合は、IDを増やすべきではありません。この場合、または 'if ... then'を使用している特定のコードのための 'トリガー'のような何かをする必要がありますか?

ありがとうございます! :D あなたのおかげで、私はすでにsoooを多くのalredy学んだ、私は信じられない!^-^

解決策:私は実験と遺伝子のIDを照会しなければならないという問題があることを知りました。今の私は3つの機能(各テーブルに1つ)との結果に1つの結果値を追加する前に、小さなクエリを実行している:

let addNewExp (expname: string)= 
    let newExp = exp_tb.Create() 
    newExp.ExpName <- expname 
    db.SubmitUpdates() 

let addNewGene (genename: string)= 
    let newGene = gene_tb.Create() 
    newGene.GeneName <- genename 
    db.SubmitUpdates() 

let addNewRes (expName: string) (geneName: string) res = 
    let tempExpId = 
     query { 
      for experiment in exp_tb do 
       where (experiment.ExpName = expName) 
       select experiment.ExpId 
      } 
     |> Seq.head 

    let tempGeneId = 
     query { 
      for gene in gene_tb do 
       where (gene.GeneName = geneName) 
       select gene.GeneName 
      } 
     |> Seq.toArray |> String.concat "" 

    let newRes = results_tb.Create() 
    newRes.ExpId <- tempExpId 
    newRes.GeneId <- tempGeneId 
    newRes.ResultVal <- Some res 
    db.SubmitUpdates() 

は確かに、それは何かを追加する前に、ID値を取得するためにクエリを実行する必要があります連想表(結果)に表示されます。その後、クエリがシーケンス(Seq)として返されるので、私はちょうど正しい型(データベースに記述されている)に変換しました。 これは将来誰かを助けることもできれば幸いです。

答えて

2

私は実際にこれを試していないので、それは右ではないかもしれません - しかし、私は動作するはず1つの戦略は最初GeneNameGeneレコードと一緒に(ExpName付き)Experimentレコードを挿入することだと思います。

SubmitUpdatesを呼び出すと、プロバイダは2つのレコード(必要なすべてのフィールドを持つため動作するはずです)を挿入し、挿入されたレコードのExperiment idおよびGene idのプロパティを入力する必要があります。

あなたはこれらのIDを持っているので、正確なIDをすべて入れた新しいResultレコードを作成し、挿入してSubmitUpdatesに再度電話する必要があります。

(より良い方法があるかもしれませんが、これはトリックを行うことができます...)

+0

あなたのアイデアを共有してくれてありがとう! :)私はこのようにしてみようとしていますが、今は "更新リストでエンティティが変更されていません - これは不可能です!" >。< –

+0

@IsabellaNavarroそれはとても素晴らしいとは思わない!あなたの質問を編集し、更新されたコードを含めることができますか? –

関連する問題