我正在改进控制台应用程序,目前我无法更新行,而只是创建一个包含更新信息的新行。
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()
方法,因此它不是创建新条目,而是通过运行方法然后插入方法中的信息来更新当前存储的信息,如果需要,输入新条目,而不是每次有新信息时输入新条目。
目前正在运行该方法,收集相关数据,然后将其作为两个表中的新行输入。
任何帮助将不胜感激:)
答案 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技能。
有关详细说明,请参阅
答案 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函数所做的事情相比,它简化了更新而非新的记录的传输。