澳门至尊网站-首页

您的位置:澳门至尊网站 > 搜索引擎 > 如鹏网学习笔记,的通信形式总计

如鹏网学习笔记,的通信形式总计

2019-10-23 06:50

三种开采方式

ADO.Net基础

1.动用 vs 自带的可视化学工业具,不引入。

在 vs 的项目中增多‘数据集’,然后经过可视化的工具增多数据库为数据源,默承认加多 SQL Server 和 Oracle 等,增添 Mysql 前必要额外安装组件。

优点,自带 sql 语句中特殊字符的转义,不会出现 sql 注入的题目,合营数据绑定能够在项目中期快捷拉动项目进度。

缺欠跋山涉水的近义词可视化学工业具的应用并一时兴,不方便人民群众开荒公司的招募和连串前期的改换维护。好些个常用的效应很难使用,如爬山涉水存款和储蓄进度,事务,连接池调整等。

一、ADO.Net简介
  1,程序要经过SQL语句自动化的操作数据库,必定要用叁个类库,
    类库要提供execute("insert into ...")/executeQuery("select * from ...")相像的诀窍

2.援用 mysql.data.dll ,在这里基础上海展览中心开付出,推荐。

统统由代码完成报纸发表进程。

优点跋山涉水的近义词能够方便的应用各类功效,

破绽爬山涉水在运用的经过中要留神相当多坑,如爬山涉水至极的捕获,sql 注入 , 非托管能源的放飞等。


 


 

  2,ADO.Net是.Net中提供的正统访问数据库的接口,访谈分化的DBMS的最底层方法是不均等的,ADO.Net把拜会数据库的措施开展了联合,
    访谈MYSql、Oracle、SqlServer等不等数据库的法子差不离是千篇后生可畏律的

全部的广播发表进度

  3,ADO.Net是专门的职业,被分裂的数据库商家提供ADO.Net的完成,称之为ADO.Net驱动,各种厂商提供的驱动能够用来操作自身的数据库

1.确立连接,连接分 “长连接” 和 “短连接” 

长连接在高频次的通信时快速高效,但是占用资源,在出现访问下轻巧耗尽互连网财富,对于带宽极低的局域网来讲,假设大度运用长连接,会据有网速,影响使用体验。

短连接在利用时 open, 使用完了后 close,此时连连财富会进入连接池,等待后一次两次三番时使用。固然能源未被放飞掉,但连接池的支付超级小,是截然能够选用的。短连接相近须要思考并发难点。

澳门至尊网站,短连接在运用完了后得以平昔dispose,也许选择 using(){} 来节制连接的成效域,使用完了后自动释放掉,不进入连接池,这种措施能源占用起码,但在须求一再建设构造连接的情事下连续功效十分低。

在实质上付出的时候最佳应用短连接,并在动用达成后关门并放入连接池。

string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open(); 
conn.Close();

二、ADO.Net连接MYSQL

2.采用连接创制 sql 命令并推行

  1,安装MySql的.Net驱动mysql-connector-net-***.msi增多到品种的库中。
    假若设置境遇难题,则一直下载mysqlnetconnection(V4.5).zip。

1.纯 sql 语句,施行后有三种回到情势跋山涉水的近义词

cmd.ExecuteScalar();  // 查询结果仅豆蔻梢头行一列,直接选取

string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
MySqlCommand cmd = conn.CreateCommand();
string name = "Tom";
cmd.CommandText = string.Format("select  count(*) from student where Name = '{0}';", name);
object obj = cmd.ExecuteScalar(); //可能未null
int count = 0;
if (!obj.Equals(DBNull.Value))
{
  count = Convert.ToInt32(obj);
}  
conn.Close();  

 

 

MySqlDataReader reader = cmd.ExecuteReader();  // 通过 reader 获得大批量数量

