zoukankan      html  css  js  c++  java
  • 【.NET】C#.NET ADO.NET数据访问模型概述(二)

    二.执行SQL语句

    1.使用SqlCommand执行SQL语句

    一般,我们把数据库的各种操作分成两种:

    (1)不返回记录集的命令。通常是执行添加,插入和修改等操作的SQL语句来更新记录。

    (2)返回记录集的命令。通常是执行查询SQL语句来获取数据集用于呈现。

    不论是哪种操作都需要使用Command对象来执行SQL语句。

    SqlCommand对象重载的几个方法:

    (1)SqlCommand()

    (2)SqlCommand(string cmdText)

    (3)SqlCommand(string cmdText,SqlConnection connection)

    (4)Sqlcommand(string cmdText,SqlConnection connection,SqlTransaction transaction)

    Sqlcommand对象需要接受一个有效的Sqlconnection.用来告知Command对象我们需要和哪个数据源进行交互。

    还可以在Sqlcommand的构造方法中直接传入要执行的SQL语句。还可以传入SqlTransaction参数实现事务。

    因此,使用一个Command对象简单来说需要以下步骤:

    (1)声明一个有效的Connection对象。

    (2)声明一个有效的Command对象。

    (3)为Command对象指定需要操作的SQL语句字符串和关联的Connection对象的实例。

    (4)打开Connection对象。

    (5)执行Command对象的各种方法进行数据库操作。

    (6)关闭Connection对象。

    2.使用参数Parameter来防止SQL注入

    SqlCommand cmd =new Sqlcommand("Select count(*) from tbclass where className=@className",conn)

    cmd.CommandType=CommandType.StoredProcedure;

    cmd.Parameters.add("@className ",,sqlDbType.VarChar,50);

    cmd.Parameters["@className"].Value=txtclass.Text;

    cmd.Parameters["@className"].Direction=ParameterDirection.Input;

    3.使用DataReader访问数据

    DataReader是只读只进的读取方式。所以往往会使用循环语句来读取记录集。

    以下实例需要引用:

    using System.Data;
    using System.Data.SqlClient;
    using System.Text;

    (1)使用DataReader读取单记录集

            string sConnectionString = @"Server=(Local)\SQLExpress;database=GuestBook;Trusted_Connection=True";
            using (SqlConnection conn = new SqlConnection(sConnectionString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand("Select * from tbGuestBook", conn))
                {
                    using (SqlDataReader dr = cmd.ExecuteReader())
                    {
                        if (dr.HasRows)
                        {
                            StringBuilder htmlstr = new StringBuilder();
                            //使用StringBuilder构造字符串效率比较高
                            htmlstr.Append("<table border='1' cellpadding='5' cellspacing='0' style='font-size:9pt;font:宋体'>");//表格开始
                            htmlstr.Append("<tr style='background-color=#f0f0f0'>");//表头开始
                            for (int i = 0; i < dr.FieldCount; i++)
                            {
                                htmlstr.Append(string.Format("<td><strong>{0}</strong></td>",dr.GetName(i)));//构造表头
                            }
                            htmlstr.Append("</tr>");//表头结束
                            while (dr.Read())
                            {
                                htmlstr.Append("<tr>");//记录行开始
                                for (int i = 0; i < dr.FieldCount; i++)
                                {
                                    htmlstr.Append(string.Format("<td>{0}</td>",dr.GetValue(i)));//构造记录行
                                }
                                htmlstr.Append("</tr>");//记录行结束
                            }
                            htmlstr.Append("</table>");//表格结束
                            Response.Write(htmlstr);
                        }
                    }
                }
            }

    (2)使用DataReader读取多记录集

            string sConnectionString = @"Server=(Local)\SQLExpress;database=bbs;Trusted_Connection=True";
            using (SqlConnection conn = new SqlConnection(sConnectionString))
            {
                conn.Open();
                using (SqlCommand cmd = new SqlCommand("Select * from Bbs_Link ; Select * from Bbs_MenuBig", conn))
                {
                    using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))//得到一个DataReader.
                    {
                        if (dr.HasRows)//记录集是否为空
                        {
                            do
                            {
                                StringBuilder htmlstr = new StringBuilder();
                                //使用StringBuilder构造字符串效率比较高
                                htmlstr.Append("<table border='1' cellpadding='5' cellspacing='0' style='font-size:9pt;font:宋体'>");//表格开始
                                htmlstr.Append("<tr style='background-color=#f0f0f0'>");//表头开始
                                for (int i = 0; i < dr.FieldCount; i++)
                                {
                                    htmlstr.Append(string.Format("<td><strong>{0}</strong></td>", dr.GetName(i)));//构造表头
                                }
                                htmlstr.Append("</tr>");//表头结束
                                while (dr.Read())
                                {
                                    htmlstr.Append("<tr>");//记录行开始
                                    for (int i = 0; i < dr.FieldCount; i++)
                                    {
                                        if(!dr.IsDBNull(i))
                                        htmlstr.Append(string.Format("<td>{0}</td>", dr.GetValue(i)));//构造记录行
                                    }
                                    htmlstr.Append("</tr>");//记录行结束
                                }
                                htmlstr.Append("</table>");//表格结束
                                Response.Write(htmlstr);
                            } while (dr.NextResult());
                        }
                    }
                }
            }

     

  • 相关阅读:
    bzoj2669 [cqoi2012]局部极小值 状压DP+容斥
    bzoj2560 串珠子 状压DP
    bzoj2004 [Hnoi2010]Bus 公交线路 矩阵快速幂+状压DP
    「校内训练 2019-04-23」越野赛车问题 动态dp+树的直径
    bzoj5210 最大连通子块和 动态 DP + 堆
    动态 DP 学习笔记
    bzoj4987 Tree 树上背包
    bzoj1190 [HNOI2007]梦幻岛宝珠 背包
    bzoj1004 [HNOI2008]Cards Burnside 引理+背包
    bzoj4922 [Lydsy1706月赛]Karp-de-Chant Number 贪心+背包
  • 原文地址:https://www.cnblogs.com/cuishao1985/p/1431718.html
Copyright © 2011-2022 走看看