1. 概述

使用的命名空间: System.Data.SqlClient

连接字符串    服务器/数据库实例+数据库名称+安全信息+用户名+密码  可参考http://www.connectionstrings.com

2. 常用类

( 1) SqlConnection类

1). 处理连接相关事项

2). 实现了IDisposable接口,因此使用完之后资源要释放 一般使用 using语句资源管理机制 或 try-catch-finally。

类似的类型还有 FileStream 类型。 conn.Close()方法 只关闭连接而不释放,仍可再次打开

conn.Dispose(bool)方法 完成释放连接,已包含 Close() 方法。

3). CreateCommand()方法    public System.Data.SqlClient.SqlCommand CreateCommand()

返回 SqlCommand 类型的对象

(2) SqlCommand类  (除使用new外,另可由SqlConnection类的CreateConnection()生成对象)

1). 处理命令相关事项

2). 实现了IDisposable接口,因此使用完之后资源要释放 一般使用 using语句资源管理机制 或 try-catch-finally。

3). CommandText属性   public override string CommandText { set; get; } 存放SQL语句

4). Parameters属性    public System.Data.SqlClient.SqlParameterCollection Parameters { get; }

通常使用 Add 方法

Clear()方法   public override void Clear()

通常,对于while循环里的同一个Connection,每次添加的参数要清除后才能再添加。

此方法从SqlParameterCollection 中移除所有SqlParameter 对象。

5). ExecuteNonQuery()方法  public override int ExecuteNonQuery()

对应非查询语句,如 insert/delete/update。 返回受影响的行数。

6). ExecuteReader()方法  public System.Data.SqlClient.SqlDataReader ExecuteReader()

对应查询语句。

7). ExecuteScalar()方法  public override object ExecuteScalar()

对应查询语句,返回结果集的第一行第一列数据,类型为Object, 使用时要转换。

使用动机: 多结合SQL语句: select count(*) from…用在判断是否返回数据,以作进一步操作

(3) SqlDataReader类

1). 实现了IDisposable接口,因此使用完之后资源要释放 一般使用 using语句资源管理机制 或 try-catch-finally。

2). 除使用new外,另可由SqlCommand类的ExecuteReader()生成对象 
        3). 其对象实质为指针,对应于数据库游标。本身不存储数据,知道读时,才会取数据库中数据

4). Reader()   public override bool Read()

使SqlDataReader 前进到下一条记录, 如果存在多个行,则为 true;否则为 false。

常与while() 语句组合使用。

5). GetOrdinal(string)方法   public override int GetOrdinal(string name) 
                                      在给定列名称的情况下获取列序号,参数name: 列的名称,返回从零开始的列序号。 
        6). GetString(int)、GetInt32(int)等方法

只接受整形参数,得到相应的值。

using(SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Workspace\Database1.mdf;Integrated Security=True;User Instance=True"))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from T_User";
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
//取出当前行的第1列的数据
Console.WriteLine(reader.GetString(1)); //其中reader.GetOrdinal("UserName")是根据字段名得到这一列的序号
Console.WriteLine("跟据用户名得到根:"+reader.GetString(reader.GetOrdinal("

UserName

"))
}
}
}
}

链接

     SQL表名最好不要为关键字,如果需要,则在查询字符串中使用“[ ]”。
     要想得到自动增长字段的主键值,在SQL语句中的values关键字前加上“

output inserted.Id

”(Id为主键字段名)   
         insert into T_Users(username,password) output inserted.ID values(‘admin’,'888’)
         int i=Convert.Toint32(cmd.Executescalar);
    @usename 表示此处用参数替代,在SqlConnection的Parameters属性中添加参数

(4) SqlParameter类

1) 为防止注入式攻击。 
        2) public sealed class SqlParameter : System.Data.Common.DbParameter 
        3) 表示 System.Data.SqlClient.SqlCommand 的参数,也可以是它到 System.Data.DataSet 列的映射。此类不能被

继承。

4) 构造函数

public SqlParameter(string parameterName, object value)

一个缺陷:由于System.Data.SqlDbType是枚举类型,枚举值为整数,上面的构造函数经常与下图第四个混用。