string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandText = string.Format("select  Name from student;");
MySqlDataReader reader = cmd.ExecuteReader();
List<string> list = new List<string>();
while (reader.Read())
{
    list.Add(reader.GetString("Name"));
}
reader.Close();
conn.Close();

 

cmd.ExecuteNonQuery();  // 获得增加和删除改语句实施后影响的行数

string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
MySqlCommand cmd = conn.CreateCommand();
string name = "Tom";
cmd.CommandText = string.Format("update student SET Name='Tommy' where Name = '{0}';", name);
int count = cmd.ExecuteNonQuery();
conn.Close();

 

常见 sql 语句的症结跋山涉水的近义词假使上面例子中的 name 参数中含有单引号,整个 sql 语句将实施错误,因为未对特殊字符进行转义。首要特殊字符有单引号,反斜杠,# 等,而这几个特殊字符在区别的应用情况下临时供给转义,有的时候没有须要转义。Mysql 提供了看似 QUOTE(str) 那样的字符串管理函数,但不可能一心满意须求。

那正是sql 注入,sql 注入的定义英特网资料超多,在这里不再赘述,而常用的应用方案是行使参数化的 sql 语句。

  2,新建项目,增添引用——“扩张”,增多Mysql.Data;假若是一直解压版,然后径直助长对MySql.Data.dll的文本的援引
    static void Main(string[] args)
    {
      string connStr = ConfigurationManager.ConnectionStrings["connStr"].ToString();
      using (SqlConnection conn = new SqlConnection(connStr))
      using (SqlCommand cmd = conn.CreateCommand())
      {
        conn.Open();
        cmd.CommandText = "insert into t_fuxi ";
        int count = cmd.ExecuteNonQuery();
        Console.WriteLine(count+"受到震慑");
        Console.ReadKey();
      }
    }

2.sql 语句和 sql 参数

含有参数的 sql 语句和 sql 参数会分手传入数据库服务器中,服务器先将 sql 语句实行编写翻译,然后将 sql 参数导入编写翻译后的 sql 语句中(在那进程中活动对特殊字符实行转义),进而一直自上严防了 sql 注入的爆发。

string connStr = "server=127.0.0.1; port=3306; user id=user1; Password=pass1; database=data1; pooling = true";
MySqlConnection conn = new MySqlConnection(connStr);
conn.Open();
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select  count(*) from student where Name = @Name;";
MySqlParameter[] sps = new MySqlParameter[1];
sps[0] = new MySqlParameter("@Name", "Tom");
cmd.Parameters.AddRange(sps);
object obj = cmd.ExecuteScalar(); //可能未null
int count = 0;
if (!obj.Equals(DBNull.Value))
{
    count = Convert.ToInt32(obj);
}   
conn.Close();  

    代码解释爬山涉水
    1,MySQLConnection、MySQLCommend达成了IDisposable接口,由此利用using进行能源回笼

3.事务

多条 sql 语句的组合会出现某一条 sql 语句试行出错,而别的 sql 语句顺遂施行的景况,那说不定与预期不切合。此时亟待使用专门的学业。

事务在实行出错开上下班时间可以回滚。

职业往往富含多条 sql 语句,在行使参数化的 sql 语句时要介怀参数名称不能够长期以来。

conn.Open();
MySqlCommand cmd = conn.CreateCommand();
MySqlTransaction myTrans = conn.BeginTransaction();
cmd.Connection = conn;
cmd.Transaction = myTrans;
cmd.CommandText = "";
cmd.ExecuteNonQuery();
myTrans.Commit();
conn.Close();

 

 

    2,"Server=localhost;Database=study1;uid=root;pwd=root;Charset=utf8"叫连接字符串,
      Server是Mysql服务器的地址,Database是三番五回的数据库,uid、pwd是客商名和密码,选拔utf8编码

4.囤积进度

无论是是 sql 语句依旧政工,在传输指令的时候都急需开销多量的时刻,数据库编写翻译这几个指令也亟需成本大批量时日,那不利于高访问量的数据库的运维。

