C# - 使用LINQ更新行

时间:2012-08-08 15:37:12

标签: c# sql linq row

我正在改进控制台应用程序,目前我无法更新行,而只是创建一个包含更新信息的新行。

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()方法,因此它不是创建新条目,而是通过运行方法然后插入方法中的信息来更新当前存储的信息,如果需要,输入新条目,而不是每次有新信息时输入新条目。

目前正在运行该方法,收集相关数据,然后将其作为两个表中的新行输入。

任何帮助将不胜感激:)

3 个答案:

答案 0 :(得分:4)

每次都在创建一个新的db条目,因为每次都要创建一个新的服务器对象,然后调用InsertOnSubmit() - 它会插入(创建)一个新记录。

我不完全确定你要做什么,但db更新会涉及选择现有记录,修改它,然后将其附加回数据上下文并调用SubmitChanges()

关于Updating Entities(Linq toSQL)的这篇文章可能会有所帮助。

答案 1 :(得分:3)

问题在于您尝试使用旨在提供面向对象查询的工具来实现Update功能。 LINQ允许更新exisitng记录,但您必须以正确的方式使用它来实现此目的。

正确的方法是从数据库中获取要更新的数据,执行修改然后将其刷新回数据库。因此,假设您的数据上下文中有一个名为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

答案 2 :(得分: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);

会很理想。实际上Simmilar与我在其他数据库中存储的SQL函数所做的事情相比,它简化了更新而非新的记录的传输。