• ASP.NET


    ADO.NET(ActiveX Data Objects)

    ADO.NET是一个COM组件库,用于在使用Microsoft技术的代码中访问数据库。

    SQL数据操作类

    SqlConnection类(System.Data.SqlClient.SqlConnection)

    提供打开数据库的方法。创建此对象,提供数据库连接字符就可以与数据库建立连接,你可以把数据库mdf文件存放在App_Data文件夹里,如果这样做,则vs的服务器资源管理器里会自动添加该数据库的连接。在服务器资源管理器中右击数据库-属性-连接字符串-复制即可。通常与数据库操作有关的代码都应放在using语句块中,这样就不必每次都手动关闭连接并销毁对象了。

    属性.property

    ConnectionTimeout 
    //获取连接超时时间,默认15
    
    DataSource
    //获取当前服务器名称
    
    State
    //连接数据库的状态,值为ConnectionState枚举,可能的值为Open或Closed
    
    ServerVersion
    //返回数据库版本号
    
    Database
    //获取当前打开的数据库名
    只读属性.property

    方法.method 

    Open()
    //打开当前程序与数据库的连接
    
    Close()
    //关闭当前程序与数据库的连接
    
    ChangeDatabase(databaseName)
    //改变当前要连接的数据库
    
    Dispose()
    //销毁自身
    示例:
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = @"uid=sa;pwd=123456;server=寒食;database=Article";
    conn.Open();
    Response.Write(conn.DataSource);
    conn.Close();
    
    //与Access数据库建立连接
    OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:demomyWebApp_Data	est.accdb;Persist Security Info=True");
    conn.Open();
    OleDbCommand cmd= conn.CreateCommand();
    cmd.CommandText = "insert into students(Name,Age)values(@name,@age)";
    cmd.Parameters.Add(new OleDbParameter("@name", "sam"));
    cmd.Parameters.Add(new OleDbParameter("@age", 18));
    int i = cmd.ExecuteNonQuery();
    Response.Write(i);
    
    //自定义数据库连接字符配置节,通过读取配置节获得数据库连接字符
    <configuration>
          <appSettings>
                <add key="SQLConnStr" value="uid=sa;pwd=123456;server=寒食;database=Article"/>
          </appSettings> 
    </configuration>
    
    using System.Configuration;
    
    SqlConnection conn = new SqlConnection();
    string sqlConnStr = ConfigurationManager.AppSettings["SQLConnStr"];
    conn.ConnectionString = sqlConnStr;
    conn.Open();
    Response.Write(conn.DataSource);
    conn.Close();
    方法.method

    SqlCommand类(System.Data.SqlClient.SqlCommand)

    执行数据库SQL语句或存储过程

    属性.property

    CommandText
    //配置SQL语句或存储过程的名字
    
    CommandType
    //设置Command对象应执行的命令类型,是SQL语句或是存储过程,配置是一个System.Data.CommandType枚举,可能的值为Text、StoredProcedure、TableDirect
    
    CommandTimeout
    //设置或获取执行命令的超时时间
    
    Connection
    //获取数据库连接对象 
    属性.property

    方法.method

    ExecuteScalar()
    //执行查询并返回首行首列的单个值 
    //常用于执行统计
    
    ExecuteReader()
    //执行查询并返回一个只读、只进的DataReader类的实例,该实例提供了读取记录的方法
    
    ExecuteNonQuery()
    //执行插入、删除、修改、创建等操作并返回受影响的行数,没有记录被影响则返回-1 
    
    Cancel()
    //取消执行
    
    示例:
    using System.Data.SqlClient;
    using System.Configuration;
    
    protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection();
        string SQLConnStr = ConfigurationManager.AppSettings["SQLConnStr"];
        using (conn)
        {
            conn.ConnectionString = SQLConnStr;
            conn.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = System.Data.CommandType.Text;
            cmd.CommandText = "select * from Article";
            cmd.Connection = conn;
            int articleID=int.Parse(cmd.ExecuteScalar().ToString());
            Response.Write(articleID);
        }
    }
    方法.method

     SqlParameter类(System.Data.SqlClient.SqlParameter)

    表示SqlCommand的参数,如果SqlCommand对象需要执行带参数的命令,则使用SqlParameter创建参数。

    using (conn)
    {
        conn.ConnectionString = SQLConnStr;
        conn.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.CommandText = "selectArticle";//存储过程名
        SqlParameter[] param = new SqlParameter[]
        {
            new SqlParameter("@AuthorName","寒食"),//参数名、参数值
            new SqlParameter("@PostDate","2016-06-20")
        };
        foreach (SqlParameter p in param)
        {
            cmd.Parameters.Add(p);
        }
        cmd.Connection = conn;
        string ID = cmd.ExecuteScalar().ToString();
        Response.Write(ID);
    }
    View Code

    存储过程默认会自动返回int类型的值,该值代表了增删改查受影响的行数,但它只会返回一个数据,如果你需要存储过程返回多个信息,你可以在存储过程中创建OutPut类型的变量,声明为OutPut的变量一旦得到值,它会自动被返回出去,服务端传递一个ref变量的参数即可接收类型为OutPut的变量的值。但这个值必须是int类型,因为存储过程不能返回字符。

    SqlParameter p = new SqlParameter("@Counts", 0);        
    p.Direction = System.Data.ParameterDirection.Output;//表示该参数是输出参数,存储过程将OutPut的变量返回给该参数
    cmd.Parameters.Add(p);
    cmd.Connection = conn;
    string ID = cmd.ExecuteScalar().ToString();
    int count = (int)cmd.Parameters[0].Value;//存储过程执行后会将OutPut的变量装入索引为0的参数里,现在就可以取出来
    View Code

    SqlDataReader类(System.Data.SqlClient.SqlDataReader)

    存储记录,并提供领导Read方法,该方法类似于游标、指针,当指针指向一条记录时,Reader会存储这条记录,通过字段索引的形式读取字段的值。此对象通常由SqlCommand对象的ExecuteReader()方法返回一个SqlDataReader实例,也可结合CommandBuilder进行使用。

    属性.property

    HasRows
    //结果集是否有数据
    
    FieldCount
    //读取当前行的列总数
    
    IsClosed
    //当前的Reader对象是否已关闭
    
    RecordsAffected
    //获取增删改查后受影响的行数
    属性.property

    方法.method

    GetString(FieldIndex)
    //根据字段索引获取该字段的字符值
    
    GetInt32(FieldIndex)
    //根据字段索引获取该字段的int值 
    
    GetName(FieldIndex)
    //根据字段索引获取列的字段名
    
    GetOrdinal(fieldName)
    //根据字段名获取其对应的索引
    
    Read()
    //推进以使其指向下一条记录,同时如果存在记录则返回true,此方法并不自动推进,需要用循环使其推进指针。当第一次调用Read时会指向第一条记录
    示例:
    while (Reader.Read())
    {
        for (int i = 0; i < Reader.FieldCount; i++)
        {
            Response.Write(Reader[i].ToString());
        }
    }
    
    示例:打印表格数据
    using (conn)
    {
        string SQLConnStr = ConfigurationManager.AppSettings["SQLConnStr"];
        conn.ConnectionString = SQLConnStr;
        conn.Open();
        SqlCommand CMD = new SqlCommand();
        CMD.CommandType = System.Data.CommandType.Text;
        CMD.CommandText = "select Author,Title,PostDate from Article";
        CMD.Connection = conn;
        SqlDataReader reader = CMD.ExecuteReader();
        var header = "";
        var msg = "";
        var r = 0;
        while (reader.Read())
        {
            var div = "<div>";
            var span1 = "";
            var span2 = "";
            //读取列头部信息
            if (r == 0)
            {
                for (var z = 0; z < reader.FieldCount; z++)
                {
                    span1 += ("<span>" + reader.GetName(z).ToString() + "&nbsp&nbsp</span>");
                }
                header += (div + span1 + "</div>");
                r = 1;
            }
            //读取值
            for (var i = 0; i < reader.FieldCount; i++)
            {
                span2 += ("<span>" + reader[i].ToString() + "&nbsp&nbsp</span>");
            }
            msg += (div += span2 + "</div>");
        }
        Response.Write(header+msg);
    }
    
    示例:读取null值
    //表可能有null值,需要做判断,否则会抛出异常
    if (Reader[i] == DBNull.Value)
    {
        //……
    }
    
    NextResult()
    //推进指针到下一张表,成功推进到另一张表则返回true
    示例:
    cmd.CommandText = "select * from 学员 ; select * from 成绩 ; select * from 地址"; 
    SqlDataReader Reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    do
    {
        while (Reader.Read())
        {
            for (int i = 0; i < Reader.FieldCount; i++)
            {
                if (Reader[i] == DBNull.Value)
                {
                    //……
                }
                else
                {
                   //如果有数据……
                }                        
            }
        }
    } while (Reader.NextResult());
    
    
    Close()
    //关闭指针
    方法.method

     SqlDataAdapter(System.Data.SqlClient.SqlDataAdapter)

    起数据桥接的作用,如果不使用SqlDataReader读取数据,则可以使用此对象与数据库建立桥接,它将数据读取到DataSet(虚拟数据缓存)中,然后关闭桥接,接着你可以在于数据库断开连接的情况下从DataSet里读取数据而不必再和数据库进行交互。数据量较小的情况下可以考虑使用SqlDataAdapter,但该对象会将数据填充到DataSet,这会占用客户机内存。所以,在数据量大的情况下还是应考虑使用DataReader。

    属性.property

    SelectCommand 
    //指定要使用的SqlCommand对象。所有要执行的select类型的SQL命令、命令的参数都通过此属性进行配置
    示例:
    SqlCommand cmd = new SqlCommand();
    SqlDataAdapter dap = new SqlDataAdapter(); 
    dap.SelectCommand =cmd
    dap.SelectCommand.CommandText = "select * from 产品";
    示例:查询多张表
    dap.SelectCommand.CommandText = "select * from Product";
    dap.Fill(ds, "产品");
    //接下来更改SqlDataAdapter的查询语句即可查询另一张表
    dap.SelectCommand.CommandText = "select * from ProductType";
    dap.Fill(ds,"产品类型"); //产品类型表被查询到
    
    InsertCommand
    //指定要使用的SqlCommand对象。所有要执行的insert into类型的SQL命令、命令的参数都通过此属性进行配置
    
    UpdateCommand
    //指定要使用的SqlCommand对象。所有要执行的update类型的SQL命令、命令的参数都通过此属性进行配置
    示例:
    ds.Tables["成绩单"].Rows[2]["name"] = "lily";
    //同时更新虚拟的DataSet和真实数据库
    dapter.Update(ds, "成绩单");
    
    DeleteCommand
    //指定要使用的SqlCommand对象。所有要执行的delete类型的SQL命令、命令的参数都通过此属性进行配置
    属性.property

    方法.method

    Fill(DataSetObj,dataSetTableName)
    //DataSetObj:DataSet对象
    //dataSetTableName:DataSet中的表名,如果没有此表则创建它
    //将数据库表记录填充到DataSet中,
    //返回int类型的值 >0表示装入了数据 <0表示是张空表
    //填充后,在DataSet里会生成一张虚拟的表 
    示例:
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = ConfigurationManager.AppSettings["SQLConnStr"];
    conn.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = conn;
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "TestProc";
    SqlDataAdapter dap = new SqlDataAdapter(cmd);
    dap.SelectCommand =cmd
    DataSet ds = new DataSet();
    dap.Fill(ds, "UserMsg");
    方法.method

    DataSet(System.Data.DataSet)

    DataSet类相当于虚拟数据库,它可以保存从SqlDataAdapter填充进来的N张记录,在与服务器断开的情况下依然可以访问DataSet。

    属性与方法.property&method 

    Tables
    //获取当前虚拟内存中的DataTable集合
    
    Relation
    //获取当前虚拟内存中的DataTable之间的关系集合
    
    getChanges()
    //获取结果集,通常用于执行update操作之后获取受影响的记录集合
    属性与方法.property&method

    DataTable(System.Data.DataTable)

    表示一张数据表,可以手动创建虚拟数据表,它通常是DataSet和DataView所存储的数据对象。

    属性与方法.property&method 

    Rows
    //获取表的行集合对象(DataRowCollection),通常用于读取字段值
    DataRowCollection list = table.Rows;//获取所有行
    Object r= table.Rows[0][1];//获取第0行中的第1列
    Object name=table.Rows[0]["name"];//获取第0行中的name列
    
    Columns
    //获取表的列集合对象(DataColumnCollection),通常用于设置字段名
    
    Delete()
    //从DataTable的Rows集合中删除某行
    
    NewRow()
    //在DataTable的末尾添加一个新行并返回新行
    
    DataRowCollectionObj.Add(dataRowObj)
    //在表的末尾插入新行,此方法要求DataTable的Rows集合进行调用。通常不需要new一个DataRow而是靠DataTable的NewRow()创建新行,并通过DataRowCollectionObj的Add()方法将新行添加到表的末尾
    
    DataColumnCollectionObj.Add(dataColumnObj)
    //在表的末尾创建新的列,此方法要求DataTable的Columns集合进行调用。通常不需要new一个DataColumn而是靠DataTable的DataColumnCollectionObj的Add()方法直接创建新列
    示例:
    DataTable table = new DataTable("Article");//创建表
    table.Columns.Add("author");//创建新列
    table.Columns.Add("title");//创建新列
    
    DataRow row = table.NewRow();//创建新行
    row.SetField("author", "寒食");//在新行插入值
    row.SetField("title", "哲学");//在新行插入值
    table.Rows.Add(row);//将新行添加到行集合
                
    string msg = string.Empty;
    foreach (DataRow record in table.Rows)
    {
        msg+="<div>" +record["author"].ToString() +record["title"]+"</div>";
    }
    Response.Write(msg);
    
    示例:编辑行
    table.Rows[0].BeginEdit();//开启行编辑
    table.Rows[0].SetField("author","无垠");//修改数据
    table.Rows[0].EndEdit();//关闭行编辑
    //DatasetObj.AcceptChanges();//提交所有更改,如果DataTable是存在于DataSet中则需要调用AcceptChanges保存更改
    属性与方法.property&method

    通用数据访问的兼容性实现

    如果无法确定项目最终使用的何种类型的数据库时,使用Sqlxxx等一系列的数据库操作类就会显得不合时宜。到时候可能会修改大量的程序文件。在不确定使用何种数据库的情况下,你可以使用两种方法来创建具备兼容性的数据库操作类。

    1.IDbXXX统一接口(System.Ddata.IDbXXX)

    数据库操作类都实现了ADO.NET框架的数据库操作的统一接口,利用接口的多态性,你可以将数据库操作类统一为接口类型,比如SqlConnection(MS数据库的操作类)、OracleConnection(Oracle数据库的操作类)、OleDbConnection(Access数据库的操作类)。

    1.IDbConnection

    2.IDbCommand

    3.IDbDataParameter

    4.IDataReader

    5.IDbDataAdapter

    string ProviderName = "Access";
    IDbConnection conn=null;
    if (ProviderName == "Access")
    {
        conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:demomyWebApp_Data	est.accdb;Persist Security Info=True");
    }
    else if(ProviderName=="SqlServer")
    {
        conn = new SqlConnection(@"Data Source=.;Initial Catalog=gssMs;Persist Security Info=True;User ID=sa;Password=123");
    }
    conn.Open();
    IDbCommand cmd = conn.CreateCommand();
    //……
    View Code

    2.DbProviderFactory抽象工厂模式(System.Data.Common.DbProviderFactory)

    此类不提供构造函数,它的实例由DbProviderFactories.GetFactory()创建,参数是数据库提供程序的类型。有以下类可以协同完成数据库操作。

    1.DbConnection 

    2.DbCommand

    3.DbParameter

    4.DbDataReader

    5.DbDataAdapter 

    <appSettings>
        <add key="factoryType" value="System.Data.SqlClient"/>
        <add key="SQLConnStr" value="uid=sa;pwd=123456;server=寒食;database=Article"/>
    </appSettings>
    配置节
    using System.Configuration;
    using System.Data;
    using System.Data.Common;
    
    DbProviderFactory factories = DbProviderFactories.GetFactory(ConfigurationManager.AppSettings["factoryType"]);
    DbConnection conn = factories.CreateConnection();
    conn.ConnectionString = ConfigurationManager.AppSettings["SQLConnStr"];
    conn.Open();
    Response.Write(conn.State);
    //所有数据库操作实例都靠DbProviderFactory对象的CreateXXX()方法创建
    示例:
    DbConnection conn = factories.CreateConnection();
    DbCommand CMD = factories.CreateCommand();
    DbParameter param = factories.CreateParameter();
    DbDataAdapter dap = factories.CreateDataAdapter();
    创建实例

     

    ASP.NET - 学习总目录

  • 相关阅读:
    JavaScript中Null和Undefined的区别
    javascript中的计算题
    数组去重
    javascript面向对象中继承实现的几种方式
    数列求值 题解
    首字母变大写 题解
    发工资咯:) 题解
    绝对值排序 题解
    数列有序 题解
    母牛的故事 题解
  • 原文地址:https://www.cnblogs.com/myrocknroll/p/7223430.html
Copyright © 2020-2023  润新知