Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataAdapter,更新哪种方法?_C#_Asp.net_Ado.net_Dataset_Dataadapter - Fatal编程技术网

C# DataAdapter,更新哪种方法?

C# DataAdapter,更新哪种方法?,c#,asp.net,ado.net,dataset,dataadapter,C#,Asp.net,Ado.net,Dataset,Dataadapter,我目前作为web开发人员学习,正在学习ASP.NET WEBFORMS。 我有一个关于DataAdapter和更新/删除表的问题 我想知道哪种方法是正确的。假设我有这个方法 更新方法 public void UpdateDataTable() { SqlConnection conn = new SqlConnection(strcon); SqlDataAdapter da = null; DataSet ds = null;

我目前作为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)
中时,我调用此方法。所以我的问题是,因为数据集将所有数据都保存在内存中(DataTable也是)。我想再次用DataAdapter对象更新一行,哪种方法是最好的?在单击事件中

方法1

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中更好?像这样

方法2

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();
;
        }

那么,哪种方法是最好的?为什么?:)

两者都不是一个好选择,在代码隐藏/controller/view中放置任何DAL代码都是一个很大的禁忌,而且是一种非常短视的编码实践。您应该有一些基本的模型、业务逻辑和DAL命名空间类可供使用。

为什么使用web表单?!无论如何,您的数据应该来自一个服务,也就是说,您不需要从用户界面后面的页面访问数据库。这意味着data Set&co.并不是你做事的最佳选择。如果你正在学习,至少从一开始就要努力学习好的习惯,以后要改变你的习惯就难多了。谢谢你的回答!为什么是网络表单?我问自己同样的问题,但这是学习课程的一部分。所以我们不得不学习它,本学期结束后,我将学习.NET MVC:),但这实际上来自一个学校项目(已经交付),其中一个目标是您应该使用DataAdapter,我知道在这种情况下,一个用于读取表的DataReader和一个带有ExecuteOnQuery的简单命令可以更好地工作,因为我只处理一个表。如果是学校用的,不要担心,希望在现实世界中您不需要它。如果只有一个表,为什么要使用数据集?DataAdapter可以直接填充数据表。@MikeSW我很高兴你这么说,希望你是对的!谢谢,朋友,我不知道。但不幸的是,我的学校就是这样教我们的:/。但我很高兴你告诉我事情的真相!