使用SqlDataAdapter更改未保存到数据库

时间:2014-11-25 12:34:35

标签: c# sql-server database sqldataadapter

我一直坚持不将我的更改保存到SQL Server数据库。

我可以正确读取数据库,当调用从数据库刷新的RefreshGrid()时,gridview会正确更新。但是,当重新启动程序或检查实际数据库时,则不会发生更改。

我通常会使用Entity Framework,但有时需要学习其他方法。

private string conString = ConfigurationManager.ConnectionStrings["RewardsConnectionString"].ConnectionString;
private RewardsDS rewardsDset = new RewardsDS();

private SqlDataAdapter CreateDataAdapter(SqlConnection conn)
{
    // Build the selection query.
    SqlDataAdapter rewardsAdapter = new SqlDataAdapter();
    SqlCommand selectCommand = new SqlCommand("SELECT * FROM Purchases", conn);
    rewardsAdapter.SelectCommand = selectCommand;

    // Build the insertion query
    SqlCommand insertCommand = new SqlCommand(
        @"INSERT INTO Purchases (PurchaseDate, Amount, CustomerId)
        VALUES (@PurchaseDate, @Amount, @CustomerId)", conn);

    insertCommand.Parameters.Add("@PurchaseDate", SqlDbType.DateTime, 0, "PurchaseDate"); // Not sure about this zero ...
    insertCommand.Parameters.Add("@Amount", SqlDbType.Decimal, 0, "Amount");
    insertCommand.Parameters.Add("@CustomerId", SqlDbType.Int, 0, "CustomerId");

    rewardsAdapter.InsertCommand = insertCommand;

    // Build the update query
    SqlCommand updateCommand = new SqlCommand(
        @"UPDATE Purchases SET Amount = @Amount, PurchaseDate = @PurchaseDate WHERE PurchaseId = @PurchaseId", conn);
    updateCommand.Parameters.Add("@Amount", SqlDbType.Decimal, 0, "Amount");
    updateCommand.Parameters.Add("@PurchaseDate", SqlDbType.DateTime, 0, "PurchaseDate");

    SqlParameter param = updateCommand.Parameters.Add("@PurchaseId", SqlDbType.Int, 0, "PurchaseId");
    param.SourceVersion = DataRowVersion.Original;
    rewardsAdapter.UpdateCommand = updateCommand;

    // Build the delete query
    SqlCommand deleteCommand = new SqlCommand(
        "DELETE FROM Purchases WHERE PurchaseId = @PurchaseId", conn);
    param = deleteCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "PurchaseId");
    param.SourceVersion = DataRowVersion.Original;
    rewardsAdapter.DeleteCommand = deleteCommand;

    return rewardsAdapter;
}

// Gets changes and saves them to the database.
private void SaveChanges()
{
    using (SqlConnection conn = new SqlConnection(conString))
    {
        var fadapter = CreateDataAdapter(conn);
        conn.Open();
        DataSet changes = rewardsDset.GetChanges();

        try
        {
            fadapter.Update(changes, "Purchases");
        }
        catch (Exception ex)
        {
            MessageBox.Show("There are no updates to be saved");
        }

        conn.Close();
        rewardsDset.AcceptChanges();
    }
}

// Refresh the dataGridView from the database
private void RefreshGrid()
{
    rewardsDset.Clear();

    using (SqlConnection conn = new SqlConnection(conString))
    {
        conn.Open();
        SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT * FROM Purchases", conn);
        myAdapter.Fill(rewardsDset, "Purchases");
        conn.Close();

        dataGridView1.DataSource = null;
        this.dataGridView1.DataSource = rewardsDset.Tables["Purchases"];
    }
}

2 个答案:

答案 0 :(得分:2)

您只需执行查询:

 rewardsAdapter.InsertCommand.ExecuteNonQuery();

答案 1 :(得分:0)

我会先为浪费任何人的时间而道歉。最后找到导致这个错误的原因,它比我想象的要基本得多,而且根本不是我一直在寻找解决方案的地方。 关于连接字符串,我犯了一个令人尴尬的错误,但如果有人重复我的错误就是这样:

我一直在使用DataSet的连接字符串,而不是实际的数据库......

添加正确的连接字符串肯定解决了我的问题,当然任何人都不可能只看到我上面发布的代码。

相关问题