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()を呼び出すため、毎回新しいdbエントリが作成されます。これにより、新しいレコードが挿入(作成)されます。

何をしようとしているのか完全にはわかりませんが、データベースの更新では、既存のレコードを選択して変更し、データコンテキストにアタッチして、SubmitChanges()を呼び出す必要があります。

エンティティの更新(Linq toSQL)に関するこの記事が役立つ場合があります。

于 2012-08-08T15:50:38.350 に答える
3

問題は、Updateオブジェクト指向のクワイアリングを提供するように設計されたツールを使用して機能を実現しようとしていることです。LINQでは既存のレコードを更新できますが、これを実現するには適切な方法で使用する必要があります。

適切な方法は、更新するデータをDBからフェッチし、変更を実行してから、それをDBにフラッシュバックすることです。したがって、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();

これを実現するもう1つの方法は、Table.AttachDataContextメソッドを使用してエンティティをアタッチするのではなく、エンティティを作成することですが、かなり滑りやすい坂道なので、LINQスキルが向上していない限り、エンティティを作成することはお勧めしません。

詳細な説明については、を参照してください。

  1. SubmitChanges
  2. ラムダ式
于 2012-08-08T15:52:21.847 に答える
1

私は何が求められているのか理解しており、簡単な答えはありません。

たとえば、値の形式があり、値のいくつかが変更され、場合によっては計算されます。または、フォームに新しいレコードを含めることができます。

値の記録を作成します

myrecord = new MyRecord()

次に、myRecordに入力します。データベース自体に触れる前に、必要な検証/計算を実行します。

// GetIDは、既存のIDを返すか、これが新しいレコードの場合はゼロを返します。

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

など、フィールドを介して。

これでレコードが作成されました。idがゼロの場合は、新しいレコードとして追加できます。ただし、idが既存のレコードである場合、myrecordから各値を書き込む関数があることを除いて、Linqを選択することはできないようです。したがって、次のような関数を含める必要があります。

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 に答える