干货满满,记得备水!
C#
- C#基础
- //1.C#简介
- //1.变量的声明与赋值
- //2.数据类型
- //3.字段
- //4.类型转换
- //5.运算符和操作符
- //1.数组的声明与赋值
- //2.数组的属性
- //3.数组的方法
- //1.类的定义与对象的实例化
- //2.定义方法并使用
- //3.对象数组
- //4.修饰符
- //5.关键词
- //1.程序和程序结构
- //2.if选择结构
- //3.switch结构
- //4.while和for循环结构
- //5.foreach循环结构
- //1.数字函数:Math
- //2.生成随机数:Random
- //3.时间:DateTime
- //1.预处理器:#region、可折叠代码块
- //2.异常处理:Exception
- //1.字符串的属性
- //2.字符串的方法
- 构造方法:new string('字符',数量)
- 判断字符串是否相同:Equals()
- 比较字符串里字符转整数的大小:string.Compare(Str1,Str2)
- 获取字符串中,内容的索引位置
- 字符串的截取:Substring()
- 分割字符串为字符串数组:Split()
- 拼接字符串数组为字符串:string.Join("拼接符",数组名)
- 字符串转换大小写
- 去掉字符串的空格:Trim()
- 判断是否以指定子字符串开始:StartsWith()
- 判断是否以指定子字符串结束:EndsWith()
- 判断是否包含指定的子字符串:Contains()
- 将指定的子字符串替换成你想要的字符串:Replace()
- 判断字符串是否为空:string.IsNullOrEmpty()
- 槽占位拼接字符串:string.Format()
- 字符串的连接:string.Concat(字符串1,字符串2)
- valueOf()
- 获取每个字符的ASCII值:System.Text.Encoding.Default.GetBytes(str)
- //3.字符串的StringBuilder类型:定义可变字符串
- //1.ADO.NET结构
- //2.连接SQL数据库:Connection
- //3.执行语句:Command
- //4.检索只读、只进的数据流,每次读取一行:DataReader
- //5.执行语句,查询的返回数据将存储在DataSet:DataAdapter
- //6.创建在内存中的集合对象,相当于临时的数据库:DataSet
- //1.枚举类:Gender
- //2.结构类:struct
- //1.XML
- //2.文件
C#基础
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace day_01
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!!!");
Console.ReadKey();
}
}
}
//1.C#简介
C#是面向对象语言
- 面向对象:把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为
- 面向对象就是高度实物抽象化(功能划分)程序相当于盖浇饭
- 易维护、易复用、易扩展,性能比面向过程低
基本名词:
- .NET framework:舞台
- c#:舞台上的演员
- visual studio:开发工具
.NET框架组件
- 公共语言运行时:CLR、包含CLS数据类型和CTS面向对象的通用功能
- 框架类库:FCL
工具类:Console类
-
不换行输出:
Write()
-
换行输出:
WriteLine()
-
槽占位输出:
WriteLine("{0}{1}",one,two)
-
输入字符串:
ReadLine()
-
输入单个字符:
Read()、返回整数,整数对应字符编号
-
热键输入:
ReadKey()
转义字符:
- 单引号:\’
- 双引号:\"
- 反斜杠:\\
- 空:\0
- 警告(产生峰鸣):\a
- 退格:\b:backspace
- 换页:\f
- 换行:\n
- 回车、回到一行开头:\r
- 水平制表符:\t:tab
- 垂直制表符:\v
- 回车换行符:\r\n 推荐使用:Environment.NewLine
- 在字符串前面加@表示取消字符串中的转义
注释:Ctrl+/
- //单行注释
- /* 多行注释 */
- /// 文档注释
Visual Studio快捷键:https://zhuanlan.zhihu.com/p/98271375
//1.变量的声明与赋值
变量:可以变化的量就是变量 说明我的变量的值不固定 是随时可以进行变化操作
取名:一定要是合法的变量名
- 必须以 “字母” 或@开头
- 后面可以跟 “字母” , 数字 , 下划线
- 不能与 关键词 重名
@有2种意义:
- 字符串中如果有\,则不理解为转义符
- 使字符串可以换行
声明并赋值:数据类型 变量名 = 值;
- 例如:
int money = 100;
//2.数据类型
1.字符型char:用于存储单个字符
- char 2字节 取值范围:0 ~ 65535
例如:char a = ('A');
2.字符串型string:用于存储一串字符
- string 取值范围:任何""之间的字面值
例如:string a = ("hello java");
3.小数型float - double:用于存储小数
- float 4字节 取值范围:10^-38 ~ 10^38
- double 8字节 取值范围:10^-308 ~ 10^308
- 当你不声明的时候,默认小数都用double来表示,所以如果要用float的话,则应该在其后加上f
例如:float a=1.3f;
- float是8位有效数字,第7位数字将会产生四舍五入(5及5以下的都将舍去)
● 4.整数型byte - short - int - long:用于存储整数
- sbyte 1字节 取值范围:-128 ~ 127
- byte 2字节 取值范围:0 ~ 255
- short 2字节 取值范围:-32768 ~ 32767
- ushort 2字节 取值范围:0 ~ 65535
- int 4字节 取值范围:-2147483648 ~ 2147483647
- uint 4字节 取值范围:0 ~ 4294967295
- long 8字节 取值范围:-2的63次方 ~ 2的63次方-1
- ulong 8字节 取值范围:0 ~ 2的64次方-1
● 5.布尔型boolean:只有两个值 一个true正确 / false错误
- booleam 1字节 取值范围:true / false
● 6.object:所有类型的根
- 如果没有明确指定继承类型,默认继承自object类
//3.字段
作用
- 表示存储位置,用来保存类的各种数据信息
实例:默认不加字段
常量:const
- 无法进行修改的变量
- 例:
const int i = 10
只读:readonly
- 修饰字段,表示该字段为只读字段
//4.类型转换
自动类型转换:两种类型相互兼容 目标类型大于源类型
- 例如:
short a = 123 ;
int b = a ;
强制类型转换:两种类型相互兼容 目标类型小于源类型
- 例如:
short a = 123 ;
byte b = (byte)a ;
规则:
- 整数长度足够,数据完整。
例:int i = 100; byte b = (byte)i; //b = 100
- 整数长度不够,数据截断。
例:int i = 10000; byte b = (byte)i; //b = 16(符号位变化)
- 小数强转整数,数据截断。
例:double d = 2.5; int i = (int)d; //i = 2(小数位舍掉)
- 字符整数互转,数据完整。
例:char c = 65; int i = c; //i = 65
- boolean的取值为true/false,不可与其他类型转换。
类型转换方法:
- 字符串 转其他类型:
类型.Parse(字符串)
- 字符串 转整数:
Convert.ToInt32(需要转换的内容)
- 字符串 转小数:
Convert.ToDouble(需要转换的内容)
- 任意类型转 字符串:
Convert.ToString(需要转换的内容)
- 任意类型转 字符串:
需要转换的内容.ToString
- 数组类型转换:
Array.ConvertAll<需转换类型, 转换后类型>(数组名, s => 转换后类型.Parse(s))
//5.运算符和操作符
算术运算符 +(加) - (减) *(乘) /(除) %(模) ++(递增+1) --(递减-1)
比较运算符 > < >= <= ==(等于) !=(不等于)
逻辑运算符 &&(与) ||(或) !(非)
赋值运算符 右边进行运算 再将运算的结果赋值给左边
例如:int y = 3 * (10 - 5)
;
操作符 = += -= *= /= %=
- 例:
n += 2
相当于n = n+2
操作符 ? :布尔表达式 ? 结果1 : 结果2 (真)获得结果1 (假)获得结果2
- 例:
int i = 99;
int z = i ==100?666:111;
结果:z=111
进行算数运算时:
- 两个操作数有一个为double,计算结果提升为double。
- 如果操作数中没有double,有一个为float,计算结果提升为float。
- 如果操作数中没有float,有一 个为long,计算结果提升为long。
- 如果操作数中没有long,有一个为int,计算结果提升为int。
- 如果操作数中没有int,均为short或byte,计算结果仍旧提升为int。
- 任何类型与String相加(+)时,实为拼接,其结果自动提升为String。
//1.数组的声明与赋值
作用:
- 保存多个数据
- 批量对多个数据进行操作
数组的声明与分配空间
- 声明:
数组类型[] 数组名称
- 分配空间:
数组名称 = new 数组类型[数量]
- 声明并分配空间:
数组类型[] 数组名称 = new 数组类型[数量]
- 往数组的空间中存值:
数组[下标] = 值;
数组静态初始化
- (简化格式):
int[] i = {1,2,3};
- (完整格式):
int[] i = new int[] {1,2,3};
数组的遍历
- 获得数组的长度:数组名称.length
int[] a = {1, 2, 3, 4};
for(int i = 0; i < a.length; i++){
Console.Write("遍历:"+a[i]);
}
二维数组,一维数组的列表
- 声明并分配空间:
int[] name = new int [n] [n];
- 声明等长二维数组并分配空间:
int[, ] name = new int [n, n];
- 遍历方法:
int[][] arr = {{2, 3}, {1, 3}, {0, 0}, {0, 3}};
for(int row = 0; row < arr.length; row++) {
for(int col = 0; col < arr[row].length; col++) {
Console.WriteLine("{0} ",arr[row][col]);
}
}
三维数组,二维数组的列表
- 声明并分配空间:
int[] name = new int [n] [n] [n];
- 声明等长二维数组并分配空间:
int[, ,] name = new int [n, n, n];
数组默认值
- 整数:
0
- 小数:
0.0
- 字符:
\u0000
- 布尔:
false
- 字符串:
null
//2.数组的属性
获取维数:Rank
- 返回一维是1,二维是2
获取所有元的个数:Length
//3.数组的方法
获取指定维度中的元素个数:GetLength(维度下标)
- 获取一维(列数),下标为0。获取二维(行数),下标为1
获取指定维度的索引上限:GetUpperBound(维度下标)
//1.类的定义与对象的实例化
类的定义
- 文件名就是类名,文件名是其它的文件
给类中添加属性
- 私有属性:
String color;
- 公有属性:
public String color;
对象的实例化
类名 变量名 = new 类名();
- 例:
Day a = new Day();
获取对象的属性值并修改
对象.属性名=值
- 例:
a.color = "黄色";
//2.定义方法并使用
定义方法格式:
访问修饰符 返回值类型 方法名( 形参的类型 形参名称 ){方法执行内容}
返回值类型
- 默认:void
- 基本类型:如int
- 数组:数组类型名[]
- 字符串:String
- 自定义的类:类名
调用方法
- 对象调方法:
对象.方法名( );
- 例:
a.method();
- 方法调方法:
方法名( );
- 例:
method();
调用带有返回值的方法
- 用一个和返回值相同类型的变量 接收这个返回值
返回值类型 变量名 = 对象.方法名( );
- 例:
String js = a.method( );
调用带有参数的方法
对象.方法名( 实参1,实参n );
- 例:
a.method ( eee: "成功", i: 5 );
//3.对象数组
与普通数组的区别
- 对象数组可以存自定义对象
- 普通数组存基本数据类型
对象数组的定义
类名[] 变量名 = new 类名[长度];
对象数组中的方法调用
- 遍历调用每一个数组成员的方法
for(int i = 0; i < 对象数组.length; i++){
对象数组[i].方法名();
}
//4.修饰符
属性修饰符
- Serializable:按值将对象封送到远程服务器。在按值封送对象时,就会创建一个该对象的副本,并将其序列化传送到服务器。 任何对该对象的方法调用都是在服务器上进行的。
- STAThread:单线程套间、是一种线程模型
- MTAThread:多线程套间、是一种线程模型
访问修饰符
- 公有访问:public、不受任何限制
- 保护访问:protected、实例不能访问
- 私有访问:private、子类,实例都不能访问
- 内部访问:internal、只限本项目内访问,其他不能访问
- 内部保护访问:protected internal 内部保护访问,只限于本项目或是子类访问,其他不能访问
类修饰符
- public:不受限制
- internal:只限本项目内访问
- Partial:部分类,可以将一个类分成几部分写在不同文件中,最终编译时将合并成一个文件,且各个部分不能分散在不同程序集中。常见场景在Winform定义窗体或者控件时,自动生成的前端单元和逻辑单元。
- Abstract:修饰类,表示不能够创建该类的实例。修饰方法,表示该方法需要由子类来实现,如果子类没有实现所有的抽象方法那么子类同样是抽象类;且含有抽象方法的类一定是抽象类。
- Sealed:修饰类,表示该类不能够被继承。修饰方法,表示该方法不能被覆写。
- Static:修饰类,表示不能够实例化该类的对象,也不能含有对象成员和构造函数;修饰类成员时,该成员为类成员,只能通过(类.成员名)的方式访问
成员修饰符
-
公共修饰符:public
-
私有修饰符:private
-
保护修饰符:protected
-
内部修饰符:internal
-
virtual:修饰方法成员,表示虚方法。父类可以含有该类的实现,子类可以覆写该函数。
-
override:表示该方法为覆写了父类的方法。
-
Readonly:修饰字段,表示该字段为只读字段。
-
Const:修饰字段,表示该字段为只读字段。并且在编译时必须能够明确知道该字段的值,其值是硬编码到程序中去的,修改了该类型成员后需要重新编译才能使修改生效。
-
Readonly不能修饰局部变量,const可以。
-
abstract用来修饰抽象类,表示该类只能作为父类被用于继承,而不能进行对象实例化。抽象类可以包含抽象的成员,但这并非必须。abstract不能和new同时用。
-
sealed用来修饰类为密封类,阻止该类被继承。同时对一个类作abstract和sealed的修饰是没有意义的,也是被禁止的。
-
注意:当一个类或方法没有被任何修饰符修饰时,默认为internal。
//5.关键词
对象本身:this
- 访问时,表示访问对象本身的值
- 静态方法无法使用
从派生类中访问基类的成员:[:base()]
- 可以调用基类的构造函数、属性和方法,基类没有时,会再往上找
- 调用基类构造函数时,不需要再次指定参数的类型
- 格式:
public 子类方法名([参数列表]):base(父类方法的实参) {方法代码}
引用传递
- ref:给方法传递值类型的参数,直接操作同一个变量,必须设置其初始值,侧重于修改
- out:和ref相似,且可以不设置初始值,但是在方法中必须初始化,侧重于输出
as和is的转换规则
- as:检查两个对象类型的兼容性,并返回转换结果,不兼容则返回null
- is:检查两个对象类型的兼容性,并返回布尔值
//1.程序和程序结构
程序概念:计算机为了实现某种特定的功能而编写的一段程序
顺序结构:按照程序的顺序执行
选择结构:根据给定的条件进行判断,由判断的结果确定下一步的执行
循环结构:在条件成立的范围内,重复的执行
条件的本质最终就是布尔值
//2.if选择结构
概念:是一种根据条件判断之后 再做处理的语法结构
用法:第一个条件不成立时,执行第二个条件,都不成立执行else
- 例:
if (条件1) {
条件一成立之后执行的程序
} else if (条件2) {
条件一不成立,条件二成立之后执行的程序
} else {
两个条件都不成立时执行的程序
}
//3.switch结构
概念:用于处理定值的分支
用法:
switch(a){
case 1:
Console.WriteLine("a=1");
break;
case 2:
Console.WriteLine("a=2");
break;
default:
Console.WriteLine("a!=1或2");
break;
}
属性:
- break:打破的意思 会让代码跳出整个循环体、必须有
- default:都不满足时,执行这个程序
- yield:产生一个指定值来转移控制权
//4.while和for循环结构
概念:在条件成立的范围内,重复的执行
while():基本循环结构
- 例:
while(条件) {
条件成立之后循环执行的程序
}
int i = 0;
while(i < 10) {
Console.WriteLine(++i);
}
`
do{}while():至少会执行一次,再判断条件
- 例:
do{
至少循环一次的程序
}while (条件)
int i = 0;
do{
Console.WriteLine(++i);
}while (i < 10)
for():括号里填 初始值、循环条件、条件变化
- 例:
for (条件变量:初始值; 循环条件; 条件变量的变化){
条件成立之后循环执行的程序
}
for (int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
属性:
- continue:跳过本轮循环,下一轮还会继续
- break:跳出整个循环体,会执行循环体后面的代码
- goto:跳转标识,可以标记一个位置,再使用
//5.foreach循环结构
概念
- 用于列举出集合中所有的元素,可以迭代数组或者一个集合对象
- foreach循环是只读的,不能遍历修改数据
用法:foreach (只读变量 变量名 in 遍历元素) { }
- 例:
int[] nums = {1, 2, 3, 4};
foreach (int num in nums) {
Console.WriteLine(num);
}
//1.数字函数:Math
方法
- 返回绝对值:
abs()
- 返回上入整数:
Ceiling()
- 返回下舍整数:
Floor()
- 返回两个十进制数中较大的一个:
Max()
- 返回两个十进制数中较小的一个:
Min()
- 返回x的y次幂:
pow(x,y)
- 返回平方根:
sqrt()
- 返回指定角度的余弦值:
Cos()
- 返回指定角度的双曲余弦值:
Cosh()
- 返回指定角度的正弦值:
Sin()
- 返回指定角度的双曲正弦值:
Sinh()
//2.生成随机数:Random
创建并使用Random对象
Random r = new Random()
方法
- 返回一个正随机数,小于所指定最大值:
Next(指定最大值)
- 返回一个0-1之间的随机数:
NextDouble()
//3.时间:DateTime
创建并使用DateTime对象,获取本地时间
DateTime DT = DateTime.Now
属性
- 年:Year
- 月:Month
- 日:Day
- 时:Hour
- 分:Minute
- 秒:Second
方法
-
获得当前日期、格式为 2020年1月1日:
ToLongDateString()
-
获得当前日期、格式为 2020/1/1:
ToShortDateString()
-
获得当前时间、格式为 17:59:23:
ToLongTimeString()
-
获得当前时间、格式为 17:59:
ToShortTimeString()
-
获取此实例的日期:
Date
//1.预处理器:#region、可折叠代码块
用法:
#region 折叠后的说明文字
折叠的代码
#endregion
#region 输出打印i
int i = 0;
Console.WriteLine(i);
#endregion
//2.异常处理:Exception
属性
- 获取 用户定义的其他异常信息的键/值对的集合:Data
- 获取或设置 指向此异常所关联帮助文件的链接:HelpLink
- 获取或设置 HRESULT (特定异常的编码数字值):HResult
- 获取 导致当前异常的 Exception 实例:InnerException
- 获取 描述当前异常的信息:Message
- 获取或设置 导致错误的应用程序或对象名称:Source
- 获取 调用堆栈上直接帧的字符串表示形式:StackTrace
- 获取 引发当前异常的方法:TargetSite
异常捕捉:Try-Catch-Finally
- 用法:
try {
可能出现异常的代码写这里
} catch (异常类型 异常对象){
出错后执行的代码
} finally {
资源回收代码
}
- 一个try块可对应多个catch块,用于捕获多个不同异常,但只会执行其一
- 所有父类异常的catch块放在子类异常块的后面
- finally块回收在try块中打开的物理资源,如数据库连接,网络连接等
- try不能独立存在,finally不是必须存在。必须先执行完finally后再返回
//1.字符串的属性
得到字符串的字符数:Length
- 用法:
字符串.Length
不分配存储空间:string.Empty
//2.字符串的方法
构造方法:new string(‘字符’,数量)
- 用法:
string Str = new string('H',20)、构造由20个H组成的字符串
- 用法:
string Str = new string(new char[]{'H','e','l','l','o'})、hello
判断字符串是否相同:Equals()
- 用法:
string Str=“内容”; Str.Equals("内容");返回true
- 不区分大小写:
Equals("内容", StringComparison.Ordinal IgnoreCase)
比较字符串里字符转整数的大小:string.Compare(Str1,Str2)
- 返回整数:1表示大于 0表示等于 -1表示小于
- 字符一个个进行比较,只要一个字符不相同,那么就停止比较得出结果
获取字符串中,内容的索引位置
- 从左边开始找:
IndexOf()
- 用法:
string Str="hello"; Str.IndexOf("l"); 返回整数2
- 从末尾开始找:
LastIndexOf()
- 用法:
string Str="hello"; Str.LastIndexOf("l"); 返回整数3
- 注意点:lastIndexOf,返回的是从左往右数的下标
字符串的截取:Substring()
- 一个参数表示从指定的位置截取字符串到结束
- 用法:
string Str="hello"; Str.Substring(3); 返回lo
- 两个参数表示从参数1开始截取,截取参数2长度的内容
- 用法:
string Str="hellojava"; Str.Substring(1,6); 返回elloja
分割字符串为字符串数组:Split()
- 用法:
string[] 数组名= 字符串.Split('分割符')
- 分割后用数组接收,分割符会消失,且左右两边的字符串会分成两份
拼接字符串数组为字符串:string.Join(“拼接符”,数组名)
- 数组的数据之间,用拼接符进行拼接
字符串转换大小写
- 小写:
字符串.ToLower()
大写:字符串.ToUpper()
去掉字符串的空格:Trim()
- 去掉前后空格:
字符串.Trim()
- 去掉前面的空格:
字符串.TrimStart();
- 去掉后面的空格:
字符串.TrimEnd();
判断是否以指定子字符串开始:StartsWith()
- 用法:
string Str="hello"; Str.StartsWith("he"); 返回true
判断是否以指定子字符串结束:EndsWith()
- 用法:
string Str="hello"; Str.EndsWith("o"); 返回true
判断是否包含指定的子字符串:Contains()
- 用法:
string Str="hello"; Str.Contains("ell"); 返回true
将指定的子字符串替换成你想要的字符串:Replace()
- 用法:
string Str ="hello!"; Str.Replace("!","?"); 返回hello?
判断字符串是否为空:string.IsNullOrEmpty()
- 用法:
string Str="hello"; string.IsNullOrEmpty(Str); 返回true
槽占位拼接字符串:string.Format()
- 用法:
string Str = string.Format("10+10={0}","20")
- 占位长度:{槽位 , n}、占n的长度,正数右对齐,负数左对齐
- 货币格式:{槽位 : Cn}、输出货币格式,保留n的小数位数
- 保留小数位数:{槽位 : Fn}、保留n的小数位数
- 数字三位分级法:{槽位 : N}、整数从右到左每三个数加一个逗号
- 百分比计数法:{槽位 : Pn}、以百分比计数,保留n的小数位数
- 十六进制格式:{槽位 : X000}、输出十六进制格式
字符串的连接:string.Concat(字符串1,字符串2)
valueOf()
数据类型.valueOf( 整数或字符串, 指定使用的进制数 );返回对应类型
- 整数:Integer 小数:Float、Double 字符串:string
获取每个字符的ASCII值:System.Text.Encoding.Default.GetBytes(str)
- 将返回数组Byte[],汉字占两位,其他占一位
- ASCII码:汉字的第一位ASCII码*256+第二位ASCII码,对应数字
- 45217~45252:A 45253~45760:B 45761~46317:C
- 46318~46825:D 46826~47009:E 47010~47296:F
- 47297~47631:G 47632~48118:H 48119~49061:J
- 49062~49323:K 49324~49895:L 49896~50370:M
- 50371~50613:N 50614~50621:O 50622~50905:P
- 50906~51386:Q 51387~51445:R 51446~52217:S
- 52218~52697:T 52698~52979:W 52980~53640:X
- 53689~54480:Y 54481~55289:Z
//3.字符串的StringBuilder类型:定义可变字符串
声明赋值的格式
StringBuilder sb=new StringBuilder("字符串");
追加字符串:append()、字符串会添加在后面
- 用法:
sb.append("字符串",索引,字符数);
- 从字符串 的 索引 位开始,往后的 字符数 添加在后面
将行终止符 ‘;’ 追加到当前对象的末尾:AppendLine()
- 用法:
sb.AppendLine("字符串");
- 行终止符:\r\n
槽占位追加字符串:AppendFormat()
- 用法:
sb.AppendFormat("字符串");
指定位置插入内容:insert()
- 用法:
sb.insert(插入的索引值,插入的内容);
移除指定字符串:remove()
- 用法:
sb.remove(开始的索引值,移除的长度);
- 移除的长度从0开始
替换指定字符串:replace()
- 用法:
sb.replace("要替换的字符串","替换后的字符串");
清空字符串:clear()
- 用法:
sb.clear()
获取或设置当前字符串长度:length
- 用法:
sb.length = 0;
获取或设置可存放的最大字符个数:Capactiy
- 用法:
sb.Capactiy = 20;
//1.ADO.NET结构
结构
- Connection:连接数据库
- Command:对数据库执行命令
- DataReader:从数据源读取数据
- DataAdapter:数据集合数据库的联系
- DataSet:存放独立于数据源的数据
数据源,命名空间 数据提供程序:.NET Framework
- SQL Server:
System.Data.SqlClient
- OLE DB:
System.Data.OleDb
- ODBC:
System.Data.Odbc
- Oracle:
System.Data.OracleClient
命名空间对应的Connection对象
System.Data.SqlClient
:SqlConnectionSystem.Data.OleDb
:OleDbConnectionSystem.Data.Odbc
:OdbcConnectionSystem.Data.OracleClient
:OracleConnection
//2.连接SQL数据库:Connection
SQL连接字符串
-
Sql Server身份验证:
string 变量名 = "Data Source=服务器名; Initial Catalog=数据库名; User ID=用户名; pwd=密码"
-
服务器名:"
.
",表示本机 -
integrated security=true
表示采用信任模式连接(window身份验证登录) -
Windows身份验证:
Data Source=.;Initial Catalog=SecondHandCarDB;Integrated Security=True
不需要用户名和密码
创建并使用Connection对象
SqlConnection 变量名 = new Sqlconnection(SQL连接字符串);
- 打开数据库连接:
Open()
- 关闭数据库连接:
Close()
//3.执行语句:Command
创建并使用Command对象
SqlCommand 变量名=new SqlCommand(执行语句, Connection对象);
方法
- 执行不返回行的语句,返回受影响的行数:
ExecuteNonQuery()
- 返回SqlDataReader对象:
ExecuteReader()
- 返回单个值,第一行的第一列:
ExecuteScalar()
验证用户的方法框架
- 验证信息,返回布尔型:
ValidateUser()
- 显示返回的结果:
CheckLogin()
//4.检索只读、只进的数据流,每次读取一行:DataReader
创建并使用DataReader对象
SqlDataReader SqlRead= SqlCom.ExecuteReader();
- 获取列名:
SqlRead["列名"]
StringBuilder sb = new StringBuilder();
while(sqlread.Read()){
sb.AppendFormat("[0]\t[1]",sqlread["id"],sqlread["content"]);
Console.WriteLine(sb);
sb.Length = 0;
}
属性
- 当前行中的列数:
FieldCound
- DataReader中列的值:
Item
- 指出是否包含一行或多行:
HasRows
方法
- 前进到下一行记录,返回true表示还有下一条数据:
Read()
- 关闭DataReader对象:
Close()
- 获取指定列的名称:
GetName()
- 获取指定序号处的列的值:
GetValue()
关闭关联的SqlConnection
- 将 CommandBehavior 设置为 CloseConnection
- 则关闭 SqlDataReader 会自动关闭 SqlConnection 连接
- 写法:
CommandBehavior.CloseConnection
//5.执行语句,查询的返回数据将存储在DataSet:DataAdapter
创建并使用DataAdapter对象
SqlDataAdapter SqlAda = new SqlDataAdapter(统计语句, Con对象);
- 方法2:
SqlAda.SelectCommand = Sqlcom;
DataAdapter操作命令
- 自动生成命令,对DataSet做的更改和数据库相协调:
new SqlCommandBuilder(DataAdapter对象);
- 选取记录:SelectCommand
- 插入记录:InsertCommand
- 更新数据:UpdateCommand
- 删除记录:DeleteCommand
- 使用方法:
Sqlada.操作命令 = new SqlCommandBuilder(Sqlada).Get对应操作命令
向DataSet 中的表填充数据方法:Fill()
SqlAda.Fill(DataSet对象, DataSet里数据表的名称)
将DataSet 中的数据提交到数据库:Update()
SqlAda.Update(DataSet对象, DataSet里数据表的名称)
//6.创建在内存中的集合对象,相当于临时的数据库:DataSet
作用
- 可包含任意数量的数据表及约束、索引和关系
- 它将数据复制在本地内存,供用户读取数据,降低数据库服务器压力
创建并使用DataSet对象
DataSet ds = new DataSet(数据集的名称字符串(默认NewDataSet));
属性
- 存放表的集合:
Tables
- 获取数量:
Count
方法
- 添加一行到指定行的位置:
ds.Tables["表名"].Rows.InsertAt(row, 下标)
- 复制表的结构和数据:
Tables[].Copy()
基本结构
- 数据集:DataSet
- 数据表的集合:DataTableCollection
- 数据表:DataTable
- 数据列的集合:DataColumnCollection
- 数据列:DataColumn
- 数据行的集合:DataRowCollection
- 数据行:DataRow
DataGridView控件属性
- 所有列的集合:Columns
- 所有行的集合:Rows
- 数据源:DataSource
- 显示的表的名称:DataMember
- 获取或设置DataGridview中的显示行:RowCount
- 是否可编辑单元格:ReadOnly
- 获取选中行的索引:SelectedIndex
- 获取选中的行:SelectedRow
选择行:创建并使用DataRow对象
-
DataRow row = DataSet对象.Tables["表名"].Rows[下标];
-
行:
Rows[行的下标]
-
行里面的列:
DataRow对象[列的下标]
-
新列:
NewRow()
//1.枚举类:Gender
作用
- 调用枚举类的枚举,不会误修改
创建方法
- 普通类:
class 类名称
- 枚举类:
enum 枚举类的名称
class class1 {
}
enum class2 {
}
添加枚举
- 添加字符串内容:
枚举类{ 内容1, 内容2 }
enum class1 {
"a", "b"
}
- 多种属性类型:
字符串1=整数1,字符串2=整数2
- 类型转换时,’
=
’ 左右的属性会互转 - 整数属性默认为下标,从0开始
- 如果修改了整数,之后的整数属性会根据下标排,但之前的整数不会变化
调用枚举类的属性
Gender g = Gender.枚举属性
//2.结构类:struct
作用
- 结构类的结构传值是值传递
- 结构类中不允许有实例字段初始值设定项
创建方法
- 普通类:
class 类名称
- 结构类:
struct 结构类的名称
class class1 {
}
struct class2 {
}
添加结构
- 添加字段和方法和普通类一样
实例化结构类
- 可以不用new:
struct s
- 如果不new结构,需要把字段全部赋值
struct class1{
public string name;
public int age;
public void aaa() {
Console.WriteLine("aaa");
}
}
// 第一种:报错
class Program
{
static void Main(string[] args)
{
Class1 c;
c.aaa();
Console.ReadKey();
}
}
// 第二种:正常
class Program
{
static void Main(string[] args)
{
Class1 c;
c.name = "张三";
c.age = 18;
c.aaa();
Console.ReadKey();
}
}
// 第三种:正常
class Program
{
static void Main(string[] args)
{
Class1 c = new c();
c.aaa();
Console.ReadKey();
}
}
//1.XML
作用
- XML是一个可扩展标记语言,用来存储节点内容,尾部为 .xml
- 文字是文本节点,注释是注释节点
- 导包:
using System.Xml
文档对象
- 生成文档对象:
XmlDocument doc = new XmlDocument()
- 加载xml:
Load(xml路径)
- 获取xml的根节点,返回XmlNode类型:
DocumentElement
XmlNode
- 获取名称:
Name
- 获取该节点和所有子节点的文本节点,不同层级会分行:
InnerText
- 获取当前节点的子节点,返回XmlNodeList类型:
ChildNodes
- 获取XmlNodeList的节点数量:
XmlNodeList.Count
//2.文件
作用
- 可以打开一个文件对象,进行读写,和获取目录和文件的信息
- 导入:
using System.IO
File方法和属性
- 判断文件是否存在:
Exists
- 获取文件后缀:
Extension
- 复制文件:
Copy(旧路径,新路径)
文件信息:FileInfo
-
文件信息对象:
FileInfo fi = new FileInfo(文件路径)
-
获取文件名:
Name
-
获取文件后缀:
Extension
-
获取文件的绝对路径:
FullName
-
获取文件的字节数:
Length
-
判断文件是否存在:
Exists
-
复制文件:
CopyTo(新路径)
-
剪切文件:
MoveTo(新路径)
-
删除文件:
Delete()
目录信息:DirectoryInfo
-
目录信息对象:
DirectoryInfo di = new DirectoryInfo(根目录)
-
获取目录名:
Name
-
获取当前目录的子目录对象数组:
GetDirectories()
-
获取目录下所有文件对象,返回FileInfo[]:
GetFiles()
文件流
- 文件流对象:
FileStream fs = new FileStream(文件路径,读写方式)
- 关闭文件流:
Close()
读写方式:FileMode
- Append:打开一个文件用于尾部写入,不存在则创建新文件
- Open:打开一个文件用于只读,不存在则报错
- OpenOrCreate:打开一个文件用于读写,不存在则创建新文件
- Create:打开一个文件用于写入,文件存在则覆盖、不存在则创建新文件
- CreateNew:创建一个文件用于写入,文件存在则报错
操作文件流
-
写入器对象:
StreamWriter sw = new StreamWriter(文件流对象)
-
写入文件:
写入器.Write("写入内容")
-
关闭写入器:
Close()
-
读取器对象:
StreamReader sw = new StreamReader(文件流对象)
-
从文件的当前位置读取所有字符,返回string:
读取器.ReadToEnd()
-
关闭读取器:
Close()
等下还会出C#窗体笔记、C#面向对象笔记