【发布时间】:2014-02-08 12:50:15
【问题描述】:
我目前正在学习 Web 开发人员,并且正在学习 ASP.NET WEBFORMS。 我有一个关于 DataAdapter 和更新/删除表的问题。
我想知道执行此操作的正确方法。假设我有这个方法。
更新方法
public void UpdateDataTable()
{
SqlConnection conn = new SqlConnection(strcon);
SqlDataAdapter da = null;
DataSet ds = null;
DataTable dt = null;
string sqlsel = "SELECT ActId, Title FROM Act WHERE ArtistId = " + Session["UserId"];
try
{
da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(sqlsel, conn);
ds = new DataSet();
da.Fill(ds, "MyTable");
dt = ds.Tables["MyTable"];
Gridview1.DataSource = dt;
Gridview1.DataBind();
}
catch (Exception ex)
{
LabelMessage.Text = ex.Message;
}
finally
{
conn.Close();
}
}
我在页面加载到(!Page.IsPostBack) 时调用此方法。所以我的问题是,因为 DataSet 将它全部保存在内存中(DataTable 也是)。我想再次用 DataAdapter 对象更新一行,哪种方法最好用?在点击事件中。
方法一
protected void ButtonUpdate_Click1(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(strcon);
SqlDataAdapter da = null;
string sqlupd = "UPDATE [Act] SET [Title] = @Title, [Description] = @Description, [Duration] = @Duration WHERE [ActId] = @ActId";
try
{
conn.Open();
da = new SqlDataAdapter();
da.UpdateCommand = new SqlCommand(sqlupd, conn);
da.UpdateCommand.Parameters.AddWithValue("@Title", TextBoxTitle.Text);
da.UpdateCommand.Parameters.AddWithValue("@Description", TextBoxText.Text);
da.UpdateCommand.Parameters.AddWithValue("@Duration", TextBoxDuration.Text);
da.UpdateCommand.Parameters.AddWithValue("@ActId", LabelID.Text);
da.UpdateCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
LabelMessage.Text = "" + ex.Message;
}
finally
{
conn.Close();
}
// Call the Update Method
UpdateDataTable();
}
或者最好再次填充所有内容,并将其放入 DataSet -> DataTable 中?像这样。
方法二
protected void ButtonUpdate_Click1(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(strcon);
SqlDataAdapter da = null;
DataSet ds = null;
DataTable dt = null;
SqlCommand cmd = null;
string sqlsel = "SELECT * FROM Act WHERE ArtistId = " + Session["UserId"];
string sqlupd = "UPDATE [Act] SET [Title] = @Title, [Description] = @Description, [Duration] = @Duration WHERE [ActId] = @ActId";
try
{
da = new SqlDataAdapter();
da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(sqlsel, conn);
ds = new DataSet();
da.Fill(ds, "MyTable");
dt = ds.Tables["MyTable"];
dt.Rows[Gridview1.SelectedIndex]["Title"] = TextBoxTitle.Text;
dt.Rows[Gridview1.SelectedIndex]["Description"] = TextBoxText.Text;
dt.Rows[Gridview1.SelectedIndex]["Duration"] = TextBoxDuration.Text;
// UPDATE
cmd = new SqlCommand(sqlupd, conn);
cmd.Parameters.Add("@Title", SqlDbType.NVarChar, 50, "Title");
cmd.Parameters.Add("@Description", SqlDbType.Text, 250, "Description");
cmd.Parameters.Add("@Duration", SqlDbType.Int, 4, "Duration");
SqlParameter parm = cmd.Parameters.Add("@ActId", SqlDbType.Int, 4, "ActId");
parm.SourceVersion = DataRowVersion.Original;
da.UpdateCommand = cmd;
da.Update(ds, "MyAct");
}
catch (Exception ex)
{
LabelMessage.Text = "" + ex.Message;
}
finally
{
conn.Close();
}
UpdateDataTable();
;
}
那么哪种方法最好用呢?为什么? :)
【问题讨论】:
-
为什么是网络表单?!无论如何,您的数据应该来自服务,也就是说,您不能从 UI 后面的页面访问数据库。这意味着数据集和合作不是您做事的最佳选择。如果你正在学习,至少从一开始就尝试学习好的做法,以后改变你的习惯就更难了
-
感谢 MikeSW 的回答!那么为什么是网络表单?我问过自己同样的问题,但这是学习课程的一部分。所以我们不得不学习它,这个学期之后我会看看 .NET MVC :) 但这实际上来自一个学校项目(已经交付),其中一个目标是你应该使用 DataAdapter,我知道在在这种情况下,读取表的 DataReader 和带有 ExecuteNonQuery 的简单命令可能会更好,因为我只使用一个表。
-
如果是为了学校,别担心,希望你在现实世界中不需要这个。
-
如果只有一个表,为什么要使用数据集? DataAdapter 可以直接填充一个DataTable。
-
@MikeSW 我很高兴你这么说,希望你是对的!
标签: c# asp.net ado.net dataset dataadapter