2017-09-26 102 views
3

這裏我再次尋求幫助。 :) 我試圖插入數據到我的MySQL數據庫使用F#。 我的模式包括3個表(實驗,基因及其結果):在所有表中的MySQL數據庫中插入數據

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

現在,我試圖將數據添加到使用sqlProvider的分貝。

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 感謝你我已經學會了很多阿爾雷,我不敢相信!^-^

解決方案:所以,我發現問題是我必須查詢實驗和基因的ID ..所以我改變了一些東西。現在我有3個功能(每個表)和一個結果將結果值之前做一個小的查詢:

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

我還沒有真正嘗試過這一點,所以它可能不會是正確的 - 但我認爲一個戰略,應努力將首先與Gene紀錄GeneName插入Experiment記錄(與ExpName)在一起。

當您再撥打SubmitUpdates時,提供商應該插入兩條記錄(這些記錄應該有效,因爲它們具有所需的所有字段)並填充插入記錄的Experiment idGene id屬性。

然後您將擁有這些ID,因此您應該嘗試使用所有正確的ID創建一個新的Result記錄,然後插入它並再次呼叫SubmitUpdates

(可能有更好的方法,但這可能會訣竅...)

+0

好吧,謝謝你分享你的想法! :)我試圖去這種方式,但現在我得到「未更改的實體遇到更新列表 - 這應該是不可能的!」。 >。< –

+0

@IsabellaNavarro聽起來不太好!你可以編輯你的問題,幷包括更新的代碼? –

相關問題