积累进度是将 sql 指令写在数据库中,此时数据库直接到位编写翻译,与数据库通信是只须求传递参数就能够。节省了传输时间和编写翻译时间。

conn.Open();
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "SpFillStudent";

MySqlParameter paraMoney;
paraMoney = cmd.Parameters.Add("@inMoney", MySqlDbType.Decimal);
paraMoney.Direction = ParameterDirection.Input;
paraMoney.Value = 50;

MySqlParameter paraTradeType;
paraTradeType = cmd.Parameters.Add("@inTradeType", MySqlDbType.String);
paraTradeType.Direction = ParameterDirection.Input;
paraTradeType.Value = "会员卡充值";

MySqlParameter paraPayDetailStr;
paraPayDetailStr = cmd.Parameters.Add("@inPayDetailStr", MySqlDbType.String);
paraPayDetailStr.Direction = ParameterDirection.Input;
paraPayDetailStr.Value = "";

MySqlParameter paraOutResult;
paraOutResult = cmd.Parameters.Add("@outResult", MySqlDbType.String);
paraOutResult.Direction = ParameterDirection.Output;

cmd.ExecuteNonQuery();
string result = (string)paraOutResult.Value;
conn.Close();

 

    3,conn.Open();在试行MySqlCommand在此之前必供给先开发数据库连接,不然会报错

    4,ExecuteNoQuery是进行Update、Insert、Delete等非查询语句,重临值为受影响的行数

  3,ExecuteScalar
    实践查询,并重临查询所重临的结果集中第朝气蓬勃行的率先列,忽视其余行列。平常用来大约的得到自由龙精虎猛行一列的询问结果的值

    案例1
    cmd.CommandText = "Select count(*) from T_Users";
    long count = (long)cmd.ExecuteScalar();

    案例2
    cmd.CommandText = "Select Password from T_Users where UserName = 'admin'";
    string pwd = (string)cmd.ExecuteScalar();
    if(string.isNullOrEmpty(pwd))
    {
      Console.WriteLine("找不到admin");
    }
    else
    {
      Console.WriteLine("admin的密码:"+pwd);
    }

  4,试行查询 MySqlDataReader

    cmd.CommandText = "select * from T_Users";
    using(MySqlDataReader reader = cmd.ExecuteReader())
    {
      while(reader.Read())
      {
        long id = reader.GetInt64("Id");
        string userName = reader.GetString("UserName");
        string passWord = reader.GetString("Password");
        Console.WriteLine("id="+id+";UserName="+userName+";Password="+passWord);
      }
    }

    注意:
      Reader的遍历、读取时索要Connection保持接二连三,假若关闭了Connection,使用会出错
      也足以借助列序号获取列的值,效率略高,不进程序不轻巧读;通过reeder.GetOrdinal("Age")获取列名对应的类别号

三、SQL注入漏洞

  1,是由于Sql语句的拼接产生的,
    在程序接纳客户的输入时,供给考虑客商输入的内容对数据库操作爆发的熏陶,

  2,对应的化解办法,参数化查询

    cmd.CommandText = "select count(*) from TUsers where username=@username and password=@password";
    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@UserName", Value = username });
    cmd.Parameters.Add(new SqlParameter() { ParameterName = "@Password", Value = password });

    为啥那样可以幸免“SQL注入漏洞”,
    由此利用参数化查询,就能够对顾客输入的开始和结果张开决断和管理了,本质上是参数赋值

    注意:
    1,全部SQL中都能够应用参数化查询传递;表名、字段名等不可能动用参数化进行轮换
    2,不要用SqlParameter(string parameterName,object value)这些构造函数,
    因为("Age",0)会被相配成Sqlparameter(string parameterName,SqlDbType dbType)那个构造函数

