现在有个问题困扰我很长时间,我是从asp直接转到asp.net2.0的,在ASP.NET2.0中对数据库进行插入、删除、查询、修改四项操作时,我发现有好种方法,现在我搞不清该用哪种:1. 最初我用SqlDataSource+GridView之类的快捷操作,但不久发现这个方法只在简单的情况下快捷,不通用,不灵活。2.后来用Command,类似下面的方法: SqlCommand command = new SqlCommand("INSERT INTO UserPhoto (UserName,ContentType,Photo)" +
    "VALUES (@UserName,@ContentType,@Photo)", myConnection);
//使用Parameters.AddWithValue实现对参数的赋值
    command.Parameters.AddWithValue("@UserName", TextBox1.Text);
    command.Parameters.AddWithValue("@ContentType", fileType);
    command.Parameters.AddWithValue("@Photo", fileData);
    //打开连接,执行查询
    myConnection.Open();
    command.ExecuteNonQuery();
    myConnection.Close();
2.又发现有人使用SqlDataSource,类似下面的代码:  protected void btnInsert_Click(object sender, EventArgs e)
    {
        SqlDataSource sds = new SqlDataSource();
        sds.ConnectionString = ConfigurationManager.ConnectionStrings["ConnStr"].ToString();
        sds.InsertCommand = "Insert into T_Product(F_Name,F_Price,F_Unit) values(@Name,@Price,@Unit)";
        sds.InsertParameters.Add("Name", txtName.Text.Trim());
        sds.InsertParameters.Add("Price", txtPrice.Text.Trim());
        sds.InsertParameters.Add("Unit", txtUnit.Text.Trim());
        sds.Insert();
    
    }3.有人直接用DataSet,操作行对象、列对象4.有人创建一个数据操作的类,将用到的各个插入、删除、查询等当作类的方法,调用方法来操作数据.5。还有人在VS2005中新建数据集,创建.xsd文件来执行一些类似操作,有时还配合ObjectDataSource控件
   我现在被搞的晕极了,不知通常情况下,应该用哪种方法,查了一下msdn,好像上面这些方法都能找到影子,但我真想知道哪种方法才是大家最常用的,通用的方法是什么?请高人伸出你热情的手,指点一下吧!