如value为0时,改进方法:SqlParameter("id”,0)变为 SqlParame("id",(object)0);

其他构造函数,可参考相关文献

2. 相关知识

(1). ConfigurationManager类  public static class ConfigurationManager

1). 在命名空间 System.Configuration 中定义

2). 提供对客户端应用程序配置文件的访问。无法继承此类。

3). 在部署的应用程序中,修改配置信息,可通过./bin/Debug/项目名.config文件。

string constr=ConfigurationManager.ConnectionStrings[“txl”].ConnectionString;

(2).封装连接  SQLHelper

class SQLHelper
{
//ExecuteNonQuery("insert into t(f1,f2) values(@f1,@f2)",p1,p2,p3,p4)
public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
{
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(constr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
//需要两个SqlParameter对象
foreach (SqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
return cmd.ExecuteNonQuery();
}
}
} public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
{
string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection conn = new SqlConnection(constr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
foreach (SqlParameter parameter in parameters)
{
cmd.Parameters.Add(parameter);
}
return cmd.ExecuteScalar();
}
} } //不宜封装,因为当SQLHelper.ExecuteReader()执行完之后,返回的DataReader对象已不能用了
//若想使用,可利用DataSet机制
public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] parameters)
{ }
}

3. 弱类型

(1). DataSet类

1).数据在内存中的缓存,服务器断开不影响数据的读取。

2).包含若干张DataTable, DataTable包含若干行DataRow。

3).Tables属性   public System.Data.DataTableCollection Tables { get; }  获取包含在DataSet中的表DataTable的集合

4).GetChanges()方法  public System.Data.DataSet GetChanges() 得到修改后“结果集”,降低传递的资源占用。

获取 System.Data.DataSet 的副本,该副本包含自加载以来或自上次调用 DataSet.AcceptChanges() 以来对该数据集进行的所有更改。可以对该副本执行操作,然后可以使用 DataSet.Merge(DataSet) 将其合并回去。如果未找到更改的行,则该方法将返回 null。

5).AcceptChanges()方法  public void AcceptChanges()

提交自加载此DataSet 或上次调用DataSet.AcceptChanges() 以来对其进行的所有更改。

(2). DataTable类

1). 表示内存中数据的一个表。

2). 包含若干行DataRow

3). Rows属性  public System.Data.DataRowCollection Rows { get; }

获取属于该表的行的集合。返回值:包含 System.Data.DataRow 对象的 System.Data.DataRowCollection;否则为 null 值(如果不存在任何 System.Data.DataRow 对象)。

4). NewRow()方法  public System.Data.DataRow NewRow()

创建与该表具有相同架构的新 System.Data.DataRow。

5). AcceptChanges()方法,GetChanges()方法  同DataSet类类似

public void AcceptChanges(), public System.Data.DataTable GetChanges()

6)与DataSet关系

DataSet类的 DataTableCollection类型的属性存放此类对象的集合。它有Add(),Remove(),RemoveAt()方法等。可使用”索引指示器“机制读写相关数据。

(3). DataRow类 
       1).表示 System.Data.DataTable 中的一行数据

2).AcceptChanges()方法 public void AcceptChanges()

提交自上次调用 System.Data.DataRow.AcceptChanges() 以来对该行进行的所有更改。

3)与DataTable关系

DataTable类的 DataRowCollection类型的属性存放此类对象的集合。它有count属性

RemoveAt()方法等。可使用”索引指示器“机制读写相关数据。

(4). SqlDataAdapter类

1). 表示用于填充 System.Data.DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。无法继承此类。

2). 构造函数

前两个构造函数的第一个参数是指 SqlDataAdapter类的SelectCommand属性。是T-SQL查询语或存储过程。

3). Update()方法

为指定的对象插入、已更新或已删除的行,调用相应的 INSERT、UPDATE 或 DELETE 语句。

即提交的对象可以是  DataSet,DataTable 或者 若干行DataRow。

4). Fill()方法

在指定范围中添加或刷新行以匹配使用DataSet或DataTable 名称的数据源中的行。

