9.6 ASP.NET数据库操作实例

  在了解了数据源控件和数据绑定控件的功能和使用方法,并且了解了ADO.NET的基本知识后,就可以使用控件和ADO.NET来操作数据库。ASP.NET提供了强大的数据源控件和数据绑定控件,能够迅速的对数据库进行操作,同时,使用ADO.NET对数据进行操作,能够加深对ADO.NET的认识。

9.6.1 制作用户界面(UI)
  使用数据控件和数据源控件显式数据,则需要为控件制作相应的用户界面,让数据控件对用户呈现的效果更好。首先,需要使用创建数据绑定控件GridView和数据源控件,并配置数据源控件,如图9-6所示。
配置数据源控件和数据绑定控件
图9-6 配置数据源控件和数据绑定控件
  显然,对于用户而言,该数据源控件和数据绑定控件显然很不友好,这里就需要对数据绑定控件的界面进行修改。通过配置数据绑定控件的相应格式可以修改数据绑定控件的外观,如图9-7所示。
编辑数据绑定控件界面
图9-7 编辑数据绑定控件界面
  开发人员能够自定义数据绑定控件的样式,并且修改某些列的顺序,这里使用了自动套用格式,并将数据绑定控件的width属性设置为100%,这样编写宽度就能够适应浏览器的大小,从而随着浏览器的大小而改变。数据绑定控件配置完成后,值得注意的是,需要勾选SQL语句的高级选项,让数据绑定控件支持编辑、删除和选择,如图9-8所示。
SQL高级选项
图9-8 SQL高级选项
  配置SQL高级选项后,数据源控件就会自动生成INSERT、UPDATE、DELETE语句,示例代码如下所示。
+展开
-HTML
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:mytableConnectionString %>" 
        DeleteCommand="DELETE FROM [mynews] WHERE [ID] = @ID" 
        InsertCommand="INSERT INTO [mynews] ([TITLE]) VALUES (@TITLE)" 
        SelectCommand="SELECT * FROM [mynews]" 
        UpdateCommand="UPDATE [mynews] SET [TITLE] = @TITLE WHERE [ID] = @ID">

        <DeleteParameters>
            <asp:Parameter Name="ID" Type="Int32" />
        </DeleteParameters>
        <UpdateParameters>
            <asp:Parameter Name="TITLE" Type="String" />
            <asp:Parameter Name="ID" Type="Int32" />
        </UpdateParameters>
        <InsertParameters>
            <asp:Parameter Name="TITLE" Type="String" />
        </InsertParameters>
    </asp:SqlDataSource>

  在完成用户界面的配置后,系统生成的HTML代码如下所示。
+展开
-HTML
    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
        AutoGenerateColumns="False" BackColor="White" BorderColor="#E7E7FF" 
        BorderStyle="None" BorderWidth="1px" CellPadding="3" DataKeyNames="ID" 
        DataSourceID="SqlDataSource1" GridLines="Horizontal" Width="100%">

        <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />
        <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />
        <Columns>
            <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
                ReadOnly="True" SortExpression="ID" />

            <asp:BoundField DataField="TITLE" HeaderText="TITLE" SortExpression="TITLE" />
        </Columns>
        <PagerStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" HorizontalAlign="Right" />
        <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />
        <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
        <AlternatingRowStyle BackColor="#F7F7F7" />
    </asp:GridView>

  开发人员可以编写以上HTML实现更多的效果,当确定用户界面编写完毕后,就可以为数据绑定控件选择操作了。

9.6.2 使用GridView显示、删除、修改数据
  配置完成用户界面,则需要选择GridView控件的属性并配置GridView任务,如图9-9和图9-10所示。
默认GridView任务
图9-9 默认GridView任务
选择GridView任务
图9-10 选择GridView任务
  GridView控件支持分页、排序、编辑、删除和选定内容等操作。在GridView控件中,首先必须勾选【分页】复选框,然后再配置PageSize属性才能够让GridView控件支持分页功能。在GridView控件属性中如果勾选了【分页】复选框而不配置PageSize属性,则默认按10条数据分页。勾选了以启用分页、启用编辑、启用删除和启用选定内容后,GridView控件的界面如图9-11所示。
编辑数据绑定控件界面
图9-11 编辑数据绑定控件界面
  因为在数据源控件配置的过程中,已经配置了支持编辑、删除和选择,所以在数据绑定控件中可以选择启用编辑,启用删除和选定内容等操作,并且系统默认支持更新、插入、删除等操作,运行后如图9-12所示。
