Sql Server + ADO.NET

MsSql-
http://www.cnblogs.com/zhangwei595806165/archive/2012/02/23/2364746.html

协议:
Shared Memory :效率最高,在内存中操作,是能用于本机,用.或(local)就等登录
Named Pipes :Winodows与Windows交流的协议,机器名交流,一般用不到
Tcp-Ip :通过IP地址访问服务器 _用Ip地址登录

字段的数据类型:
Image 可用来存储图像,以二进制数据存储,但图片放进数据库效率很低。

以文本方式存储:
Char(1-8000) 定长字符数据,空格补齐,低于五个字符最好使用char
Varchar(1-8000)定长字符,字符少会空格补齐,性能高
Nchar(1-4000) 固定长度,两个字节存储一个字符,空间换时间
Nvarchar(1-8000)可变长字符数据,字符不会补齐,两个字节存储一个字符但搜索时效率会低
varchar(MAX)/nvarchar(MAX):存储大数据的文本,2005之前用text,text不能用模糊查询

精确数值存储:
bit :0/1/null
int :四字节存储一个数据
bigint:比int范围更大更广,八个字节存储一个数据。

日期类型

datetime: 1753.1.1~9999.12.31,表示一个完整的日期类型
datatime2 :最早甚至可以追溯到中华文明五千年。。。。大部分用datetime就足够
time:小时:分钟:秒 主要存储时间

t-sql建表:

create database 数据库名
on[(
name='',
size=.;
filename='绝对路径'
)]

create table 表名(
字段名 类型 是否为可空(默认为空) 约束

---------------
约束:
主键约束:不能为空 primary key
外键约束:foreign key 外键的列与列最好要一样。 referecnces 关联的表(字段)
唯一约束:unique
自增:标识种子和标识增量中设置。
检查约束:check,检查可以在c#程序中检查,在数据库中设置检查会消耗效率。
默认约束:default('默认值')
非空约束:not null ,默认为null
-----------------------

sql的执行顺序--先找到表,分组,查询数据。

------------
CRUD:
增:insert into 表名(列名) values() // values中需要对应列名的顺序
删:delete from 表名 ...
改:update 表名 set 列名=值 ...
查:select 字段 from 表名 ...

聚合函数:
Sum :取和
Avg :求平均值
Count:计算次数
Min/Max:求最大或最小

排序: 前面top关键字,order by 列名 desc( 降序)默认升序 asc
去重复: distinct select distinct 字段 from... 判断字段是否重复,对后面所有的列进行去重复
分组: group by 列名 select后面只能跟 group by 后面的字段或聚合函数
分组后查询: group by 后面+having

Ado.Net-------------------------------
访问数据库的驱动-ado.net

SqlConnection:
负责连接数据库。服务器Ip,用户名,密码,数据库名。
Disponse(释放)后不能在被Open
Open之后不能再次Open
连接池:通过连接字符串配置连接池,当连接池中有连接时,不创建新连接,使用连接池中的连 接。实现了连接对象重用的效率
--一个连接字符串对应于一个连接池

server=.;uid=sa;pwd=123;database=... //通过用户名密码连接
server=.;Integrated Security=SSPI;database=... //通过windows验证连接

SqlCommand:sql命令的封装,有重载,可以把connection直接给sqlcommand
-ExecuteNonQuery():返回执行sql语句后几行受影响,返回int类型
-ExecuteScalar() :返回查询结果第一行,第一列的数据,返回Object
-ExcuteReader() :返回一个reader,指针,指向表的标头,返回SqlDataReader

SqlDataReader:在线的读取数据,当读取中,不允许关闭connection管道。
-Read():指向下一行数据,每次执行都指向下一行,返回bool类型,可作为循环判断值
读取数据:用SqlDataReader实例化后的对象加具体的列名或索引读取。如read["AA"]
-GetXXX:如GetString,获取当前行的某一列的值

------------
DataReader与DataAdapter的区别:
DataReader是在线的读取,在读取中,连接管道要一直开启,不能关闭
DataReader要通过SqlCommand执行Sql语句之后,用DataReader读取。
适用于数据量庞大的情况

DataAdapter是离线的读取,甚至不用打开管道,Fill方法中自动判断。
DataAdapter不用显示的声明Sqlcommand,也不用显示的打开管道。DataAdapter初始化后会自动判断是否打开管道,并且自动创建SqlCommnd对象并执行。
适用于数据量小的情况


SqlDataAdapter数据访问适配器------------------
适配器:把一个不符合规范的数据,适配成符合规范的数据
SqlDataAdapter初始化后:
会判断是否打开连接,
并自动创建一个SqlCommand对象、
通过command对象执行Sql语句,
并返回一个SqlDataReader对象。
读取查找到的数据后填充到DataTable中


数据 → SqlDataAdapter → DataSet/DataTable


配置文件,config--------------
config文件的更多详细信息:http://www.cnblogs.com/fish-li/archive/2011/12/18/2292037.html
把可能需要改动的数据,放在App.config或web.config
<connectionStrings>
<add name="SqlConfig" connectionString="server=.;Integrated Security=SSPI;database=db_Demo"/>
</connectionStrings>

那我们怎么用呢?记得引用system.configuration.dll
ConfigurationManager.ConnectionString


Sql注入漏洞------------
用户在输入的地方,利用特殊字符,过掉判断。


T-sql语言中@...被当成一个变量
select * from database where UserName=@UserName and UserPwd=@UserPwd
cmd.Parameters.Add(参数,参数的值) 如 cmd.Parameters.Add("@UserName",123)//此方法过时
参数化Sql,如果其中有特殊字符,会自动进行转码,过滤掉特殊字符。
or
SqlParameter parameter = new SqlParameter("@A", SqlDbType.NVarChar);
parameter.SqlValue = "200";
cmd.Parameters.Add(parameter);


DataSet(数据表的集合),DataTable(数据列的集合)-----------------------

DataSet:离线数据集
一个DataSet中包含很多DataTable ,一个DataTable中包含很多DataColumn(数据列)

DataTable:离线数据表
当找到到数据填充到数据表之后,
遍历之后封装成强类型对象,把强类型对象给数据源。
-创建一个数据库实体类,把查到的数据赋给强类型对象

List<DemoInfo> demo = new List<DemoInfo>(); //DemoInfo为数据库实体类
foreach (DataRow dr in dt.Rows)
{
Console.WriteLine(dr["A"] + " " + dr[1]);
demo.Add(new DemoInfo
{
AAA = dr["A"].ToString(),
BBB = dr["B"].ToString(),
CCC = dr["C"].ToString(),
});
}
dgvUserInfo.DataSource = demo;

--视图(待更新)

--索引(待更新)

--事物(待更新)

--存储过程(待更新)

感谢着知识大爆炸的时代,感谢这人人共享的精神
原文地址:https://www.cnblogs.com/Zhang-silence/p/6415601.html