一、窗体
创建一个"Windows窗体应用程序"
将主窗体的名称改为规则名称
Frm开头,后缀见名知意,遵从大驼峰命名法.
窗体应用程序是一个闭源软件,所以源代码不会公开,当一个软件在开发完之后,将本项目下/bin/debug目录下的可执行应用程序拷贝或剪切,提供给使用者即可.
如没有可执行应用程序,需要在vs中重新生成后即可.
1、【属性】
Size:调整窗体宽高
Text:设置窗体标题名称
Icon:改变窗体默认图标
StartPosition:初始打开软件窗体默认在屏幕中的位置,常用值:CenterScreen居中显示
WindowState:初始打开软件窗体默认打开的方式,常用值:Maximized最大化显示
MaximizeBox:在标题栏中启/禁用最大化按钮.True默认启用,False禁用
MinimizeBox:在标题栏中启/禁用最小化按钮.True默认启用,False禁用
BackColor:设置窗体背景颜色,背景颜色均是微软自带
BackgroundImage:设置窗体背景图片,推荐使用"项目资源文件"点击导入图片的方式.
BackgroundImageLayout:设置图片的平铺方式,
常用值:
Stretch将图片拉伸至窗体大小铺满.
Zoom将图片等比例缩放至窗体大小.
ShowIcon:是否显示标题栏图标和任务栏图标,True默认显示,False不显示.
ShowInTaskbar:是否在任务栏中显示当前程序.True默认显示,False不显示.
TopMost:设置窗体置顶(永远在屏幕最前端显示),False默认不置顶,True置顶.
FormBorderStyle:设置窗体的边框样式,常用值:
Sizable默认值,有Windows自带边框
None,无边框
FixedSingle,无法调整窗口大小
opacity:调整整个窗口的透明度
isMdiContainer:让当前窗体变成父mdi窗体,改为True后即可.
如何让两个窗体成为mdi父子
1>改变主窗体的isMdiContainer的属性值为True
2>在相应的点击事件中创建子窗体对象的同时,加上以下代码:
FrmAddSingerType fast = new FrmAddSingerType();
fast.MdiParent = this;
fast.Show();
创建一个窗体,将窗口的宽高调整为700,500
标题文字设置为KTV后台管理系统
图标自行设置
默认打开窗体的位置在屏幕正中央
不允许最大化和最小化
自行设置一张合格的背景图
背景图片要占满整个窗体
窗体要永远保持在最前端
窗口不允许被手动调整大小
透明度调整为90%
2.【控件】
Label
Name:为当前控件命名正确的名称,规则以lbl开头,其余均一致.
在窗体中显示文字
属性:
Text:可以编辑要显示的文字.
Font:可以调整字体样式以及风格.
BackColor:可以设置控件的背景颜色.
ForeColor:可以设置控件的字体颜色.
TextBox
在窗体中输入文本或密文
属性:
Name:为当前控件命名正确的名称,规则以txt开头,后缀见名知意,并且要遵从小驼峰命名法.
Text:可以设置默认文本.
Font:与Label中的Font相同,同时可以改变当前控件的高度.
UseSystemPasswordChar:可以设置文本为密文显示,默认False,True以密文显示.
PasswordChar:可以手动指定密文显示符号,但UseSystemPasswordChar的属性值为False时才生效.
ReadOnly:可以设置控件为只读.
Multiline:可以更改为多行文本,默认False,为True时则改为多行输入文本.
MaxLength:可以设置控件输入文本的最大长度.
TabIndex:在同一窗体,获取焦点的顺序.
Button
在窗体设置按钮
属性:
Name:为当前控件命名正确的名称,规则以btn开头,其余均一致.
Text:设置按钮文本内容.
Size:调整按钮宽高.
TabIndex:与之前一致.
TextAlign:设置按钮中内容的水平与垂直对齐方式.
Font:与之前一致.
ForeColor:与之前一致.
BackColor:与之前一致.
BackgroundImage:与之前一致.
BackgroundImageLayout:与之前一致.
Enable:设置当前按钮是否为启/禁用状态,True默认值,False禁用.
FlatStyle:切换按钮2D/3D的样式.默认值Standard[3D],常用值Flat[2D模式]
FlatAppearance:设置2D模式下按钮的相关样式.
BorderColor:设置边框颜色.
BorderSize:设置边框粗细.
MouseDownBackColor:鼠标按下时设置背景颜色.
MouseOverBackColor:鼠标移入时设置背景颜色.
RadioButton
在窗体设置单选按钮
属性:
Name:为当前控件命名正确的名称,规则以rbtn开头,其余均一致.
Text:设置单选按钮文本内容.
GroupBox
设置编组,可以用于不同组的单选按钮的分组.
属性:
Name:为当前控件命名正确的名称,规则以gb开头,其余均一致.
Text:设置单选按钮文本内容.
CheckBox
在窗体设置复选按钮
属性:
Name:为当前控件命名正确的名称,规则以ckb开头,其余均一致.
Text:设置复选按钮文本内容.
ComboBox
在窗体设置下拉菜单
属性:
Name:为当前控件命名正确的名称,规则以cbo开头,其余均一致.
DropDownStyle:设置下拉菜单其中一个属性是不可编辑的[DropDownList].
Items:设置下拉菜单选项内容.
DateTimePicker
在窗体设置日期+时间选择文本框
属性:
Name:为当前控件命名正确的名称,规则以dp开头,其余均一致.
Value:设置默认日期文本.
MinDate:设置日期的最小日期.
MaxDate:设置日期的最大日期.
PictureBox
在窗体显示图片
属性:
Name:为当前控件命名正确的名称,规则以pic开头,其余均一致.
BackColor:与之前一致.
BackgroundImage:与之前一致.
BackgroundImageLayout:与之前一致.
Image:设置图片,使用项目资源文件的方式导入图片.
SizeMode:设置图片的显示模式,StretchImage图片随控件大小平铺.Zoom按照等比例缩放随控件大小平铺.AutoSize控件随图片大小而定.
MenuStrip
在窗体设置顶部菜单
ToolsStripMenuItem
在顶部菜单中设置菜单项
属性:
Name:为当前控件命名正确的名称,规则以tsmi开头,其余均一致.
ToolsStrip
在顶部菜单下面设置工具栏
属性:
Name:为当前控件命名正确的名称,规则以tsbtn开头,其余均一致.
Image:设置图片,使用项目资源文件的方式导入图片.
ImageScaling:改变工具栏的图标尺寸.
SizeToFit:以工具栏默认大小来划分尺寸.
None:以图片本身的大小来划分尺寸.
DisplayStyle:设置工具栏的显示方式
Image:只显示图标.
ImageAndText:既显示图标又显示文字.
Panel
属性:
Name:为当前控件命名正确的名称,规则以pnl开头,其余均一致.
FlowLayoutPanel
属性:
Name:为当前控件命名正确的名称,规则以flpnl开头,其余均一致.
Panel和FlowLayoutPanel共同拥有的属性:
BorderStyle:设置是否有边框
None:默认值,即没有边框.
FixedSinger:2D边框.
Fixed3D:3D边框,有凹陷的感觉.
AutoScroll:是否允许设置横/竖滚动条
False:默认值,没有滚动条.
True:当内容超出了Panel的范围之外,则自动出现滚动条.
ContextMenuStrip
在窗体设置右键菜单
Timer
在窗体中设置定时器
属性:
Name:为当前控件命名正确的名称,规则以timer开头,其余均一致.
Enabled:决定是否启动定时器,True启动,False停止
Interval:指定时间后重复执行事件,单位毫秒,它与定时器事件绑定,在指定毫秒数后会一直重复执行.
独有事件:
Tick:任何在Tick事件中设置的代码都会在定时器触发后重复执行.
DataGridView(缩写dgv)
数据网格控件
属性
SelectionMode 选择模式
FullRowSelect 整行选取
// dgv控件.SelectedRows.Count == 0 必须在整行选择时,才能获取到选择的行
可以获取多行
// dgv控件.CurrentRow == null 获取的是DataGridViewRow对象,不管选择哪一列,都会把整行选择
但是只能选择一行
RowHeadersVisible
FALSE 不显示行标
TRUE 显示行标
GridColor网格颜色
ColumnHeadersBorderStyle列头边框
None去掉
EnableHeadersVisualStyles
False 关闭列头自动设置
ColumnHeadersDefaultCellStyle设置默认列标题样式
Alignment布局:MiddleCenter内容居中
BackColor:背景颜色
SelectionBackColor:选中的背景颜色
CellBorderStyle单元格边框
None去掉
ColumnHeadersHeightSizeMode是否允许调整列头字体大小
EnableResizing允许更改尺寸
ColumnHeadersHeight调整标题大小
用数字调整大小
RowTemplate行模板
DefaultCellStyle:调整单元格样式
Resizable:允许调整行大小
True,False
Height:用数字调整高度
绑定后台数据
1>创建实体类
创建一个类,类名为当前查询的表名名称,记住遵从大驼峰命名法
类中的属性从while中处理的字段进行封装,封装用prop(按两下Table),记住属性名开头大写
2>创建List集合,泛型约束第一步创建好的实体类
在while中创建实体类的对象,将while中所提取的变量分别对当前实体类对象中的每一个属性完成赋值.
最终把当前对象放入List集合中
3>将集合中的所有数据全部绑定至dgv中
范例:
dgv控件名称.DataSource = new BindingList<集合的泛型约束类型>(集合对象名称);
举例说明:
dgvShowSingerTypes.DataSource = new BindingList<SingerType>(singerTypes);
4>将实体类的每个属性名复制到记事本中
回到前台找到dgv中右上角的小三角,点开后找到编辑列.在编辑列中找到选定的列,将每个属性名均粘贴到对应的列属性中DataPropertyName中
切记千万不要有任何的空格或其他符号.
ContextMenuStrip(缩写cms)
右键快捷菜单
属性
FullRowSelect,是否选择整行
TRUE,FALSE
做删除业务,需要先获取被选中的项,有了项就可以删除所有子项
控件.SelectedItems[0] 这里要告诉学生,一旦见到Selected就一定是被选中的,比如Checked等等...
弹窗
DialogResult dr = MessageBox.Show("主要提示语", "菜单栏提示语", MessageBoxButtons按钮设置, MessageBoxIcon图标设置);
dr.ToString():会根据用户选择的按钮接收不同的字符语句.可以继续做判断.
快捷键:mb 按键盘两下Table即可补全代码.
事件
定义:人机交互
F7 - 从设计页面切换到代码页面
Shift+F7 - 从代码页面切换到设计页面
Click:大部分的控件都拥有鼠标左键单击事件
Load:此事件只有窗体拥有.当此窗体被运行之后但被打开之前,此事件被触发.一般情况下此事件都应用于该窗体被打开前的一些准备工作.
MouseMove:鼠标移入控件时发生事件.
MouseLeave:鼠标移出控件时发生事件.
TextChanged:当控件中文本内容发生变化时,就会触发当前事件.
MouseDoubleClick:当鼠标左键双击控件时触发事件.
三、c#运行环境+开发环境 .NET(dot NET)
c#开发程序三步走:编写、编译、运行
1、使用Visual Studio创建项目
项目命名
项目名称:当前项目的名称
解决方案名称:总项目的名称,总项目下可以有n个子项目.
字下美人数骆驼
字下美人(名称允许以这4个方式开头)
字:字母
下:_
美:$
人:¥
数骆驼
遵从驼峰命名规则
小:每个单词的开头小写,其后每个单词首字母均大写
大:每个单词的开头均要大写.
类命名
见名知意
大驼峰命名法
注释
单行注释
// 说明
多行注释
/* 说明 */
文档注释(相当于多行注释)
/// 说明
Visual Studio常用快捷键
整理代码(格式化代码)
Ctrl + k + d
当每一行代码编写完毕后,用分号;结束整个一行语句的同时,会自动整理这一行的代码
输出语句的快捷键
cw 按两下Table键
启动程序的快捷键
Ctrl + F5
控制台输出语句
Console.WriteLine("") : 输出文本内容后自动换行
Console.Write("") : 输出文本内容后不自动换行
转义符(存在双引号中的符号)
\n : 换行
\t : 缩进一个制表符(相当于按table键)
\ : 可以转义任何特殊符号
c#自带数据类型
基本数据类型(四类八种)
第一类
字符类型
char
定义一个char类型并赋值
char eng = 'H'
char[] hw = {'H','e','l','l','o','W','o','r','l','d'}
string s = "HelloWorld"
第二类
布尔类型
bool
判断对错,true/false
第三类
整数类型
范围 在程序运行后所占内存空间
byte字节 -128 ~ 127 1byte
short短整数 -32768 ~ 32767 2byte
int整数(c#默认类型) -2147483648 ~ 2147483647 4byte
long长整数 -2305843009213693952 8byte
~ 2305843009213693951
第四类
浮点类型
float 4byte
double ±1.789 * 1000...000(308个0) 8byte
硬盘容量的单位(从小到大)
byte(8bit)
kb
mb
gb
tb
对象类型
String : 字符串[文本],双引号描述java中的字符串, ""
变量[可变的量]
定义变量接收我们想要计算的值.
变量需要命名
规则:
1>见名知意
2>遵从小驼峰命名法
运算符
赋值运算符
= : 将右侧的值赋予左侧的变量
算术运算符
+ - * / % ++ -- += -= *= /= %=
关系运算符
> < >= <= == !=
逻辑运算符(多个判断在一个条件中时,必须用逻辑运算符进行拼接.)
&& || !
如果多判断用&&拼接,则每个判断的结果均为true时,最终结果即为true.反之,只要有一个判断的结果为false,则最终结果为false
如果多判断用||拼接,则只要有一个判断的结果为true时,最终结果即为true.反之,所有判断的结果均为false时,则最终结果为false.
c#运算铁定法则
a>int和int的2个变量之间进行运算,那么其结果是int.
b>int和double的2个变量之间进行运算,那么其结果是double.
c>String类型的变量也可以与其他变量进行加法运算(只允许),而且其结果为String类型,简称丧尸效应.
定义变量
3步走
1>定义数据类型
int nianLing;
2>定义值
10;
3>将定义好的值赋给变量
nianLing = 10;
简写方式
int nianLing = 10;
使用变量
用变量名与其他数值进行计算.
强制类型转换(double转int才能出现)
举例说明:
--------------------自动类型转换----------------------
int j = 100;
double d = j;
Console.WriteLine(d);
-----------------------------------------------------
--------------------强制类型转换----------------------
double _d = 15.3;
// 强制类型转换(double转int才能出现)
int _j = (int) _d;
-----------------------------------------------------
string转其他类型
string转int
int r = Convert.ToInt("10");
string转double
double r = Convert.ToDouble("3.14");
输入
1>定义输出语句
Console.WriteLine("请输入...")
2>定义变量,用来接收用户输入的内容
string name = Console.ReadLine();
3>使用变量(爱怎么用怎么用)
随机数
选择结构
if-else(生死门:无论有多少种选择,必须要选择一条路,且仅能选择一条路)
if(条件)// 条件如结果为true时,则会进入if结构中执行里面的代码
{
}
多重if
if-else if-else if-...-else
switch
string choose = "1";
switch(choose)
{
case "1":
break;
case "2":
break;
default:
break;
}
循环
想要学好循环必须要掌握的三要素
1>定义初始值(循环开始)
2>定义条件(循环结束)
3>定义迭代(循环过程)
while
初始值;
while(条件)
{
迭代;
}
特点:先判断,后执行.
执行过程:
1>定义变量赋值初始值.
2>定义条件.根据条件的返回值来判断是否进入循环.
3>如返回值为true,则进入循环体中,执行里层的所有代码.
4>如返回值为false,则退出整个循环,不再执行.
int i = 1; // ①
while(i < 5)
{ // ②
i++; // ③
}
①②③ | ②③ | ②③ | ②③
do-while
初始值;
do
{
迭代;
}while(条件);
特点:先执行,后判断.
执行过程:
1>定义变量赋值初始值.
2>进入循环中,执行里层所有代码.
3>定义条件,以条件的返回值来判断是否再次循环执行.
4>条件返回值为true,继续执行里层代码,如条件返回值为false,则退出整个循环.
int i = 1; // ①
do
{
i++; // ③
} while (i < 6); // ②
①③② | ③② | ③② | ③② | ③② | ③②
for
for(初始值;条件;迭代)
{
}
执行过程:
1>定义好初始值、条件、迭代.
2>根据初始值判断条件,根据条件的返回值判断是否进入循环.
3>如返回值为false,则退出整个循环.
4>如返回值为true,则进入循环执行里层所有代码.
5>执行完毕后,继续迭代,然后继续判断条件.如此反复,直至循环结束.
// ① ② ③
for(int i = 0;i < 3;i++)
{
Console.WriteLine("这是第" + i + "次恋爱失败"); // ④
}
①②④③ | ②④③ | ②④③ | ②
break
break在循环中起到的作用是终止整个循环.
continue
continue在循环中起到的作用是终止当前循环.
数组
定义:可以同时保存多个数值,而不像变量,一个变量只能保存一个值.
// 创建数组的方式1:只创建不赋值
string[] names = new string[100];
// 0-9
names[0] = "邱远飞";
names[1] = "吕铭扬";
names[2] = "郭荣栋";
names[3] = "车尊雷";
names[4] = "赵磊";
// 创建数组的方式2:即创建又赋值,但无法手动定义数组的长度
int[] scores = { 18, 96, 23, 57, 84, 21 };
数据类型在定义数组时的默认值
String null
int 0
double 0.0
面向对象的基础(类和对象)
类
用类的方式去描述现实生活当中的某些事物.
我们自己定义的一个类,在Java也是一种数据类型,只不过这个类型是自定义类型
作用:就是为了创建一个又一个的对象
一个类中只能存在两种东西
属性和方法
属性
描述类的特征
组成部分:
权限(public[公开])
只要用public定义的类或属性或方法,那么说明这个东西对于项目来说是完全公开的.
类型
变量名
例:public String name;
方法
描述类的行为
将一系列的过程或步骤组合到一起就被称之为方法
组成部分:
权限
返回值
作用:给外界提供一个最终的结果.
具体实现:
1>将void改为你想返回的数据类型.
2>在方法体内定义return 定义返回的数据类型具体的值
return的作用
1>终止方法的继续执行.
2>可以为方法提供具体的返回值.
规定:
1>一个方法只要定义了返回值类型后,在方法体内至少要有一个return返回具体的值
2>一个方法只能定义一个返回值类型.
3>一个方法只能返回一个具体的值
方法名称
参数列表
方法体
例:
public void run()
{
}
方法中可以直接调用本类的属性
定义方法的好处:
可以将一系列的步骤组成一件事.
可以简便的实现后续功能的更新
代码的复用
对象
在虚拟程序中真实存在的东西,每一个对象都是独立的、唯一的.
String的常用方法
String对象类型
int - Length : 获取当前字符串的长度
例:
string s1 = "Hello World";
int len = s1.Length; // 结果 11
boolean - Equals() : 做两个字符串等值判断,并且不忽略大小写
例:
string s1 = "Hello World";
string s2 = "Hello WOrld";
boolean f = s1.Equals(s2);
Console.WriteLine(f); // 结果 false
string - ToLower() : 将字符串中所有英文全部转换成小写`
例:
string s1 = "Hello TCAS1357";
s1 = s1.ToLower();
Console.WriteLine(s1);// 结果 hello tcas1357
string - ToUpper() : 将字符串中所有英文全部转换成大写
例:
string s2 = "hello tcas1357";
s2 = s2.ToUpper();
Console.WriteLine(s2);// 结果 HELLO TCAS1357
int - IndexOf(string str) : 在整个字符串中从左至右寻找第一个指定的str字符是否存在,返回值为str字符的当前下标
例:
string s1 = "Hello Java";
int r = s1.IndexOf("a");
Console.WriteLine(r);// 结果 7
int - LastIndexOf(string str) : 在整个字符串中从右至左寻找第一个指定的str字符是否存在,返回值为str字符的当前下标
例:
string s1 = "Hello Java";
int r = s1.LastIndexOf("a");
Console.WriteLine(r);// 结果 9
string - SubString(int start) : 用于截取整个字符串,从指定的start下标开始向右截取至结尾,最终返回的类型就是截取的结果.
例:
string s = "我正在学习Java,我爱Java,胜过爱我女朋友";
s = s.Substring(10);
Console.WriteLine(s);// 结果: 我爱Java,胜过爱我女朋友
string - SubString(int start, int len) : 用于截取整个字符串,从指定的start下标开始向右截取至指定len长度结束,最终返回的类型就是截取的结果.需要注意的是在截取中start下标是被包含在截取内的,而len代表的意思则是向后截取的长度.
例:
string s = "我正在学习Java,我爱Java,胜过爱我女朋友";
s = s.Substring(10, 16);
Console.WriteLine(s);// 结果: 我爱Java
string - Replace(string oldStr, string newStr) : 用于替换整个字符串,将指定的oldStr替换为newStr.
例:
string weiChar = "我爱女朋友";
weiChar = weiChar.Replace("女朋友", "Java");
Console.WriteLine(weiChar);// 结果:我爱Java
string[] - Split() : 用于将整个字符串以指定的qieGe变量进行切割字符串,切割后将会有多个字符串,用时string数组接收.
例:
string s7 = "是$国#人!我%中&一_名+";
char[] qieGe = { '$', '#', '!', '%', '&', '_', '+' };
string[] jieGuo = s7.Split(qieGe);
for (int i = 0; i < jieGuo.Length; i++)
{
Console.Write(jieGuo[i]);
}
Console.WriteLine("\n");
Console.WriteLine(
jieGuo[3] + jieGuo[0] + jieGuo[5] + jieGuo[6] + jieGuo[4] + jieGuo[1] + jieGuo[2]
);
// 结果: 我是一名中国人
StringBuilder
作用:为了节省内存空间,凡是定义的String的变量只要后续需要不断拼接新的字符串来更新文本,那么优先推荐使用StringBuilder
方法:
Append(String s):追加新的字符串
好处:
内存中始终只有一个字符串对象,而不会像String类型重复创建内存地址来存储新的字符串对象,节省内存空间,减少服务器内存压力.
数据库
用来存储网络中大量用户数据的一种方式.
流行关系型数据库:
Oracle
SqlServer
MySQL
SqlServer数据库是S1阶段重点学习的数据库
此数据库软件是微软的一款产品,与系统有着非常良好的兼容性,并且易操作.
数据库的基本概念
数据仓库:
SqlServer数据库我们可以把它比喻成一片空地,而这片空地是用来存储粮食的.我们不能把粮食直接倒在平地上,这样很快就发霉腐败.那么就需要在这片空地上盖起一座又一座的仓库,我们称之为数据仓库.
数据表:
数据仓库盖起来之后,我们可能需要存储很多不同类型的数据,那么就需要建立表来存一种类型的数据.
数据字段:
一张表可以存储一种类型的数据,例如学生的基本信息、员工的基本信息、商品的基本信息等等.而每一种类型的信息都会细化出很多信息,例如学生的信息有姓名、出生日期、家庭住址等,那么这时候一张表中就需要用字段的方式来存储同一列下的信息.
数据字段类型:
为了保证同一列下的数据都是相对准确和完整的,就需要进行类型约束,例如学生姓名要求是字符串类型的,学生年龄要求是整数类型的,学生身高要求是浮点数类型的,学生入学日期是日期类型的等等.那么在创建表的同时就要对其数据字段进行标识类型.具体常用类型如下:
varchar 字符串,定义时需要用小括号的方式指定字符长度,一旦指定后再添加数据就不允许超出长度.
int 整数
float 浮点数
date 日期(包括日期和时间),默认日期2021/6/4 15:34:05
创建数据库
首先保证SqlServer数据库的服务[Sql Server(MSSQLSERVER)]是必须要开启.
如何开启服务-1(win10推荐使用)
如何找到?可以Win+r打开运行,输入services.msc,打开服务窗口,在服务窗口找到服务,右键启动.
如何自启动?找到服务后,右键属性,在属性栏中将启动类型改为自动.
如何开启服务-2(win7推荐使用)
Win+r打开运行,输入net start mssqlserver回车后即可开启服务,再次打开运行输入net stop mssqlserver即可关闭服务
创建数据表
先想好需要添加字段名称以及字段类型,之后手动进行编写字段名称和类型完成添加.
当字段全部添加好后,按Ctrl+s保存后,在弹出的框中填写当前表名,点击确定即可.
表的约束
在创建表的同时,约束字段中的数据.
唯一约束
如何某个字段添加了唯一约束,那么这个字段在添加数据时就要检查这条数据是否与已存在的数据重复.如果重复,则禁止添加.
非空约束
如果某个字段添加了非空约束,那么这个字段在执行添加的SQL语句的时候,就要检查当前这个字段是否有数据,如果未添加数据,则整条SQL语句禁止执行.
主键约束
特征:
1>它是唯一约束和非空约束的集合体.
2>被添加了此项约束的字段一般情况下就会在整张表的第一个字段的位置出现.
3>并且字段名称肯定会有id存在,命名规则一般情况下是以表名的开头字母为前缀,以id为后缀,中间或以下个线分隔或无.
例:
表名:Student
主键ID字段名称:sid或s_id
表名:Employee
主键ID字段名称:eid或e_id
表名:XXX
主键ID字段名称:id
4>一张表一般情况下只会有一个字段拥有主键约束.
5>主键ID的数据类型必须是int类型
6>主键ID的值不用手动添加,而是在每次编写SQL添加语句时,它的数据自动增长.
作用:
1>当前字段下的每一行数据都是用来标识当前整行在整张表中是唯一的.
2>A表的主键用来标识B表的其中一个字段,而这个字段就是用来标识当前行数据在A表中所处的类型.这种现象就被称之为外键.
SQL语言(句)
常规讲,即实现对数据表的数据进行增删改查(CRUD)等操作
学习前需准备以下表结构和表数据
KTV数据库
[[[SingerType歌星类型表]]]
[[[字段名称]]] [[[说明]]] [[[类型]]] [[[约束]]]
Stid 主键ID int 主键,自增
SingerTypeName 类型名称 varchar(50) 非空,唯一(出现相同类型名称无意义)
模拟数据:
1 大陆
2 港台
3 欧美
4 日韩
5 新加坡
[[[Singer歌星表]]]
[[[字段名称]]] [[[说明]]] [[[类型]]] [[[约束]]]
Sid 主键ID int 主键,自增
SingerName 歌星姓名 varchar(50) 非空
Stid 歌星类型ID int 非空
Sex 歌星性别(男、女、组合) varchar(50) 非空
Photo 歌星头像图片 varchar(200) 非空、唯一
注:因所有歌星图片都放在一个服务器文件夹进行管理,所以文件名必须保证不能重复
Spell 歌星首字母拼音 varchar(50) 非空
模拟数据:
1 周杰伦 2 男 zhoujielun.jpg ZJL
2 孙燕姿 5 女 sunyanzi.jpg SYZ
3 许嵩 1 男 xusong.jpg XS
4 滨崎步 4 女 binqibu.jpg BQB
5 席琳迪翁 3 女 xilindiweng.jpg XLDW
[[[SongType歌曲类型表]]]
[[[字段名称]]] [[[说明]]] [[[类型]]] [[[约束]]]
Sotid 主键ID int 主键,自增
SongTypeName 类型名称 varchar(50) 非空,唯一(出现相同类型名称无意义)
模拟数据:
1 流行
2 爵士
3 古典
4 摇滚
5 戏曲
[[[Song歌曲表]]]
[[[字段名称]]] [[[说明]]] [[[类型]]] [[[约束]]]
Soid 主键ID int 主键,自增
SongName 歌曲名称 varchar(100) 非空
Spell 歌曲首字母拼音 varchar(100) 非空
WordCount 歌曲字数 varchar(100) 非空
Sotid 歌曲类型ID int 非空
Sid 歌曲所属歌星ID int 非空
Url 歌曲MTV名称 varchar(100) 非空、唯一
注:因所有歌星MTV视频文件都放在一个服务器文件夹进行管理,所以文件名必须保证不能重复
Clicks 歌曲被点歌次数 int 非空
模拟数据
1 七里香 QLX 3 1 1 七里香.mp4 56
2 爱情证书 AQZS 4 1 2 爱情证书.mp4 31
3 庐州月 LZY 3 3 3 庐州月.mp4 109
4 The Show Must Go On TSMGO 19 4 4 TheShowMustGoOn.mp4 11
5 My Heart Will Go On MHWGO 19 3 5 MyHeartWillGoOn.mp4 99
[[[Administrator-KTV管理员]]]
[[[字段名称]]] [[[说明]]] [[[类型]]] [[[约束]]]
Id 主键ID int 主键,自增
UserCode 管理员账号 varchar(50) 非空,唯一
Password 管理员密码 varchar(50) 非空,唯一
模拟数据:
1 zuishuaizhaolaoshi zszls8888
2 zhangbosen zbs6666
3 wumengda wmd7890
添加数据
添加单条数据
INSERT INTO 数据表名称
(字段名称1, 字段名称2, 字段名称3, ...)
VALUES
(字段1的实际值, 字段2的实际值, 字段3的实际值, ...);
同时添加多条数据
INSERT INTO 数据表名称
(字段名称1, 字段名称2, 字段名称3, ...)
VALUES
(字段1的实际值, 字段2的实际值, 字段3的实际值, ...),
(字段1的实际值, 字段2的实际值, 字段3的实际值, ...),
(字段1的实际值, 字段2的实际值, 字段3的实际值, ...),
...;
添加数据时对于日期字段想要获取当前日期和时间的处理
INSERT INTO 数据表名称
(日期字段)
VALUES
(GETDATE());
对于某张表添加数据需要用到另外一张表的外键ID时的处理(需讲完单条件查询后方可学习)
例:
insert into employee
(name,gongzi,jiangjin,ruzhishijian,did,pid)
values
(
'张世龙',
26000,
500,
GETDATE(),
(select id from depa where name = '开发部'),
(select id from post where name = '普通员工')
)
修改数据
修改某个字段的全部数据
UPDATE 数据表名称 SET
修改字段名称1 = 字段1的实际修改值,
修改字段名称2 = 字段2的实际修改值,
...
修改某个字段的单行数据
UPDATE 数据表名称 SET
修改字段名称1 = 字段1的实际修改值,
修改字段名称2 = 字段2的实际修改值,
...
WHERE
根据字段名称 = 具体的值 当做条件进行查找对应的整行数据
删除数据
删除全部字段的全部数据
DELETE FROM 数据表名称;
删除全部字段的单条或部分数据
DELETE FROM 数据表名称
WHERE 根据字段名称 = 具体的值 当做条件进行查找对应的整行数据;
查询(重中之重)
全表全字段查询
SELECT * FROM 表名
全表分字段查询
例:select SingerName,Sex from Singer;
单条件全(分)字段查询
例:select SingerName,Sex,Photo from Singer where SingerName = '刘德华'
多条件全(分)字段查询(逻辑运算符 AND OR)
例:select SingerName,Sex,Photo from Singer where SingerName = '刘德华' and sex = '男';
例:select SingerName,Sex,Photo from Singer where SingerName = '刘德华' or sex = '男';
函数查询
AVG:求平均值
例:select avg(gongzi) from employee
MIN:求最小值
例:select min(gongzi) from employee
MAX:求最大值
例:select max(gongzi) from employee
SUM:求和
例:select sum(gongzi) from employee
COUNT:统计
例:select count(1) from employee;
双表查询(INNER JOIN)
-- 查询所有歌星信息(歌星ID,歌星姓名,歌星所属类型名称,歌星性别)
select
[Sid],
SingerName,
Sex,
SingerTypeName,
s.Stid as 歌星表中的类型ID,
st.Stid as 类型表中的类型ID
from singer as s
inner join SingerType as st
on st.Stid = s.Stid
多表查询
找主表规则:凡是参与查询的所有表中的某张表的主键没有成为任何参与查询的表的外键,它就是主表(即老大)
-- 查询歌曲信息(歌曲ID,歌曲名称,歌曲所属歌星姓名,歌曲类型名称,歌曲被点次数)3表查询
select
s.Soid,
s.SongName,
si.SingerName,
st.SongTypeName,
s.Clicks
from Song s
inner join SongType st
on st.Sotid = s.Sotid
inner join Singer si
on si.Sid = s.Sid
-- 查询歌曲信息(歌曲ID,歌曲名称,歌曲所属类型名称,歌曲所属歌星姓名,歌曲所属歌星所属歌星类型)4表查询
select
s.Soid,
s.SongName,
st.SongTypeName,
si.SingerName,
sit.SingerTypeName
from Song s
inner join SongType st
on st.Sotid = s.Sotid
inner join Singer si
on si.Sid = s.Sid
inner join SingerType sit
on sit.Stid = si.Stid
多表多条件查询
-- 查询歌手类型为大陆的流行歌曲信息(歌曲名称,歌曲所属类型名称,歌曲所属歌星姓名,歌曲所属歌星所属歌星类型)
select
s.Soid,
s.SongName,
st.SongTypeName,
si.SingerName,
sit.SingerTypeName
from Song s
inner join SongType st
on st.Sotid = s.Sotid
inner join Singer si
on si.Sid = s.Sid
inner join SingerType sit
on sit.Stid = si.Stid
where
sit.SingerTypeName = '大陆'
and
st.SongTypeName = '流行'
-- 查询歌手类型为大陆的刀郎歌星带有"情"字的流行歌曲信息
--(歌曲名称,歌曲所属类型名称,歌曲所属歌星姓名,歌曲所属歌星所属歌星类型)
select
s.Soid 歌曲ID,
s.SongName 歌曲名称,
st.SongTypeName,
si.SingerName,
sit.SingerTypeName
from Song s
inner join SongType st on st.Sotid = s.Sotid
inner join Singer si on si.Sid = s.Sid
inner join SingerType sit on sit.Stid = si.Stid
where
st.SongTypeName = '流行'
and
sit.SingerTypeName = '大陆'
and
si.SingerName = '刀郎'
and
s.SongName like '%情%'
模糊查询
LIKE替代=
%:忽略
_:一个字符
-- 搜索二个字的歌星信息
select * from Singer
where SingerName like '__'
-- 搜索三个字的歌星信息
select * from Singer
where SingerName like '___'
-- 搜索姓郑的歌星信息
select * from Singer
where SingerName like '郑%'
-- 搜索带情字的歌曲信息
select * from Song
where SongName like '%情%'
ADO.NET
来自于c#,利用c#的ADO技术实现与数据库对接,实现CRUD.
如何实现c#连接数据库(SQLSERVER)
1.定义连接数据库所需要准备的连接字符串
string conStr = "Data Source=.;Initial Catalog=KTV;Integrated Security=False;User ID=sa;Password=accp;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False";
2.定义需求(即定义SQL语句)
例:
StringBuilder sql = new StringBuilder();
sql.Append(" insert into Singer ");
sql.Append(" (SingerName,Stid,Sex,Photo,Spell) ");
sql.Append(" values ");
sql.Append(" ('TBOY',1,'组合','tboy.jpg','TB'); ");
3.定义连接对象
SqlConnection con = new SqlConnection(conStr);
4.打开连接通道
con.Open();
5.创建执行对象,将准备好的SQL传输至数据库
SqlCommand cmd = new SqlCommand(sql.ToString(), con);
6.执行并返回结果.
2种返回方式
增删改
int r = cmd.ExecuteNonQuery();
查
SqlDataReader sdr = cmd.ExecuteReader();
7.处理结果集数据
最后一步.关闭资源
con.close();
sdr.close();