GridView控件显式
图9-12 GridView控件显式
  GridView控件支持编辑、删除和选择,当单击编辑时,能够对选择的行进行数据编辑,如图9-13所示。编辑完成后,单击更新按钮则可以执行更新操作,而无需手动编写UPDATE操作,如图9-14所示。
编辑数据
图9-13 编辑数据
执行更新操作
图9-14 执行更新操作
  当单击删除时,则会执行DELETE命令,而无需手动编写DELETE命令。GridView控件支持分页、排序、编辑、删除和选定内容,开发人员无需手动编写更新、删除、编辑、也无需手动编写分页,对GridView控件进行缓存设置能够提高应用程序性能,在对数据库的操作,编辑及更新中,GridView控件能够方便开发人员,简化代码。

9.6.3 使用DataList显示数据
  DataList控件需要编辑HTML模板来显式数据,虽然在开发上,DataList控件比GridView更加复杂,但是DataList控件能够实现更多效果。相比之下,DataList控件比GridView控件更加灵活,能够进行复杂的事件编写和样式控制。选择【自动套用格式】复选框并将DataList控件的宽度设置为100%,编辑基本的用户界面,如图9-15所示。
DataList控件显式数据
图9-15 DataList控件显式数据
  通过编辑ItemTemplate能够实现自定义模板,而无需像GridView一样,以表格形式呈现,编辑后运行如图9-16所示。
编写ItemTemplate模板
图9-16 编写ItemTemplate模板
  DataList控件执行数据操作基本上同GridView一样,DataList控件与GridView相比只下,有着更灵活的模板方案,能够实现更多的显示效果。

9.6.4 DataList分页实现
  DataList控件本身并不带分页实现,如果需要DataList能够实现分页效果,则需要通过代码实现DataList控件的分页。DataList控件分页需要增加若干标签(Label)控件来显式“上一页”,“下一页”等分页所需要的连接,示例代码如下所示。
+展开
-HTML
    <asp:Label ID="Label4" runat="server" Text="Label"></asp:Label>
    <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>

  上述代码创建了三个Label控件,这三个控件并无需初始化,这三个控件通过编程实现上一页,下一页的分页形式。如果需要执行分页,则需要编写cs页面代码,cs页面代码如下所示。
+展开
-C#
            PagedDataSource objPds = new PagedDataSource();
            objPds.DataSource = this.SqlDataSource1.Select(new DataSourceSelectArguments());
            objPds.AllowPaging = true;//设置是否允许分页
            objPds.PageSize = 3;//设置分页条目数
            int CurPage;//设置当前页码
            Label2.Visible = false;//隐藏标签
            Label4.Visible = false;

  上述代码初始化PagedDataSource对象,并将分页控件默认初始化属性Visible为false。其中PagedDataSource是封装分页相关属性的类。
+展开
-C#
            if (Request.QueryString["Page"] != null)//如果传递的页面不为空
            {
                CurPage = Convert.ToInt32(Request.QueryString["Page"]); //获取传递的参数
            }
            else
            {
                CurPage = 1;//页面的值为1
            }
            objPds.CurrentPageIndex = CurPage - 1;//设置索引
            Label2.Visible = true;//显式标签
            Label4.Visible = true;
            Label3.Text = "<a href=\"datalist.aspx\">首页</a>"; //编写分页
            Label2.Text = "<a href=\"datalist.aspx?page=" + Convert.ToString(CurPage + 1) + "\">下一页</a>";
            Label4.Text = "<a href=\"datalist.aspx?page=" + Convert.ToString(CurPage - 1) + "\">上一页</a>";

  上述代码通过传递的Page的值进行分页操作,如果传递的Page的值为不为空,则从数据源控件中读取相应的数据,并显示到数据绑定控件中。
+展开
-C#
            if (CurPage == 1)//如果只有一个页面
            {
                Label4.Visible = false;//隐藏标签
            }
            if (objPds.IsLastPage)
            {
                Label2.Visible = false;
            }
            DataList1.DataSourceID = "";//重新绑定数据
            DataList1.DataSource = objPds;//编写DataList的数据源
            DataList1.DataBind(); //绑定数据源

  上述代码通过PagedDataSource对象实现了分页效果,并且将分页条目数设置为3,当数据超过3条时,则会实现分页。运行后如图9-17和图9-18所示。
