2012-08-08 125 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函数时所做的事情类似,它简化了记录的传输,而不是新的记录。