5). DeleteCommand  获取或设置用于从数据集中删除记录的命令。

InsertCommand  获取或设置用于将新记录插入到数据源中的命令。

UpdateCommand  获取或设置用于更新数据源中的记录的命令。

6). 提交数据时,为自动生成Command,可以使用 SqlCommandBuilder类

即 在 Update()或Fill()方法之前加入一句

SalCommandBuilder builder=new SqlCommandBuilder(adapter);

adapter使用的 SqlDataAdapter 对象。

使用前提: 表必须有主键。

(5). 可空类型

1).int、GuId、bool等 值类型 不能赋值为NULL,但String等 应用类型可赋值为NULL。

数据库int类型字段可以赋值为NULL,这就产生了C#语言与数据库的矛盾。

解决:可控类型     int? i1=NULL;    int? i2, i3;  int i4=1;

2). 判断    i3==NULL  true(为空)/false(不为空)       i1.HasValue()   true(不为空)/false(为空)

转换    可空类型to非空类型      显式    i4=i1.Value();

非空类型to可空类型      不需要显式  i2=i4;

(6). 总结

弱类型缺点:

1). 只能通过”字段名“引用。 如果写错了字段名编译时不会发现错误。如 dataset.Tables[0].Rows[0][“age”];

2). 需类型转换。如 int age=Convert.ToInt32(dataset.Tables[0].Rows[0][“age”]); 取出的为Object类型,易出错。

3).运行时方知所有列名,数据绑定麻烦,不适应快速开发。

4 Typed DateSet   (一切都是自动生成)

(1).字符串:  项目文件   Property下的Settings.Settings查看

部署后在   bin/Debug/项目名称.config文件中

(2). 表名TableAdapter类

GetData() 返回 表名DataTable 一般首次返回DataTable时使用

Fill(DataSet) 提交

Update(DataSet) 提交   可能会发生异常,程序需通过主键来定义需要更新的行。

处理方法:   数据库设主键,DataTable右击“配置”

以上方法都有对应的SQL语句。也可自定义SQL语句,生成对应的方法(dataset右击“添加”)

Connection属性 拥有open() 、close()和 state属性

(3).项目名DataSet类、表名DataTable类和表名Row类

(4). 优缺点

1) 每次修改”字段“需重新生成DataSet

2) 通过列名取数据需保证字段值不能为NULL,否则会报异常。因此,使用之前需判空 IsValueNull()方法

5 其他类型

Technorati 标签: ado.net,dataset

(1)Stopwatch类  在 System.Diagnostics命名空间下   秒表计时类

Start()、Stop()和 public System.TimeSpan Elapsed { get; }属性(获取当前实例测量得出的总运行时间)

(2)MessageBox类  在System.Windows.Forms命令空间下

显示可包含文本、按钮和符号(通知并指示用户)的消息框。

一个Show()方法用于显示具有指定内容的消息框。

(3)ComboBox类   public class ComboBox : System.Windows.Forms.ListControl

下拉列表组合框

Items属性   public System.Windows.Forms.ComboBox.ObjectCollection Items { get; }

获取一个对象,该对象表示该ComboBox 中所包含项的集合。 
                                     SelectedItem属性   public object SelectedItem { get;  set; }

获取或设置 ComboBox 中当前选定的项。

SelectedIndexChanged事件  System.Windows.Forms.ComboBox.SelectedIndexChanged

在 System.Windows.Forms.ComboBox.SelectedIndex 属性更改后发生

ToString()方法

分清 DisplayMember和ValueMember

 
 