实现下一页效果
图9-17 实现下一页效果
实现上一页效果
图9-18 实现上一页效果
  DataList控件虽然不支持分页,但是能够通过编程实现DataList控件的分页效果。DataList控件在模板编辑和代码开发上虽然没有GridView方便,但是却提高了灵活性,能够自定义分页和数据显示。

9.6.5 使用SQLHelper操作数据库
  使用控件,能够方便开发人员的开发和使用,但是很多情况下,不能使用控件来实现,所以很多情况都需要使用ADO.NET操作数据库中的数据,SQLHelper是将ADO.NET中对数据操作的类和对象进行的封装的一个类库,使用SQLHelper能够提高数据库操作的效率。
1.创建SQLHelper
  SQLHelper类经常在数据库开发中使用,不仅封装了数据库操作,也提高了数据库操作的安全性,SQLHelper在微软的开发中和DEMO中经常被使用,SQLHelper通常用于多层设计,如果需要使用SQLHelper类,可以到微软官方下载最新的SQLHelper类,也可以自行编写SQLHelper类。如果自行创建SQLHelper类,则在解决方案管理器中新建一个类库,如图9-19所示。
创建类库后,删除自动生成的Class1类,并创建一个新类,类名为SQLHelper,如图9-20所示。
添加类库
图9-19 添加类库
创建SQLHelper类
图9-20 创建SQLHelper类
  如果使用下载的SQLHelper类,则可以单击解决方案管理器,单击右键,选择添加现有项,然后选择现有项目添加即可。在SQLHelper类下对数据操作进行封装,开发人员能够使用自己封装的类进行数据操作,示例代码如下所示。
+展开
-C#
        #region //数据库连接串
        private static readonly string database = “数据库”;//配置数据库信息
        private static readonly string uid = “用户名”;//配置用户名信息
        private static readonly string pwd = “密码”;//配置密码信息
        private static readonly string server = “服务器”;//配置服务器信息
        private static readonly string condb = "server='"+ server +"';database='" + database + "';uid=
        '" + uid + "';pwd='" + pwd + "';Max Pool Size=100000;Min Pool Size=0;
        Connection Lifetime=0;packet size=32767;Connection Reset=false; async=true";//设置连接字串
        #endregion
        #region//DataAdapter方法 返回DataSet数据集
        /// <summary>
        /// DataAdapter方法 返回DataSet数据集
        /// </summary>
        /// <param name="sqlCmd">SQL语句</param>
        /// <param name="command">操作参数 枚举类型</param>
        /// <returns></returns>
        public static DataSet DataAdapter(string sqlCmd, SDACmd command,//实现适配器
        string tabName, params SqlParameter[] paraList)
        {
            SqlConnection con = new SqlConnection(condb);//创建连接对象
            SqlCommand cmd = new SqlCommand();//创建Command对象
            cmd.Connection = con; //使用连接对象
            cmd.CommandText = sqlCmd;//配置连接字串
            if (paraList != null)
            {
                cmd.CommandType = CommandType.Text;//配置Command类型
                foreach (SqlParameter para in paraList)//遍历参数
                { cmd.Parameters.Add(para); }//添加参数
            }
            SqlDataAdapter sda = new SqlDataAdapter();//创建适配器
            switch (command)//查找条件
            {
                case SDACmd.select://如果为select执行
                    sda.SelectCommand = cmd;
                    break;
                case SDACmd.insert://如果为insert执行
                    sda.InsertCommand = cmd;
                    break;
                case SDACmd.update://如果为update执行
                    sda.UpdateCommand = cmd;
                    break;
                case SDACmd.delete://如果为delete执行
                    sda.DeleteCommand = cmd;
                    break;
            }
            DataSet ds = new DataSet();//创建数据集
            sda.Fill(ds, tabName);//填充数据集
            return ds;//返回数据集
        }

  在上述代码中,还需要通过一个枚举类型进行switch操作,枚举类型用于判断执行的操作,示例代码如下所示。
+展开
-C#
        public enum SDACmd { select, delete, update, insert }//定义枚举类型

  定义的枚举类型用于在程序中进行筛选操作,用于指定SQL语句执行的操作。在SQLHelper类中,还需要封装DataReader方法进行DataReader的封装和实现,开发人员能够使用SQLHelper类中的DataReader方法进行数据库的读取,示例代码如下所示。