四、基本数据类型为空的主题材料

  1,把T_Persons表的Name、Age列改革为“允许为空”,插入一条Name、Age为空的行
    实践后发掘,对于空数据reader.Get**方法会抛异常SqlNullValueException,
    也正是问数据库“当前进的Name”是怎么,数据库告诉您“不明了”。

    怎么解决?
    使用ISDBNull获取钦命序号的列的值是还是不是为null

    int? age = null;
    if(!reader.IsDBNull(reader.GetOrdinal("Age")))
    {
      age = reader.GetInt32("Age");
    }

五、离线结果集DataSet

  DATAReader是服务器结果集游标的反映,所有查询出来的多寡都在MySql服务器上。
  好处是跋山涉水的近义词当查问结果数据量打客车时候制止占用地面内部存储器。

  可是超过46%项目中都会制止大查询结果,由此缺点就显明了
  读取的时候必得保证Connection,不独有用起来麻烦,并且会较长时间占用MySql服务器的总是能源

  DataSet是一个离线结果集容器,它把结果数据放到本地内部存款和储蓄器中。
  因为查询结果或许会蕴藏七个表,由此DataSet富含若干DataTable(ds.Tables),
  DataTable包括若干DataRow(dt.Rows)

  用法1:
  DataSet ds = new DataSet();
  MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
  adapter.Fill(ds);
  DataTable table = ds.Tables[0];

六、DataTable
  DataSet能够吐放多个查询结果集到DataTable

  DataAdapter还足以对结果进行傻机巴二化更新、删除、改过。

  大家日常查询结果集就叁个DataTable,DataAdapter的傻瓜化更新不切合职业的品种,因而有更简明的用法

  DataTable dt = new DataTable();
  dt.Load(reader);

  注意爬山涉水 把DataTable证明到using外,using外再选用查询结果

  遍历DataTable

  for(int i =0;i<dt.Rows.Count;i++)
  {
    DataRow row = dt.Rows[i];
    string name = row.IsNull("name")?null:(string)row["Name"];//NULL处理
    Console.WriteLine("name="+name);
  }

七、封装一个库爬山涉水解析

  1,ADO.Net的连续几天字符串写到配置文件中。

  2,每便操作数据库都要写如日中天坨代码,太累,因此封装二个简化ADO.Net操作的库出来爬山涉水
    配置文件的装置连接字符串;简化连接的创导;简化SQL的举办

  3,倘使贰个操作要履行多条SQL语句,即便每条都开拓三个总是——施行——关闭连接的话,功效会超级低,而且会有“事务”的主题素材。
    由此应当提供“张开、试行、关闭”那样的艺术,也要提供“使用后现存连接执行的不二秘技”。

  4,参数化查询的询问参数个数不显然,可变长度参数会更利于

  5,为了有助于大多数境况下的小结果集,推行查询重回DataTable

八、MySqlHelper方法规划

  1,public static MySqlConnection CreateConnection()

  2,public static int ExecuteNonQuery(MySqlConnection conn,string sql,params MySqlParameter[] parameters)

  3,public static int ExecuteNonQuery(string sql,params MySqlParameter[] parameters)

  4,public static object ExecuteScalar(MySqlConnection conn,string sql,params MySqlParameter[] parameters)

  5,public static object ExecuteScalar(string sql,params MySqlParameter[] parameters)

  6,public static DataTable ExecuteQuery(MySqlConnection conn, string sql, params MySqlParameter[] parameters)

  7,public static DataTable ExecuteQuery(string sql, params MySqlParameter[] parameters)

九、实现MySqlHelper

  1,连接字符串常常配备到App.config(网址是Web.config)中的<connectionStrings>段中
    然后使用ConfigurationManager类(供给丰硕对System.Configuration的引用)读取
    string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString     

    注意:
    一定要确认保障代码中的名字和配备文件中的名字是均等的

  2,别的办法的兑现

  3,测量试验多少个主意,调用无需自身支配连接的,再调用公用二个接连的

