2012-08-08 120 views
1

我正在改進控制檯應用程序的過程中,此刻我無法獲取它來更新行,而不是創建一個新的行,其中包含更新的信息。C# - 使用LINQ更新行

class Program 
{ 
    List<DriveInfo> driveList = DriveInfo.GetDrives().Where(x => x.IsReady).ToList<DriveInfo>(); //Get all the drive info 
    Server server = new Server(); //Create the server object 
    ServerDrive serverDrives = new ServerDrive(); 

    public static void Main() 
    { 
     Program c = new Program(); 
     c.RealDriveInfo(); 
     c.WriteInToDB(); 
    } 

    public void RealDriveInfo() 
    { 


     //Insert information of one server 
     server.ServerID = 0; //(PK) ID Auto-assigned by SQL 
     server.ServerName = string.Concat(System.Environment.MachineName); 

     //Inserts ServerDrives information. 
     for (int i = 0; i < driveList.Count; i++) 
     { 

      //All Information used in dbo.ServerDrives     
      serverDrives.DriveLetter = driveList[i].Name; 
      serverDrives.TotalSpace = driveList[i].TotalSize; 
      serverDrives.DriveLabel = driveList[i].VolumeLabel; 
      serverDrives.FreeSpace = driveList[i].TotalFreeSpace; 
      serverDrives.DriveType = driveList[i].DriveFormat; 
      server.ServerDrives.Add(serverDrives); 

     } 
    } 

    public void WriteInToDB() 
    { 
     //Add the information to an SQL Database using Linq. 
     DataClasses1DataContext db = new DataClasses1DataContext(@"sqlserver"); 
     db.Servers.InsertOnSubmit(server); 
     db.SubmitChanges(); 

我想它使用信息的更新將是RealDriveInfo()方法,這樣,而不是創建新條目它運行的方法,然後從方法插入信息更新當前存儲的信息,如果需要意志輸入一個新條目,而不是每次輸入新條目時都輸入新條目。

目前正在運行該方法,收集相關數據,然後在兩個表中作爲新行輸入。

任何幫助,將不勝感激:)

回答

4

,那是因爲你每次做一個新的服務器對象,然後調用InsertOnSubmit()每次創建一個新的數據庫的條目 - 這將插入(創建)一個新的記錄。

我不完全知道你正在嘗試做的,但DB更新將涉及選擇現有記錄,修改它,然後將其附着到數據上下文和調用的SubmitChanges()。

這篇關於Updating Entities(Linq toSQL)的文章可能會有所幫助。

+0

只是爲了澄清,我想要做的是讓我的數據庫更新RealDriveInfo方法收集的信息。它所做的是創建一個新條目,並將更新後的TotalSpace和FreeSpace變量添加到數據庫中,我想要的是查找服務器的名稱(例如Server1),然後更新信息而不是添加新條目。 – Ghostyy 2012-08-09 08:24:03

+0

因此,首先您可以選擇保存在數據庫中的所有服務器條目。然後你會循環訪問driveList(和你一樣)。如果driveList [i]不存在於您選擇的服務器條目列表中=插入新服務器;否則用當前的潛水錶數據更新現有的服務器列表條目。 – 2012-08-09 08:59:20

+0

這就是我想要做的,但我只是不知道如何得到一個查詢循環driveList .. – Ghostyy 2012-08-09 09:13:55

3

問題是,您正在嘗試使用旨在提供面向對象查詢的工具來實現Update功能。 LINQ允許更新存在的記錄,但你必須以適當的方式使用它來實現這一點。

正確的方法是從數據庫中獲取要更新的數據,執行修改並將其刷新回數據庫。因此,假設有表中的數據上下文命名爲Servers,這裏是一個抽象的例子:

DataClasses1DataContext db = new DataClasses1DataContext(@"sqlserver"); 
var servers = db.Servers.Where(srv=>srv.ID>1000); //extracting all servers with ID > 100 using lambda expression 
foreach (server in servers){ 
    server.Memory *=2; //let's feed them up with memory 
} 
db.Servers.SubmitChanges(); 

另一種方式來實現這一目標是創建一個實體,不是使用Table.Attach方法將其連接到DataContext,但它是一個相當滑坡,所以我不建議你把它,除非你有你的LINQ技能提高。

有關詳細說明,請參見

  1. SubmitChanges
  2. Lambda Expressions
0

我知道問什麼,我沒有一個簡單的答案。

例如,您有一種值的形式,其中幾個值會發生變化,也可能有一些計算結果。或者表單可以包含新記錄。

創建值

myrecord = new MyRecord() 

然後在myRecord填寫的記錄。在你甚至觸摸數據庫本身之前做你想要的驗證/計算。

// GetID或者返回一個現有的ID,或者如果這是一條新記錄,它將返回一個零。

myrecord.id = GetIDForRecordOrZeroIfANewRecord(uniqueName); 
myrecord.value1 = txtValue1.text; 
myrecord.value2 = (DateTime)dtDate.value; 

等通過字段。

您現在有記錄,如果id爲零,您可以將其添加爲新記錄。但是,如果ID是現有記錄你似乎有使用LINQ別無選擇,除了有寫從myrecord每個值的函數,所以你必須有一個包含類似的功能 -

var thisRecord = from n in mydatacontext.MyTable 
    where n.id == myrecord.id 
    select n; 

thisrecord.value1 = myrecord.value1; 
thisrecord.value2 = myrecord.value2; 

等通過所有領域。

我這樣做,但是當我已經在myrecord中準備好所有的信息時,它似乎很長時間囉嗦。一個簡單的功能

mydatacontext.MyTable.Update(myrecord); 

會是理想的。事實上與我在其他數據庫中存儲SQL函數時所做的事情類似,它簡化了記錄的傳輸,而不是新的記錄。