ADO.NET知识学习总结的更多相关文章

  1. 网络知识学习2---(IP地址、子网掩码)(学习还不深入,待完善)

    紧接着:网络知识学习1 1.IP地址    IP包头的结构如图 A.B.C网络类别的IP地址范围(图表) A.B.C不同的分配网络数和主机的方式(A是前8个IP地址代表网络,后24个代表主机:B是16 ...

  2. HTML5标签汇总及知识学习线路总结

    HTML5标签汇总,以及知识学习线路总结.

  3. 安全测试3_Web后端知识学习

    其实中间还应该学习下web服务和数据库的基础,对于web服务大家可以回家玩下tomcat或者wamp等东西,数据库的话大家掌握基本的增删该查就好了,另外最好掌握下数据库的内置函数,如:concat() ...

  4. GCC基础知识学习

    GCC基础知识学习 一.GCC编译选项解析 常用编译选项 命令格式:gcc [选项] [文件名] -E:仅执行编译预处理: -S:将C代码转换为汇编代码: -c:仅执行编译操作,不进行连接操作: -o ...

  5. 毕业设计预习:VHDL入门知识学习(一) VHDL程序基本结构

    VHDL入门知识学习(一) VHDL程序基本结构 简介 VHDL程序基本结构 简介 概念: HDL-Hardware Description Language-硬件描述语言-描述硬件电路的功能.信号连 ...

  6. 「日常训练&知识学习」单调栈

    这几天的知识学习比较多,因为时间不够了.加油吧,为了梦想. 这里写几条简单的单调栈作为题解记录,因为单调栈的用法很简单,可是想到并转化成用这个需要一些题目的积淀. 相关博客参见:https://blo ...

  7. (转)Linux基础知识学习

    Linux基础知识学习 原文:http://blog.csdn.net/ye_wei_yang/article/details/52777499 一.Linux的磁盘分区及目录 Linux的配置是通过 ...

  8. Objective-c基础知识学习笔记

    Objective-c基础知识学习笔记(一) 一直有记录笔记的习惯.但非常久没分享一些东西了,正好上半年開始学习IOS了,如今有空写点.因开发须要,公司特意为我们配置了几台新MAC.还让我们自学了2周 ...

  9. MySQL索引知识学习笔记

    目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...

随机推荐

  1. 【咸鱼教程】Egret中可长按复制的文本(例如复制优惠码)

    一 实际效果二 实现原理三 源码下载 在egret中实现长按复制文本效果,一般用于复制优惠码什么的. 一 实际效果         二 实现原理 在egret的游戏元素都是绘制在canvas上的,我们 ...

  2. Git - 忽略Xcode工程中UserInterfaceState.xcuserstate文件的问题

    一.在同 .Git目录下创建.gitignore文件.在文件中加入如下内容: *.xcuserstate project.xcworkspace xcuserdata UserInterfaceSta ...

  3. OC开发_整理笔记——多线程之GCD

    一.进程和线程   二.各种队列! 1.GCD:Grand Central Dispatch 2.串行队列(Serial)      你可以创建任意个数的串行队列,每个队列依次执行添加的任务,一个队列 ...

  4. vue---指令怎么写

    我们在考虑做一些功能性的封装的时候,我们会考虑使用vue的指令来做,那么指令应该怎么写: 具体参考: https://cn.vuejs.org/v2/guide/custom-directive.ht ...

  5. 2018上C语言程序设计(高级)作业- 第4次作业

    作业要求一 1.设计思路: 第一步:首先通过cmd进行判断 第二步:根据题目写的分别进入不同的判断函数,进行逐一判断: 2.实验代码: #include <stdio.h> #includ ...

  6. POJ--1936 All in All(水题,暴力即可)

    All in All Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 30543 Accepted: 12723 Descript ...

  7. codeforces#518 Div2 ABCDE

    A---Birthday http://codeforces.com/contest/1068/problem/A 题意: 有n种硬币,m个人.m个人要给Ivan送硬币,每个人送的硬币都要互不相同但数 ...

  8. H-数学考试 想法题+最新头文件 2018年长沙理工大学第十三届程序设计竞赛

    https://www.nowcoder.com/acm/contest/96/H 坑点:INF开太小了... #define _CRT_SECURE_NO_WARNINGS #include< ...

  9. POJ - 1191 棋盘分割 记忆递归 搜索dp+数学

    http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的 ...

  10. Cloud Native Application理论备忘录之(一)——Microservice architectural style

    感谢一路走来默默支持和陪伴的你~~~ ------------------欢迎来访,拒绝转载------------------- 1. 传统云平台的架构体系:用户界面层.业务逻辑层.数据访问层 2. ...