1

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

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

3 回答 3

4

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

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

这篇关于更新实体(Linq toSQL) 的文章可能会有所帮助。

于 2012-08-08T15:50:38.350 回答
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();

实现此目的的另一种方法是创建一个实体,而不是将其附加到DataContextusing Table.Attach方法,但这是一个很滑的斜坡,所以我不建议您使用它,除非您的 LINQ 技能有所提高。

有关详细说明,请参阅

  1. 提交更改
  2. Lambda 表达式
于 2012-08-08T15:52:21.847 回答
1

我明白被问到什么,但我没有一个简单的答案。

例如,您有一个值的形式,其中几个值发生了变化,也许有一些是计算出来的。或者表单可以包含新记录。

您创建值的记录

myrecord = new 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;

等等通过所有领域。

我这样做了,但是当我已经在我的记录中准备好所有信息时,这似乎很啰嗦。一个简单的函数

mydatacontext.MyTable.Update(myrecord);

将是理想的。事实上,与我在其他数据库中存储 SQL 函数所做的类似,它简化了更新而不是新记录的传输。

于 2015-03-04T12:40:28.143 回答