+展开
-C#
        public static SqlDataReader ExecReader(string sqlcmd, params SqlParameter[] paraList)
        {
            SqlConnection con = new SqlConnection(condb);//创建连接对象
            SqlCommand cmd = new SqlCommand();//创建Command对象
            cmd.Connection = con; //使用连接
            cmd.CommandText = sqlcmd;//配置SQL语句
            if (paraList != null)
            {
                cmd.CommandType = CommandType.Text;//配置Command类型
                foreach (SqlParameter para in paraList)
                { cmd.Parameters.Add(para); }//添加参数
            }
            con.Open();//打开连接
            SqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            return sdr;
        }

  上述代码实现了DataReader对象,使用DataReader能够填充SqlDataReader对象并进行数据的循环输出。在ADO.NET中,通常需要执行SQL语句进行数据库的操作,在SQLHelper类中,同样需要封装执行SQL语句的操作以便能够快速执行数据操作。
+展开
-C#
        public static void ExecNonQuery(string sqlcmd, params SqlParameter[] paraList)
        {
            using (SqlConnection con = new SqlConnection(condb))//创建连接对象
            {
                SqlCommand cmd = new SqlCommand();//创建Command对象
                cmd.Connection = con;//使用连接
                cmd.CommandText = sqlcmd;//配置执行类型
                if (paraList != null)
                {
                    cmd.CommandType = CommandType.Text; //配置执行类型
                    foreach (SqlParameter para in paraList)
                    { cmd.Parameters.Add(para); }//添加参数
                }
                con.Open();//打开数据连接
                cmd.ExecuteNonQuery();//执行SQL语句
            }
        }

  上述代码编写了SQLHelper类操作数据库的函数,通过执行函数并传递参数,即可实现数据库的插入、更新和删除。
2.使用SQLHelper
创建完成SQLHelper类后,需要为应用程序配置SQLHelper的基本属性,代码如下所示。
+展开
-C#
        private static readonly string database = "mytable";//配置数据库
        private static readonly string uid = "sa";//配置用户名
        private static readonly string pwd ="sa";//配置用户会密码
        private static readonly string server = "local"; //配置服务器的值

  上述代码为SQLHelper类配置了属性,当使用SQLHelper类时,系统会自动连接数据库,在完成使用后,系统会自动关闭数据库。如果需要在当前项目使用SQLHelper类,则需要添加引用来使用SQLHelper类,右击现有项目,在下拉菜单中选择【添加】选项,在【添加】选项中选择【现有项】选项,在弹出窗口中选择【项目】标签栏,就可以添加相同项目的类库,如图9-21所示。
添加引用
图9-21 添加引用
  引用添加完毕,在使用SQLHelper页面的CS页面中,需要添加命名空间,命名空间的名称和创建类库的名称相同,如果需要更改名称,可以通过修改类库的属性来修改。示例代码如下所示。
+展开
-C#
using MYSQL;

  引用完毕后,就可以执行SQL语句,使用SQLHelper执行SQL语句非常方便,下面代码演示了如何执行插入、删除操作。
+展开
-C#
            string strsql = "insert into mynews values ('SQLHelper插入标题')";//编写SQL语句
            SQLHelper.ExecNonQuery(strsql);//执行SQL语句

  上述代码运行后,则会执行插入操作,相比于ADO.NET,封装后的代码更加简便易懂,删除操作代码如下所示。
+展开
-C#
            string strsql2 = "delete form mynews where id=3";//编写SQL语句
            SQLHelper.ExecNonQuery(strsql2); /执行SQL语句

当需要执行SELECT语句时,可以通过SQLHelper.DataAdapter获取数据,示例代码如下所示。
+展开
-C#
string strsql = "select * from mynews where id=3";//编写SQL语句
DataSet ds = SQLHelper.DataAdapter(strsql, SQLHelper.SDACmd.select, "mydatatable");

  上述代码通过SQLHelper.DataAdapter获取数据,并创建了一个mydatatable虚拟表,填充DataSet对象。当需要获取DataSet对象中的数据时,和普通的DataSet对象一样。SQLHelper封装了ADO.NET中的许多方法,为开发人员提高了效率,同时也增加了安全性和模块化的特性。
注意:上述代码中的SQLHelper类能够执行的是SQL语句,如果需要执行存储过程,则需要更改SQLHelper类中的相应的CommandType属性的值。

加支付宝好友偷能量挖...


评论(0)网络
阅读(151)喜欢(0)Asp.Net/C#/WCF