解决方案 »

  1.   

    增 删 改
    SQL SERVER我是认为应该放在存储过程里
    不仅仅从效率上提升
    可能你对增删改有事务的放在存储过程里也能更好的处理
    论开发效率 运行效率和维护性 来说 存储过程是最好查的话 涉及到复杂点的语句我一般也是放在存储过程里如果非要放在CS里的话 , 一定要参数化SQL语句 最大的好处是可以防止注入
    而且维护也相对轻松
      

  2.   

    1. 最初我用SqlDataSource+GridView之类的快捷操作,但不久发现这个方法只在简单的情况下快捷,不通用,不灵活。
    ==================================
    这个是给初学者用的,不能实现复杂的功能2.后来用Command,类似下面的方法:
    ==================================
    这个是纯写代码方式的,适合从2003转过来的
    3.又发现有人使用SqlDataSource,类似下面的代码:
    ==================================
    我一般教初学者都是方法 2 + 3,简单的功能用3,复杂的功能用2实现,用3的好处是不用再关心数据库的连接和打开,这些优化的工作可以让SqlDataSource完成4.有人直接用DataSet,操作行对象、列对象
    ==================================
    如果只是读数据,没必要用4,如果是进行简单的增删改,也没必要用4,如果你要打算对数据进行比较复杂的操作,可以用4,尤其适合winform类应用程序5.有人创建一个数据操作的类,将用到的各个插入、删除、查询等当作类的方法,调用方法来操作数据.
    ==================================
    使用三层架构的时候经常这样做6.还有人在VS2005中新建数据集,创建.xsd文件来执行一些类似操作,有时还配合ObjectDataSource控件
    ==================================
    如果是用强类型的DataSet,增加了开发效率,降低了系统的维护代价,对内存的消耗多一点
      

  3.   

    初学ado.net最好使用直接的操作
      

  4.   

    yfqvip(逝水无痕):初学ado.net最好使用直接的操作,指哪种,给个例子,好不?
      

  5.   

    高歌已经说的那么清楚了.去msdn查查,不管什么办法,先连上数据库再说我以前第一次连上数据库那天特兴奋,连上就去写了个日记.
      

  6.   

    还有,在网页上拖拽完SqlDataSource和GridView,detailsView,FromView控件后,如何和那些代码联系起来,如果都是手写代码,这些控件的优势(如自动插入,删除)不就没用了吗?
      

  7.   

    所谓的直接操作,就是自己手动去建立每一个对象
    比如SqlConnection,SqlDataAdapter,这样可以让你懂得一些东西的基本工作原理我个人建议是,结合PetShop4.0的SqlHelper来学,自己手动写一遍数据库操作类。
    然后你就知道你问的那些东西应该如何是从了;方法有很多种,你需要的是找到适合你的那种,先从基本入手吧。
    地基没打好,羡慕别人房子怎么盖是没用的。
      

  8.   

    这几种通常都要用到,我给你 个例子:
    这是mysql的,sqlserver的也一样,改的东西不多
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using MySql.Data.MySqlClient;
    using System.Text;
    /// <summary>
    /// DAO 的摘要说明
    /// </summary>
    public class DAO
    {
        private string connString;
        private MySqlConnection conn = null;
        private MySqlCommand cmd;
        private MySqlDataAdapter dataAdapter; public DAO()
    {
            this.connString = System.Configuration.ConfigurationManager.ConnectionStrings[0].ToString();
            this.conn = new MySqlConnection(connString);
        }    /// <summary>
        /// 实例化一个MySqlCommand对象
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <returns>MySqlCommand对象</returns>
        public MySqlCommand BuildCommand(string sql)
        {
            MySqlCommand myCmd = new MySqlCommand(sql, conn);
            myCmd.CommandTimeout = 0;//设置一条语句的执行时间为无限
            return myCmd;
        }   /// <summary>
       /// 获得一个DataSet。不需要打开、关闭数据库,直接调用就可以了
       /// </summary>
        /// <param name="sql">sql语句</param>
       /// <returns>DataSet集合</returns>
        public DataSet GetDateSet(string sql)
        {
            this.cmd = BuildCommand(sql);
            OpenConn();
            dataAdapter = new MySqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            dataAdapter.Fill(ds);
            CloseConn();
            return ds;
        }    /// <summary>
        /// 获得一个DataReader,已打开了与数据库的连接,完成所有操作后,必须调用CloseConn()方法关闭与数据库的连接
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <returns>DataReader</returns>
        public MySqlDataReader GetDataReader(string sql)
        {
            this.cmd = BuildCommand(sql);
            OpenConn();
            MySqlDataReader sdr=cmd.ExecuteReader();
            return sdr;
        }    /// <summary>
        /// 增、删、改 等操作都必须调用此方法。不需要打开、关闭数据库,直接调用就可以了
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <returns>受影响的行数</returns>
        public int Update(string sql)
        {
            this.cmd = BuildCommand(sql);
            OpenConn();
            int rowsAffected=cmd.ExecuteNonQuery();
            CloseConn();
            return rowsAffected;
        }
        /// <summary>
        /// 打开与数据库的连接
        /// </summary>
        public void OpenConn()
        {
            //检测数据库连接对象conn是否为空
            if (conn == null)
            {
                conn = new MySqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[0].ToString());
            }
            /*以上三行chz添加--2007年2月9日*/
            try
            {
                if ((conn != null)&&(conn.State != ConnectionState.Open)) 
                {
                    conn.Open();
                }
            }
            catch (MySqlException ex)
            {
                if ((conn != null) && (conn.State != ConnectionState.Closed)) 
                {
                    conn.Close();
                }
            }
        }    /// <summary>
        /// 关闭与数据库的连接
        /// </summary>
        public void CloseConn()
        {
            try
            {
                if ((conn != null) && (conn.State != ConnectionState.Closed)) 
                {
                    conn.Close();              
                }
            }
            catch (MySqlException ex)
            {        }
        }    /// <summary>
        /// 替换危险字符
        /// </summary>
        /// <param name="inputString"></param>
        /// <param name="MaxLength"></param>
        /// <returns></returns>
        public string ClearStringInput(string inputString)
        {//构造临时字符串数组
            StringBuilder retVal = new StringBuilder();
            if ((inputString != null) && (inputString != String.Empty))
            {
                //清空字符串两段的空白符号
                inputString = inputString.Trim();
                          
                for (int i = 0; i < inputString.Length; i++)
                {
                    switch (inputString[i])
                    {
                        //替换危险字符串
                        case '"': retVal.Append("&quot;"); break;
                        case '<': retVal.Append("&lt;"); break;
                        case '>': retVal.Append("&gt;"); break;
                        default: retVal.Append(inputString[i]); break;
                    }
                }
                //替换字符"'"
                retVal.Replace("'", " ");
            }
            return retVal.ToString();
        }}
      

  9.   

    5应该是最常用的,方便维护,如果需求变化了,改少量代码就可以了。
    生成三层架构,有代码生成器。xsd很耗内存,但是会防止并发。不过三层架构使用存储过程也可以防止并发
      

  10.   

    強烈建議:數據庫操作寫成一個通用的class,使用的時候,把參數傳入,而后得到返回值
    ----------
    不要依賴控件帶來的方便-----不能實現復雜功能;維護有難度~~~~
      

  11.   

    amandag(高歌) 总结得很好.我个人使用第6种方式,开发效率很高.
      

  12.   

    直接用sql语句写 或者用存储过程  利用sqlhelper
      

  13.   

    一般根据实际情况来定
    amandag(高歌)讲得很不错
      

  14.   

    最怕看到,“通用”二字,这是,需要,其他代价来换取的,比如性能与运行效率,比如开发效率,比如扩展性,后期维护行  ....做得越通用,某一方面牺牲得也就越多 ....且,各种需求是不一的,何来通用之说?看到,常有人问,“求一个高效的通用的分页存储过程”——
    无语,且不说,用存储过程分页是否真的就高效?通用的,必定在性能和扩展性上妥协,
    高效的查询,所使用的 SQL 与具体的数据库模式紧密相关
      

  15.   

    1. 最初我用 xxxDataSource + GridView之类的快捷操作,但不久发现这个方法只在简单的情况下快捷,不通用,不灵活。===========xxxDataSource + GridView/DataList/ ... 的确无法通用!!!但,它可以完成【任意的】【复杂的】【CRUD】!!!!!前提,你真的用心去研究,熟悉各种控件的用法
      

  16.   

    现实开发工作中,是不是用第5种?(自己编类那种)
    不是说ASP.NET可以比1.1减少70%的编码吗?在哪能体现出来?
    用SQLhelper不是让2.0和1.1都一样了吗?按照第5种做法数据库操作上没有什么本质变化呀?数据源控件引入的意义在哪?难道就是让我们初学者拖拽一下,做的简单的东西玩玩?做完了就在这迷茫?如果是这样,微软不如上来直接告诉我,想用asp.net2.0实际和1.1是一样的,真正解决问题还是要自己设计类或用SQLHelper,而不是我们新加的那几个新控件,WebCast上那些快捷操作的教程实际是误导你们的。实际开发中还是要回归到设计数据库操作类或引用SqlHelper,是这样吗?
      

  17.   

    对于小型项目,使用SqlDataSource还是很节省时间和代码的,其实基本就是说和数据库的交互我们不用操心,只要关心参数的值的变化即可实际应用中即时使用数据库操作类,还是可以使用ObjectDataSource来完成很多业务层的绑定工作
      

  18.   

    谢谢各位热心人,但在各位给的答案中,比较难把握的是“根据具体情况来定”,因为我还在仰视ASP.NET2.0,我现在需要一条爬上ASP.NET2.0这座山的路,一条比较方便的路。
    “视具体情况而定”我不清楚是哪些情况下对应哪种方法,能具体说明一下吗?
    再次感谢!
      

  19.   

    如果是初学者,先用1,能显示出来数据就不错了然后一定要学会2,要知道用1和2实现的功能完全一样,但现在是自己控制了那如何“根据具体情况来定”呢,举个例子在自己写页面的时候可能会发现有时页面需要容器控件的嵌套,比如DataList里每个ItemTemplate中有一个GridView,用2(纯代码)当然可以解决,但如果想代码量少些,可以在每个ItemTemplate加上一个SqlDataSource,让每一个ItemTemplate中的GridView绑定到整个SqlDataSource上,你就会发现需要动态地给SqlDataSource的SelectParameters赋值,而此时如果想Delete的话DeleteParameters也是动态的,那么用3就比较合适了,比如
    //要先FindControl到SqlDataSource2
    SqlDataSource2.DeleteParameters["ID"].DefaultValue = GridView1.DataKeys[e.RowIndex].Value.ToString();
    SqlDataSource2.Delete();如果还想进行内层的GridView的更新,如果内层的GridView用的不是模版列的话,用3可以很方便的进行Update操作,如果用的是模版列,那么用自己2(自己手写代码的方式)会更合适
      

  20.   

    高歌手头有没有些简单的例子,给我一些好不好,[email protected],多多益善!呵呵
      

  21.   

    我买了好多书,可感觉是ASP2.0的皮,1.1的内容,找不到感觉,今天在这里总算找到点门道,
    不知各位都看什么好书?怎么学的这么好呀?
      

  22.   

    专家门诊-ASP.NET开发答疑200(适合初学)
    LTPASP.NET知识库
      

  23.   

    推荐petshop 4.0的数据库操作类