十、获得活动增进字段的值

  1,不可能用插入后拿走最大值的法子,有出现难点

  2,要在同多个连连中跋山涉水的近义词select LAST_INSERT_ID()

  3,可以Insert、LAST_INSERT_ID()在同一个老是中独立实践,也得以把LAST_INSERT_ID()放到insert语句前面用;
    分割(使用ExecuteScalar推行就可以)

十豆蔻梢头、事务基础

  1,有三个供给,相仿于转账,从Tom的工薪上转走10元,转到杰瑞的报酬上加码10元

    Update T_Employees Set Salary = Salary - 10 where Name = 'Tom'
    Update T_Employees Set Salary = Salary + 10 where Name = 'Jerry'

    假设举办从杰瑞账上加10元的时候施行出错(使用SQL语法写错误模拟),那么就能够合世总体遗失10元的难点,要是是转账呢?

  2,事务(Transaction)有第四次全国代表大会特征跋山涉水的近义词
    原子性、一致性、隔离性、持久性
    原子性指的是跋山涉水的近义词多少个操作依旧都成功,要么都未果

十二、ADO.Net事务

  1,要在一个连接中(不然要涉及到分布式事务)
    MySqlTransaction tx = conn.BeginTransaction();
    操作停止后实践tx.Commit()提交业务;
    借使实施出错,则tx.Rollback()回滚(当前事务的操作全体收回)

    示例代码爬山涉水
    MySqlTransaction tx = conn.BeginTransaction();
    try
    {
      MySqlHelper.ExecuteNonQuery(conn,"Update T_Accounts set Amount = Amount-1000 where Number ='0001'");
      string s = null;
      s.ToLower();//创立极度
      MySqlHelper.ExecuteNonQuery(conn, "Update t_accounts Set Amount=Amount+1000 where Number='0002'");
      tx.Commit();
    }
    catch(Exception ex)
    {
      tx.Rollback();
    }

    事务还应该有隔断等第、嵌套事务等主题素材

十三、SQLServer的使用

  1,安装,版本跋山涉水的近义词二零一零有宽容性的主题素材,有bug、因而推荐安装SQLServer 2008XC902

  2,Management Studio的使用

    SQLServer的三种连接情势爬山涉水
    Windows 身份验证(相互信赖的局域网中);
    SQLServer身份验证(使用SQLServer顾客名密码验证,密码要复杂一点)。
    Windows 身份验证还恐怕有贰个用场爬山涉水忘了sa密码,能够本机进去改。

  3,新建数据库、新建表
    SQLServer的数据类型
    (varchar和nvarchar;nvarchar(n)和nvarchar(MAX);
    long是bigint;
    获取前10条数据: select top 10 * from t_persons )、
    SQLServer的自动增进(是标记)、无需新鲜内定编码

  4,保存表设计修正的时候,假如报错“分裂意保留纠正”爬山涉水
    工具→选项→Designers→把“阻止保存要求再次创制表的越来越高”勾选掉。
    境遇报错音讯爬山涉水要先留意阅读。

  5,实行SQL语句(数据库上点右键“新建查询”,不要点【调节和测量试验】)

十四、ADO.Net连接SQLServer
  1,ADO.Net怎么样连接SQLServer跋山涉水的近义词
    SQLServer驱动内置

  2,连接字符串爬山涉水
    server=ip;user id =sa;passWord = 密码;database = db1

  3,SQLHelper:
    把MySql替换到Sql就足以了

  4,获得自行增加列的值爬山涉水
    Insert into t1(...) output insert.Id values(....)

  5,若是依照接口编制程序,只要退换CreateConnection就足以了,查询参数以Directory<string,object>传递
    假若接纳Provider,连代码都不要改,改配置文件就可以

 

 

 

 

 

本文由澳门至尊网站发布于搜索引擎,转载请注明出处:如鹏网学习笔记,的通信形式总计

关键词:

  • 上一篇:没有了
  • 下一篇:没有了