• SQLServer数据访问


    两大类数据访问方式:
    1.轻量级:SqlConnection,SqlCommand,SqlDataReader
    2.重量级:SqlConnection,SqlDataAdapter,DataTable

    五大对象:
    链接对象,命令对象,读取器对象,适配器对象,数据集(数据表)

    对象介绍:
    一、命名空间:
    操作SQLServer数据库,一般用两个命名空间:
    using System.Data;
    using System.Data.SqlClient;

    二、连接对象(SqlServer):SqlConnection
    (一)构造:
    SqlConnection()
    SqlConnection(连接字符串)

    连接字符串:不止一种写法。
    第一种:手写 "server=.;database=mydb;uid=sa;pwd=sa";
    第二种:使用服务器资源管理器,通过添加链接用可视化界面生成链接对象,通过查看属性来获得连接字符串。

    (二)属性:
    ConnectionString:字符串,设置或获取链接对象的连接字符串。
    State:ConnectionState枚举类型,返回当前连接状态。

    (三)方法:
    Open():void,打开连接
    Close():void,关闭连接
    CreateCommand():SqlCommand,创建命令对象。(好处是,不用对命令对象单独设置Connection属性)

    (四)重要代码:
    SqlConnection conn = new SqlConnection("server=.;database=mydb;uid=sa;pwd=sa");
    try
    {
    conn.Open();
    ....
    }
    finally
    {
    conn.Close();
    }

    二、命令对象(SqlServer):SqlCommand
    (一)构造:
    SqlCommand()
    SqlCommand(SqlConnection,SqlString)
    conn.CreateCommand()

    (二)属性:
    CommandText:string,要执行的SQL命令——SQL语句,存储过程名。
    CommandType:CommandType枚举类型,CommandType.Text-SQL-语句;CommandType.StoredProcedure-存储过程
    Connection:SqlConnection对象。执行命令时,所使用连接对象。
    Parameters:SqlParameterCollection,当CommandText中使用SqlServer局问变量时,需要通过该属性来对变量赋值。

    (三)方法:
    ExecuteNonQuery():int,执行SQL命令,返回影响的行数。一般用来执行增、删、改
    ExecuteReader():SqlDataReader,执行SQL命令,返回数据读取器。一般用来执行查询
    ExecuteScalar():object,执行SQL命令,返回首行首列,一般用来执行统计(count(),sum(),avg(),max(),min())查询的。

    (四)重要代码:
    SqlConnection conn = new SqlConnection("server=.;database=mydb;uid=sa;pwd=sa");
    //SqlCommand cmd = new SqlCommand();
    //cmd.Connection = conn;
    SqlCommand cmd = conn.CreateCommand(); //创建命令对象
    //设置命令的类型
    cmd.CommandType = CommandType.Text; //cmd.CommandType = CommandType.StoredProcedure;
    //指定SQL命令
    cmd.CommandText = "insert into nation values(@code,@name);
    //添加命令参数
    cmd.Parameters.AddWithValue("@code","n005");
    cmd.Parameters.AddWithValue("@name","壮族");
    //SqlParameter paramCode = new SqlParameter("@code","n005");
    //cmd.Parameters.Add(paramCode);
    //SqlParameter paramName = new SqlParameter("@name","壮族");
    //cmd.Parameters.Add(paramName);

    try
    {
    conn.Open();
    cmd.ExecuteNonQuery();
    }
    finally
    {
    conn.Close();
    }

    注意事情:
    1.要会调用存储过程(举例)
    2.登录:使用统计查询,使用ExecuteScalar()来判断是否登录成功?
    3.SQL注入攻击,原理分析及对策(单引号替换,使用SQL局部变量)。
    4.查询,增删改,统计查询各举一例。

    三、读取器对象(SqlServer):SqlDataReader
    只读,只向前的数据读取对象。
    它不是结果集,它内存中只占一条数据的空间。每次读取下一条时,会把内存中当前条的内容给冲掉。

    (一)构造:
    不能直接new出来,构造函数是非public的。
    只有唯一的生成方式:cmd.ExecuteReader([CommandBehavior.CloseConnection]);

    (二)属性:
    HasRows:bool,读取器中是否查出来数据

    (三)方法:
    Read():读取下一条数据到内存中来。
    Close():关闭读取器。一般不会关闭链接,但如果读取器生成的时候Command对象的ExecuteReader()方法中带有CommandBehavior枚举型参数的话,可能把连接也给关掉。

    (四)重要代码:

    注意事情:
    1.登录判断。
    查询返回SqlDataReader,使用HasRows属性来判断是否查出记录来,登录是否成功。
    SqlDataReader dr = cmd.ExecuteReader();
    if(dr.HasRows)
    {
    }
    2.查询多行数据出来,演示多行显示
    SqlDataReader dr = cmd.ExecuteReader();
    while(dr.Read())
    {
    Console.WriteLine(dr["列名"].ToString()+(bool)dr[1]); //dr[常用的两种方式];dr[0],dr["列名"]返回的都是object
    }


    四、DataTable/DataSet
    DataSet相当于内存中的数据库,其中包括多个DataTable。
    DataTable相当于内存中的数据表。其中包括两个最重要的属性:Rows(DataRowCollection),Columns(DataColumnCollection)。分表代表表的行集合和列集合。
    (一)手动造DataTable
    //造表
    DataTable table = new DataTable();
    //造列
    DataColumn col1 = new DataColumn("列名","类型","长度");
    DataColumn col2 = new DataColumn("列名","类型","长度");
    DataColumn col3 = new DataColumn("列名","类型","长度");
    table.Columns.Add(col1);
    table.Columns.Add(col2);
    table.Columns.Add(col3);
    //造行
    DataRow row1 = table.NewRow(); //用表对象来生成行结象
    row1[0] = "";
    row1["列名"] = "";
    row1[2] = "";
    table.Rows.Add(row1);
    DataRow row2 = table.NewRow(); //用表对象来生成行结象
    row2[0] = "";
    row2["列名"] = "";
    row2[2] = "";
    table.Rows.Add(row2);
    DataRow row3 = table.NewRow(); //用表对象来生成行结象
    row3[0] = "";
    row3["列名"] = "";
    row3[2] = "";
    table.Rows.Add(row3);


    //假设表中已经查出数据来了,我要取某个数据,怎么取法?
    例如:假设查出一个数据表table的数据来。
    1.我要操作第3行第5列的数据。(假设我从1开始数的列号和行号)
    string s = table.Rows[2][4].ToString(); //取值
    table.Rows[2][4] = "hello world";//赋值

    2.我要操作所有的数据
    for(int i=0;i<table.Rows.Count;i++)
    {
    for(int j=0;j<table.Columns.Count;j++)
    {
    Console.Write(table.Rows[i][j].ToString());
    }
    }

    3.控件绑定:
    xxx.DataSource = table;

    (二)使用可视化界面造
    抓图说明。

    五、数据适配器对象:SqlDataAdapter
    适本器对象中包含四大SqlCommand属性:
    SelectCommand
    InsertCommand
    DeleteCommand
    UpdateCommand

    两大方法:
    Fill(DataTable/DataSet)
    Update(DataTable/DataSet)

    (一)手写代码操作(简单了解)

    (二)可视化界面操作。(抓图显示)


    ***事务及异常处理,大部份开发人员都会疏忽这两个内容。
    什么是事务?举例说明。
    事务的四大特性:(A——原子性,C——一致性,I——隔离性,D——持久性)

    两大类事务:
    一、连接内事务
    连接打开,在关闭之前,对数据库操作时所加的事务。
    SqlTransaction对象
    using System.Transaction;
    1.事务对象的创建:
    conn.Open();
    SqlTransaction trans = conn.BeginTransaction();

    2.把事务挂到命令对象上去
    cmd.Transaction = trans;

    3.执行命令对象.
    cmd.CommandText="";
    cmd.ExecuteNoneQuery();
    .....

    4.提交事务
    trans.Commit();

    5.回滚事务:放在catch里面
    trans.Rollback();

    加代码,举例,抓图说明。成功,不成功


    二、分布式事务
    在连接打开关闭之外设置事务。可以控制所有操作。
    1.启用DTC服务
    2.导入System.Transaction引入。
    3.使用using System.Transaction导入命名空间
    4.编写事务代码。

    TransactionScope类


    using(TransactionScope ts = new TransactionScope())
    {
    数据库操作。

    ts.Complete();
    }

    加代码,举例,抓图说明。成功,不成功


    异常处理:try...[catch...][finally..]
    一、捕获异常
    不加try..catch...一旦程序执出错,程序会立马终止。如果加上try...catch...,代表程序中已经把异常给处理了,程序只是终止try部份的运行,转入catch,整个程序不终止运行。

    1、try部份:执行的部份,一旦出错就会终止try部份的执行,走catch。程序不会终止。
    2、catch部份:异常处理,一旦出错就会走catch,在catch部份进行处理(写日志,界面显示,异常的包装替换)
    如果catch(Exception ex)。常用ex.Message获取错误信息。
    一个try可以跟多个catch,每个catch获得不同类型的异常对象。

    3、finally部份:最终收尾部份,不管程序执行是否出错,总会执行finally,即使在try部份遇到return,break等关键词时,仍然会执行finally

    二、抛出异常
    (一)造异常对象:
    Exception ex = new Exception("异常的错误信息");
    throw ex;

    (二)派生自己的异常:(少)
    class MyException:Exception
    {
    }

    其它数据访


    (一)构造:

    (二)属性:
    (三)方法:
    (四)重要代码:

  • 相关阅读:
    Java IO(三)——字节流
    Java IO(二)——RandomAccessFile
    【sqli-labs】 less50 GET -Error based -Order By Clause -numeric -Stacked injection(GET型基于错误的整型Order By从句堆叠注入)
    【sqli-labs】 less49 GET -Error based -String -Blind -Order By Clause(GET型基于盲注的字符型Order By从句注入)
    【sqli-labs】 less48 GET -Error based -Blind -Numeric -Order By Clause(GET型基于盲注的整型Order By从句注入)
    【sqli-labs】 less47 GET -Error based -String -Order By Clause(GET型基于错误的字符型Order By从句注入)
    【sqli-labs】 less46 GET -Error based -Numeric -Order By Clause(GET型基于错误的数字型Order By从句注入)
    【sqli-labs】 less45 POST -Error based -String -Stacked Blind(POST型基于盲注的堆叠字符型注入)
    【sqli-labs】 less44 POST -Error based -String -Stacked Blind(POST型基于盲注的堆叠字符型注入)
    【sqli-labs】 less43 POST -Error based -String -Stacked with tiwst(POST型基于错误的堆叠变形字符型注入)
  • 原文地址:https://www.cnblogs.com/DORCASQING/p/4054133.html
Copyright © 2020-2023  润新知