2

Inventory というテーブルがあり、その最初の行を削除したいと考えています。そのために、InventoryDAL という名前のクラスを作成しました。コードは次のとおりです。

public class InventoryDAL
{
    private string cnString = string.Empty;
    private SqlDataAdapter da = null;

    public InventoryDAL(string connectionString)
    {
        cnString = connectionString;
        da = new SqlDataAdapter("Select CarID, Make, Color, PetName From Inventory",
            connectionString);
        SqlCommandBuilder builder = new SqlCommandBuilder(da);
        da.DeleteCommand = builder.GetDeleteCommand();
        da.InsertCommand = builder.GetInsertCommand();
        da.UpdateCommand = builder.GetUpdateCommand();
    }

    public DataTable Inventory()
    {
        DataTable dt = new DataTable();
        da.Fill(dt);
        return dt;
    }

    public void UpdateInventory(DataTable modifiedTable)
    {
        da.Update(modifiedTable);
    }
}

また、それを試すために小さなプログラムを作成しました:

class Program
{
    static void Main(string[] args)
    {
        InventoryDAL inv = new InventoryDAL(@"Data Source=MYPC;Initial Catalog=AutoLot;Integrated Security=True;Pooling=False");
        DataTable dt = inv.Inventory();
        dt.Rows.RemoveAt(0);
        inv.UpdateInventory(dt);
        Console.ReadKey(true);
    }}

しかし、それは機能していません。.Update()いくつかの試行の後、データを挿入するときにのみ機能することに気付きました。

4

1 に答える 1

0

DataTable.RemoveAt() を使用すると、DataTable オブジェクトから行が完全に削除されるため、SqlDataAdapter はデータ ソースで行を削除することを認識しません。DataTable.Rows[x].Delete() メソッドを使用する必要があります。これにより、行に削除のマークが付けられるため、アダプターはその行で SQL delete ステートメントを呼び出す必要があることを認識します。

したがって、コードは次のようになります。

class Program
{
    static void Main(string[] args)
    {
        InventoryDAL inv = new InventoryDAL(@"Data Source=MYPC;Initial Catalog=AutoLot;Integrated Security=True;Pooling=False");
        DataTable dt = inv.Inventory();
        dt.Rows[0].Delete();
        inv.UpdateInventory(dt);
        Console.ReadKey(true);
    }
}

変更がデータ ソースにプッシュ バックされる方法の詳細については、こちらを参照してください。

于 2013-04-15T20:38:23.233 に答える