精华内容
下载资源
问答
  • 2021-02-01 02:46:07

    sql设置外键(设置外键的sql语句)

    2020-07-24 11:44:03

    共8个回答

    sql怎么设置外键

    创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关系图只有主键没有外键时不行的。

    建外键的前提是此外键必须是另外一个表的主键。建外键的步骤:

    第一步、打开要建外键表的设计器,右击选择“关系”。

    第二步、然后弹出“外键关系”窗体,我们选择“添加”,然后点击“表和列规范”后面的小按钮。

    第三步、弹出另外一个窗体让我们选择主键表和列,记住要选择相同的,选好之后点击确定。

    第四步、展开INSERT和UPDATE规范,在更新规则和删除规则有四个选项,分别是“不执行任何操作”、“级联”、“设置为NULL”、“设置默认值”。

    默认的不执行任何操作。如果是“不执行任何操作”,当我们删除或更新主键表的数据时,会告诉用户不能执行删除或更新该操作。

    “级联”的意思是当我们删除或更新主键表的数据时,会删除或更新外键表中所涉及的相关数据的所有行。

    “设置Null”的意思是当我们删除或更新主键表的数据时,外键表中的外键列的值会设为Null,但前提是该列允许为空。

    “设置默认值”的意思是如果我们将外键列定义了默认值,当我们删除或更新主键表的数据时,外键表中的外键列的值设为定义的默认值。

    当然也可以用代码创建,在创建数据库表T——Card时只要加上一句代码就可以了。“Foreign key (studentNo) references T_Student(studentNo)"。如果已经创建了改表,那如何用代码实现了,这也很简单也就一句代码“ add constraint CMPKey(外键名)

    更多相关内容
  • 我们首先创建名字为t7的数据库,并创建使用到的数据表和触发器。 创建两张数据表t1和t2,t1是业务数据表,t2是通过触发器实现的日志数据表。 CREATE TABLE t7:t1 ( name VARCHAR(100), id VARCHAR(100), age VARCHAR...

    前置阅读文章
    《EFCore使用ADO.NET连接GBase8s数据库示例》
    《C#连接GBase8s数据库在windows环境下使用步骤》
    创建解决方案Demo工程,并引入相应的EFCore包
    在这里插入图片描述

    我们首先创建名字为t7的数据库,并创建使用到的数据表和触发器。
    创建两张数据表t1和t2,t1是业务数据表,t2是通过触发器实现的日志数据表。
    CREATE TABLE t7:t1 (
    name VARCHAR(100),
    id VARCHAR(100),
    age VARCHAR(100)
    )
    in rootdbs ;

    CREATE TABLE t7:t2 (
    id VARCHAR(100),
    todo VARCHAR(100)
    )
    in rootdbs ;

    在这里插入图片描述

    创建了3个触发器,分别是查询操作触发器,插入操作触发器,修改操作触发器
    在这里插入图片描述

    触发器的示例代码如下:
    查询操作触发器
    当t1表被查询的时候,插入一条记录到t2日志表,
    create trigger select_t1
    select on t1
    referencing old as old
    for each row
    (
    insert into t2(id,todo)
    values (old.id,‘select’)
    );
    插入操作触发器
    当t1表中插入数据的时候,新生成记录的ID值,插入到t2日志表,
    create trigger insert_t1
    insert on t1
    referencing new as new
    for each row
    (
    insert into t2(id,todo)
    values (new.id,‘insert’)
    );

    修改操作触发器
    当t1表中记录修改的时候,被修改记录的原始ID值,插入到t2日志表,
    create trigger update_t1
    update of name on t1
    referencing old as old
    for each row
    (
    insert into t2(id,todo)
    values (old.id,‘update’)
    );

    在这里插入图片描述

    下面展示,通过EFCore调用执行SQL语句。
    1 insert语句
    GbsConnection conn = new GbsConnection(builder.ConnectionString);
    conn.Open();
    GbsCommand cmd = (GbsCommand)conn.CreateCommand();

            try
            {
                cmd.CommandText = "insert into t1(name,id,age) values ('AAA','BBB','CCC')";
                cmd.ExecuteNonQuery();
            }
            catch
            {
                throw;
            }
    

    执行期待的结果,t1表中,插入一条记录,并且触发插入操作触发器,插入一条记录在t2日志表。
    在这里插入图片描述

    在这里插入图片描述

    2 update语句
    GbsConnection conn = new GbsConnection(builder.ConnectionString);
    conn.Open();
    GbsCommand cmd = (GbsCommand)conn.CreateCommand();

            try
            {
                cmd.CommandText = "update t1 set name = 'DDD' where id ='BBB'";
                cmd.ExecuteNonQuery();
            }
            catch
            {
                throw;
            }
    

    执行期待的结果,t1表中,修改一条记录,并且触发修改操作触发器,插入一条记录在t2日志表。
    在这里插入图片描述

    3 select语句
    GbsConnection conn = new GbsConnection(builder.ConnectionString);
    conn.Open();
    GbsCommand cmd = (GbsCommand)conn.CreateCommand();

            try
            {
                cmd.CommandText = "select * from t1";
                cmd.ExecuteNonQuery();
                GbsDataReader dr = (GbsDataReader)cmd.ExecuteReader();
                while (dr.Read())
                {
                    for (int i = 0; i < dr.FieldCount; i++)
                    {
                        Console.WriteLine(dr[i]);
                    }
                }
            }
            catch
            {
                throw;
            }
    

    执行期待的结果,t1表中,没有变化,触发查询操作触发器,插入一条记录在t2日志表。
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • SqlServer常用SQL语句

    2020-05-08 09:09:51
    1 SqlServer 数据类型 1.1 image类型 分类 备注 类型 说明 二进制数据类型 存储非字符和文本的数据 Image 可用来存储图像、文件(只要是byte类型就行),等价于varbinary(MAX) 1.2 字符串类型 带n和...

    · # 1 SqlServer 数据类型

    1.1 image类型

    分类备注类型说明
    二进制数据类型存储非字符和文本的数据Image可用来存储图像、文件(只要是byte类型就行),等价于varbinary(MAX)
    日期和时间日期和时间在单引号内输入DateTime日期和时间
    数字数据该数据仅包含数字(正数、负数和分数)int、smallint 、float和real正数、数字(float、real)
    货币10进制货币值,money、smallmoney,精确到他们所代表的货币单位的万分之一Money
    Bit数据类型表示是/否的数据Bit存储布尔数据类型

    1.2 字符串类型

    1. 带n和不带n的区别:

    char(2) 表示可以存储2个字节,如ab、12、里
    不带n的数据类型,存储中文等双字节字符,占用2个字节,存储英文,数字等每个字符占一个字节。

    nchar(2)带n的,无论存储中文还是英文、数字等,每个字符都是占用两个字节。nchar(2)表示可以存储两个字符,每个字符占用2个字节。
    不带n的这些数据类型,长度最常可以设置8000,而带n的这些数据类型,长度最长可以设置4000

    ****总结:**中文需要带n

    1. 带var和不带var的区别:
      varchar、nvarchar与 char、nchar
      带var的表示:可变长度
      不带var的表示:固定长度
      固定长度: 如char(16) 存储一个字符也要16个字节,会自动补全
      **可变长度:**会根据实际存储数据的大小动态重新分配存储空间,相对来说节省存储空间。
      //char(16) 中16表示最多16个字节,如果存储的数据超过了16个字节,那么无论是固定长度还是可变长度都是会报错的。
    ------------------创建数据库---------------------------
    --1、创建数据(没有设置任何特殊的选项,都是使用默认的)
    create database MyDatabaseOne
    
    --2、删除数据库
    drop database MyDatabaseOne
    
    --3、创建数据库时设置参数
    create database MydatabaseOne
    on primary
    (
    	--配置主数据文件的选项
    	name="MydatabaseOne",
    	filename="C:\test\MydatabaseOne.mdf",
    	size=5MB,
    	maxsize=150MB,
    	filegrowth=20%
    )
    log on(
    	--配置日志文件的选项
    	name="MydatabaseOne.log",--日志文件逻辑名称
    	filename="C:\test\MydatabaseOne_log.ldf",--日志文件的实际保存路径
    	size=5MB,--日志文件初始化大小
    	filegrowth=5mb
    )
    
    ------------------在数据库中创建一张表---------------------------
    use MydatabaseOne
    
    create table Departments(AutoID int identity(1,1) primary key,DepartmentName nvarchar(64) not null)
    
    drop table Departments
    
    --创建员工表
    create table Employees(
           EmpID int identity(1,1) primary key,
           EmpIDCard varchar(32) not null,
           EmpName nvarchar(64) null,
           EmpGender bit not null,
           EmpJoinDate datetime,
           EmpAge int,
           EmpAdderss nvarchar(320),
           EmpPhone varchar(128),
           DeptID int not null,
           EmpEmail varchar(128)
           )
    
    
    create table TblClass(tClassId int identity(1,1) primary key,tClassName nvarchar(64))
    
    --向自动编号的列插入数据
    SET IDENTITY_INSERT TblClass ON
    insert into TblClass(tClassId,tClassName) values(500,N'您好') --如果是字符串常量 中文前带‘N’
    SET IDENTITY_INSERT TblClass OFF
    
    
    
    --开启事务
    begin tran 
    
    update TblClass set tClassName = N'张里' where tClassId=500
    waitfor delay '0:0:5' --5s
    update TblClass set tClassName = N'王金龙' where tClassId=500
    commit tran
    
    
    
    --打开和关闭查询结果窗口 :Ctrl+R
    
    --更新语句
    -- update 表名 set1 = 新值1,2=新值2 where 条件
    --Update语句,如果不加where条件,那么表示对表中数据都修改
    
    insert into SysUserInfo(Name,Age) values(N'张三',12) 
    select * from  SysUserInfo
    
    Update SysUserInfo set Name = Name+N'[女]',Age=Age-1 where ID=1
    --where中可以使用的其他逻辑运算运算符;(||)or、(&&)and,(!)not,<>>=<=<>(或!=)等
    
    
    
    --数据删除 delete
    --delete from 表名  where 条件
    --delete语句如果不加where条件,表示将表中的数据全部删除
    --自动编号并没有恢复到默认,仍然继续编号
    --Delete 只是删除数据,表还存在,和Drop Table(表结构也一并删除)不同   
    delete from  SysUserInfo
    --========================
    --删除表中的全部数据
    --1、delete from--2、truncate table 表
    --如果确实要删除表中的全部数据,那么建议使用truncate
    --truncate特点:
    --(1)truncate语句不能跟where条件(无法根据条件来删除,只能全部删除数据)
    --2)同时自动编号会恢复到初始值
    --3)使用truncate删除表中的所有数据要比delete效率高的多;
    --4)truncate删除数据,不触发delete触发器
    truncate table SysUserInfo
    
    
    
    --约束 保证数据的完成性
    --数据库约束是为了保证数据的完整性(正确性)而实现的一套机制
    --非空约束
    --主键约束(PK)primary constraint
    --唯一约束(UQ)Unique constraint 唯一,允许为空,但只能出现一次
    --默认约束(DF)default constraint 范围以及格式限制
    --检查约束(CK)check constraint 范围以及格式限制
    --外键约束(FK)foreign key constraint 表关系
    --增加外键约束是,设置级联更新,级联删除
     --[ON DELETE{NO ACTION|CASCADE |SET NULL| SET DEFAULT}]
     --[ON UPDATE{NO ACTION|CASCADE |SET NULL| SET DEFAULT}]
    
    create table Employees(EmpId int identity(1,1),EmpName varchar(64),EmpGender char(4),EmpAge int, EmpEmail varchar(64),EmpAddress varchar(512))
     
    create table Department(DepId int identity(1,1),DepName varchar(64))
     
    -------------------------------------------------------------------------------
    --通过t-sql语句来创建约束
    use MydatabaseOne
    
    Drop table Employees --删除数据表
    
    delete from  Employees
    
    Select *from Employees
    
     create table Employees(EmpId int identity(1,1),EmpName varchar(64),EmpGender char(4),EmpAge int, EmpEmail varchar(64),EmpAddress varchar(512))
     
     create table Department(DepId int identity(1,1),DepName varchar(64))
     
     --删除一列
     alter table Employees  drop column EmpAddress
     
     --手动增加一列(增加EmpAddress nvarchar(1024))
      alter table Employees  add EmpAddress nvarchar(1024)
      
      --手动修改一下EmpEmailde数据类型(Varchar(200))
      alter table Employees  alter column EmpEmail varchar(256)
      
      --为EmpID 增加一个主键约束
      alter table Employees add constraint PK_Employees_EmpID primary key(EmpId)
      
      --非空约束 为Employees 增加一个非空约束(修改列)
      alter table Employees alter column EmpName varchar(64) not null
      
      --为EmpName增加一个唯一约束
       alter table Employees add constraint UQ_Employees_EmpName unique(EmpName)
       
       --为性别增加一个默认约束,默认为‘男’
       alter table Employees add constraint DF_Employees_EmpGender default('男') for EmpGender
       
       --为性别增加一个检查约束,要求性别只能是 男 或者女
       alter table Employees add constraint CK_Employees_EmpGender check(EmpGender='男' or   EmpGender='女')
       
       --为年龄增减检查约束
       alter table Employees add constraint CK_Employees_EmpAge check(EmpAge>=0 and EmpAge<=120)
       
       --创建一个部门表 然后为Employees表增加一个DepId列
       alter table Department  add constraint PK_Department_DepID primary key(DepID)
       
       alter table Employees  add EmpDepId int
       
       --增加外键约束
       alter table Employees add constraint FK_Employees_Department foreign key(EmpDepId) references Department(DepId)
       
       --删除约束
       alter table Employees drop constraint FK_Employees_Department,PK_Department_DepID
       
       -------》》》》》创建表就给表增加约束《《《《《---------
       --先删除
     drop table Department2
     drop table Employees
        
     create table Employees(
               EmpId int identity(1,1) primary key,
               EmpName varchar(64) not null unique check(len(EmpName)>2),
               EmpGender char(4) default('男'),
               EmpAge int check(EmpAge>0 and EmpAge<120), 
               EmpEmail varchar(64) unique,
               EmpAddress varchar(512) not null,
               EmpDepId int foreign key references Department(DepId) on delete cascade
               )
     
    
    
    --数据检索(查询)
    --并不是说select一定需要配合form使用   也可以单独使用
    select 当前系统的时间=GETDATE() 
    
    
    
    --top  Distinct
    select Distinct *from Employees --Distinct去重
    
    --top 一般配合排序使用
    --order by  列名
    --按照年龄  降序排序
    select *from Employees order by EmpAge desc
    --按照年龄升序排序
    select *from Employees order by EmpAge asc
    select *from Employees order by EmpAge   --默认是升序排序
    
    
    --查询最高的前几名
    select top 5 * from Employees order by EmpAge desc
    
    --看前百分之几的数据 
    select top 30 percent * from Employees order by EmpAge desc
    
    
    --聚合函数
    
    --统计出所有人的年龄总和
    select SUM(EmpAge) as 年龄总和 from Employees
    
    --统计当前表种一共有多少条记录
    select COUNT(*) from Employees
    
    --计算平均年龄
    select 平均年龄=(select SUM(EmpAge) as 年龄总和 from Employees)* 1.0/(select COUNT(*) from Employees)
    
    select AVG(EmpAge) as 平均年龄 from Employees
    
    
    --计算年龄最大的
    select MAX(EmpAge) from Employees
    
    --计算年龄最小的
    select MIN(EmpAge) from Employees
    --1、聚合函数不统计空值
    --2、如果使用聚合函数的时候没有手动group by 分组     那么聚合函数会把整个表中的数据作为一组来统计
    
    
    -------带条件的查询------
    select * from Employees where EmpAge between 20 and 30
    
    select * from Employees where EmpAge in (10,20,30)
    
    --模糊查询
    --通配符:_ 、 %[]^
    
    --姓张,两个字的
    select *from Employees where EmpName like '张_'
    
    --姓张,三个字的
    select *from Employees where EmpName like '张__'
    
    -- %  匹配任意多个任意字符
    --无论姓名的字数,只是第一个字符是‘张’就查询出来
    select *from Employees where EmpName like '张%'
    
    -- [] 表示筛选,范围
      select *from Employees where EmpName like '张[a-z]妹'
      select *from Employees where EmpName like '张[a-z0-9]妹'
      select *from Employees where EmpName like '张[^0-9]妹'
      select *from Employees where EmpName not like '张[0-9]妹'
      
      --查询姓名中带%号的   需转义
      select *from Employees where EmpName like '%[%]%'
      
    --自定义转义符  关键字:ESCAPE
      select *from Employees where EmpName like '%/]%' ESCAPE '/'
      
      --null值无法使用=<>来进行比较
      --unknown
      --判断null值必须使用is null 或者is not null
      
      --查询所有年龄不是null的同学
      select *from Employees where EmpName<>null
      
      
      -----order by进行排序
      --1、降序order by 列名  desc
      --2、升序order by 列名  asc
      --3、order by 语句必须一定要放在整个SQL语句最后
      --4、根据多列进行排序
      --5、可以根据表达式来进行排序
      select *,平均分=(EmpAge+EmpId)*1.0/2 from Employees order by EmpAge desc,EmpId desc,平均分 desc
      --例:先根据英语成绩排序、再根据数学成绩排序
      
      select *from Employees order by EmpAge desc,EmpId desc
    
    --当使用了分组语句(group by) 或者聚合函数的时候,在select的查询列表中不能再包含其他的列名,除非该列同时也出现在了group by子句中,或者该列也包含在了某个聚合函数中
      
      --对分组以后的数据进行筛选:使用having
      --having 与where都是对数据进行筛选 where是对分组前的每一行数据进行筛选,而having是对分组后的每一组数据进行筛选
      
      --select 语句的处理顺序
      --以下步骤:
      --FROM->ON->JOIN->WHERE->GROUP BY->WITH CUBE或WITH ROLLUP ->HAVING->SELECT->DISTINCT->ORDER BY->TOP
      
      Select  销售总额=销售数量 *from baio  order by 销售数量 desc
      
      select *from biao
      
      --分组查询
       Select 商品名称,SUM(销售数量) as 销售数量 from 表名 group by 商品名称   oeder by 销售数量 desc
       
       select 商品名称,销售总价=SUM(销售数量*销售价格) from 表名 group by 商品名称 having SUM(销售数量*销售价格)>3000 order by 销售总价 desc
       
       select 购买人,购买数量 = SUM(销售数量) fromwhere 商品名称 = '可口可乐' group by 购买人 order by 购买数量 Desc
       
       
       -----------------类型转换函数-----------------------------
       select 100.0+CAST('1000' as int)
       slect 100.0+convert(int,'1000')
       
       
       print convert(varchar(256) ,getdate(),109)
       
       ---联合结果集  union(集合运算符)
       --使用union和union all都能进行联合,区别在于:使用union联合会去除重复,重新排列数据,而使用union all 不会去除重复也不会进行重新排列
       select *from1
       union all
          select *from2
       
       
       ------向表中插入多条记录----------------
       select * into1   from2 --将表2中的数据备份到表11是在 
       
       select top  0 * into1 from2   --只创建表结构   不copy数据
       
       --使用insert intoselect .... from------日期函数
        print getdate()
        
        print sysdatetime()
        --dateadd() 增加时间
        select DATEADD(day,200,getdate())
        
         select DATEADD(month,200,getdate())
         
           select DATEADD(year,200,getdate())
           
           
           --查询出入职一年(含)以上的员工信息
           select *From 表1 where DATEADD(YEAR,1,JoinDate)<=GETDATE()
           
           --datediff() 计算两个日期的差
           select DATEDIFF(YEAR ,'1994-11-07',GETDATE())
          print  year(getdate())
             select DATEDIFF(MONTH ,'1994-11-07',GETDATE())
             select DATEDIFF(DAY ,'1994-11-07',GETDATE())
             
             --获取日期的某部分的值
             print datepart(year,getdate())
    

    Ado.net 封装

    public static class SqlServerHelper
        {
            /// <summary>
            /// 连接字符串
            /// </summary>
            private static readonly string connStr = ConfigurationManager.ConnectionStrings["mssqlServer"].ConnectionString;
    
            #region 执行 增删改
            /// <summary>
            /// 执行 增删改  
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="pms"></param>
            /// <returns></returns>
            public static int ExcuteNonQuery(string sql, params SqlParameter[] pms)
            {
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        if (pms != null)
                        {
                            cmd.Parameters.AddRange(pms);
                        }
                        conn.Open();
                        return cmd.ExecuteNonQuery();
                    }
                }
            }
            #endregion
    
            #region 执行查询,返回单个值
            /// <summary>
            /// 执行查询,返回单个值
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="pms"></param>
            /// <returns></returns>
            public static object ExecuteScalar(string sql, params SqlParameter[] pms)
            {
                using (SqlConnection conn = new SqlConnection(connStr))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        if (pms != null)
                        {
                            cmd.Parameters.AddRange(pms);
                        }
                        conn.Open();
                        return cmd.ExecuteScalar();
                    }
                }
            }
            #endregion
    
            #region 返回SqlDataReader
            /// <summary>
            /// 返回SqlDataReader 多行
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="pms"></param>
            /// <returns></returns>
            public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] pms)
            {
                SqlConnection conn = new SqlConnection(connStr);
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (pms != null)
                    {
                        cmd.Parameters.AddRange(pms);
                    }
                    try
                    {
                        conn.Open();
                        //System.Data.CommandBehavior.CloseConnection 将来使用SqlDataReader后 关闭reader的同时,在SqlDataReader内部会将SqlConnection对象也关闭掉
                        return cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
                        //return cmd.ExecuteScalar();
                    }
                    catch //发生异常时,将连接关闭  并抛出异常
                    {
                        conn.Close();
                        conn.Dispose();
                        throw;
                    }
                }
            } 
            #endregion
    
        }
    
    
    //泛型封装
     public class BaseModel
    {
          public int ID { get; set; }
      }
    
    
    public interface IBaseDAL
        {
    
            /// <summary>
            /// 约束是为了正确的调用
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="id"></param> 
            T Find<T>(int id) where T : BaseModel;
    
    
            List<T> FindAll<T>() where T : BaseModel;
    
    
            void Update<T>(T t) where T : BaseModel;
    
    
            void Insert<T>(T t) where T : BaseModel;
    
            void Delete<T>(T t) where T : BaseModel;
    
        }
    
    
    public class SQLiteBaseDAL: IBaseDAL
        {
            /// <summary>
            /// 约束是为了正确的调用
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="id"></param>
            public T Find<T> (int id) where T:BaseModel
            {
                Type type = typeof(T);
                string strColumn = string.Join(",", type.GetProperties().Select(p=>$"[{p.GetColumnName()}]"));
                string sql = $"SELECT {strColumn} FROM [{type.Name}] WHERE Id={id}";
                T t = (T)Activator.CreateInstance(type);
                using (SQLiteConnection conn = new SQLiteConnection(StaticConstant.ConnString))
                {
                    SQLiteCommand cmd = new SQLiteCommand(sql, conn);
                    conn.Open();
                    SQLiteDataReader reader =  cmd.ExecuteReader();
    
                    t = this.ReaderToList<T>(reader).FirstOrDefault();//返回集合中第一个  没有的话为null
                    //if (reader.Read())//表示有数据
                    //{
                    //    foreach (var prop in type.GetProperties())
                    //    {
                    //        prop.SetValue(t, reader[prop.Name] is DBNull?null: reader[prop.Name]);
                    //    }
                    //}
                }
                return t;
            }
    
            public List<T> FindAll<T>() where T : BaseModel
            {
                Type type = typeof(T);
                string strColumn = string.Join(",", type.GetProperties().Select(p => $"[{p.GetColumnName()}]"));
                string sql = $"SELECT {strColumn} FROM [{type.Name}]";
                List<T> list = new List<T>();
                using (SQLiteConnection conn = new SQLiteConnection(StaticConstant.ConnString))
                {
                    SQLiteCommand cmd = new SQLiteCommand(sql, conn);
                    conn.Open();
                    SQLiteDataReader reader = cmd.ExecuteReader();
                    list = this.ReaderToList<T>(reader);
                    //while (reader.Read())//表示有数据
                    //{
                    //    T t = (T)Activator.CreateInstance(type);
                    //    foreach (var prop in type.GetProperties())
                    //    {
                    //        prop.SetValue(t, reader[prop.Name] is DBNull ? null : reader[prop.Name]);
                    //    }
                    //    list.Add(t);
                    //} 
                }
                return list;
            }
    
    
            public void Update<T>(T t) where T : BaseModel
            {
                Type type = typeof(T);
                var propArray = type.GetProperties().Where(p=>!p.Name.Equals("ID"));
                string strColumn = string.Join(",",propArray.Select(p=>$"[{p.GetColumnName()}]=@{p.GetColumnName()}"));
                //必须参数化 
                var parameters = propArray.Select(p => new SQLiteParameter($"@{p.GetColumnName()}", p.GetValue(t))).ToArray();
                string sql = $"UPDATE {type.Name} SET {strColumn} WHERE Id = {t.ID}";
                using (SQLiteConnection conn = new SQLiteConnection(StaticConstant.ConnString))
                {
                    SQLiteCommand cmd = new SQLiteCommand(sql, conn);
                    cmd.Parameters.AddRange(parameters);
                    conn.Open();
                    int nResult = cmd.ExecuteNonQuery();
                    if (nResult==0)
                    {
                        throw new Exception("Update数据不存在");
                    }
                }
    
            }
    
            public void Insert<T>(T t) where T:BaseModel
            {
    
            }
            public void Delete<T>(T t) where T : BaseModel
            {
    
            }
    
    
            #region ReaderToList Method
            private List<T> ReaderToList<T>(SQLiteDataReader sqLiteDataReader) where T : BaseModel
            {
                Type type = typeof(T);
                List< T> list = new List<T>();
                while (sqLiteDataReader.Read())//表示有数据
                {
                    T t = (T)Activator.CreateInstance(type);
                    foreach (var prop in type.GetProperties())
                    {
                        prop.SetValue(t, sqLiteDataReader[prop.GetColumnName()] is DBNull ? null : sqLiteDataReader[prop.GetColumnName()]);
                    }
                    list.Add(t);
                }
                return list;
            }
            #endregion
    
        }
    
    
    
     public static class AttributeHelper
        {
            public static string GetColumnName(this PropertyInfo propertyInfo)
            {
    
                if (propertyInfo.IsDefined(typeof(ColumnAttribute), true))
                {
                    ColumnAttribute columnAttribute = (ColumnAttribute)propertyInfo.GetCustomAttribute(typeof(ColumnAttribute), true);
                    return columnAttribute.GetColumnName();
                }
                return propertyInfo.Name;
            }
        }
    
    
    
    [AttributeUsage(AttributeTargets.Property)]//只能修饰属性
        public class ColumnAttribute:Attribute
        {
            private string _Name = string.Empty;
            public string GetColumnName()
            {
                return this._Name;
            }
            public ColumnAttribute(string name)
            {
                this._Name = name;
            }
        }
    
    
    
    
     public class User:BaseModel
        {
            public string Name { get; set; }
            public string Account { get; set; }
            public string  Pwd { get; set; }
            public string Email { get; set; }
            public string Mobile { get; set; }
            public int CompanyId { get; set; }
            public string CompanyName { get; set; }
    
            [Column("State")]
            public int Status { get; set; }
            public int UserType { get; set; }
            public DateTime LastLoginTime { get; set; }
            public int CreatorId { get; set; }
            public DateTime LastModifyTime { get; set; }
    
        }
    
    展开全文
  • SQL语句的简单快速入门

    千次阅读 2020-09-22 13:15:00
    一、SQL语句的语句的基本使用 二、使用步骤 1.引入库 2.读入数据 总结 前言 本次将为大家讲解如何简单的使用SQL访问数据库,能够轻松的学会对数据库数据的简易操作,快速理解并掌握对数据库的增删改查 ...

     

    文章目录

    • 前言
    • 一、SQL是什么
    • 二、SQL语句的快速入门
      • 1.SQL保留字
      • 2.数据库的数据类型
      • 3.数据库的增删改查

    前言

    本次将为大家讲解如何简单的使用SQL访问数据库,能够轻松的学会对数据库数据的简易操作,快速理解并掌握对数据库的增删改查


    一、SQL是什么

    SQL为结构化查询语言(Structured Query Language),是用于访问和处理数据库的标准的计算机语言

    二、SQL语句的快速入门

    1.SQL保留字

    sql语句中含有特定语义的单词或者字符串,

    比如select、from、insert、update等语法用词;

    len、sum等函数用词;

    sp_help、xp_cmdshell等系统存储过程用词。

    ==>注意:

    当我们进行数据库的设计时,要避免使用这些字符串作为实体名称,比如数据库名称、表名称、字段名称、或者触发器、视图、存储过程等等的名称都不要用到以上关键字。

    但是如果使用了,大家可在SQL语句中使用[]方括号以示区别。

     

    2.数据库的数据类型

    数据库表中的每个列都要求有名称和数据类型。

    SQL 开发人员必须在创建 SQL 表时决定表中的每个列将要存储的数据的类型。数据类型是一个标签,是便于 SQL 了解每个列期望存储什么类型的数据的指南,它也标识了 SQL 如何与存储的数据进行交互。

    • 数值类型                                                             

    类型

    大小

    用途

    TINYINT

    1 字节

    小整数值

    SMALLINT

    2 字节

    大整数值

    MEDIUMINT

    3 字节

    大整数值

    INT或INTEGER

    4 字节

    大整数值

    BIGINT

    8 字节

    极大整数值

    FLOAT

    4 字节

    单精度 浮点数值

    DOUBLE

    8 字节

    双精度 浮点数值

    DECIMAL

     

    小数值

    • 日期和时间类型

    类型格式用途
    DATEYYYY-MM-DD日期值
    TIMEHH:MM:SS时间值或持续时间
    YEARYYYY年份值
    DATETIMEYYYY-MM-DD HH:MM:SS混合日期和时间值
    TIMESTAMPYYYYMMDD HHMMSS时间戳
    • 字符串类型

    类型大小用途
    CHAR0-255字节定长字符串
    VARCHAR0-65535 字节变长字符串
    TINYBLOB0-255字节不超过 255 个字符的二进制字符串
    TINYTEXT0-255字节短文本字符串
    BLOB0-65 535字节二进制形式的长文本数据
    TEXT0-65 535字节长文本数据
    MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
    MEDIUMTEXT0-16 777 215字节中等长度文本数据
    LONGBLOB0-4 294 967 295字节二进制形式的极大文本数据
    LONGTEXT0-4 294 967 295字节极大文本数据

     

    3.数据库的增删改查

    • 查 -- SELECT 语句

    SELECT 语句用于对数据中提取数据,并且将所得结果存储在结果表中,成为结果集

    语法:

    1、SELECT * FROM table_name;

    ==>table_name为用户所创建的表名,* 指所有的数据,所以此SQL语句是获取表中所有的数据

     

    2、SELECT column_name,column_name FROM table_name where condition;

    ==>SELECT语句和WHERE子句

    where子句用于有条件地从单个表取回数据或者将多个表进行合并。

    如果条件满足,则查询只返回表中满足条件的值。你可以用 WHERE 子句来过滤查询结果,只获取必要的记录。

    WHERE 子句不仅可以用于 SELECT 语句,还可以用于 UPDATE、DELETE 等语句,其用法见后面的章节。

     

    3、SELECT [*] FROM [TableName] WHERE [condition1] [AND [OR]] [condition2]...

    ==>若有多个条件,可用AND 或者 OR 将条件相关

     

    4、SELECT DISTINCT column1, column2....columnN FROM table_name;

    ==>SELECT DISTINCT 语句中,DISTINCT关键词 用于返回唯一不同的值

     

    5、SELECT column_name() FROM table_name ORDER BY column_name() ASC or DESC;

    ==>ORDER BY 关键字用于对结果集进行排序。默认按照升序对记录进行排序,如果需要按照降序对记录进行排序,可用DESC关键字

     

    • 增 -- INSERT INTO 语句

    INSERT INTO 语句用于向表中插入新记录。

    使用INSERT关键字

    一共有两种语法

    1 INSERT INTO table_name VALUES (data1,data2,....);

    ==>按照你数据库里面的字段顺序插入
           ==>id我们可以不写,直接写null,会自动增长
           ==>INSERT INTO `info` VALUES (null,"琴键","123456")
       

        2 INSERT INTO table_name (column,column1,......) VALUES (data1,data2,....); 

    ==>按照书写的字段添加
           ==>只添加某些字段内容,剩下的的稍后完善的时候再做

     

    • 改 -- UPDATE 语句

    UPDATE 语句用于更新表中已存在的记录。

    我们也可以使用AND或OR运算符组合多个条件。

    UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value;
    

    ==>具有WHERE子句的UPDATE查询的基本语法

    注意:更新表的时候要慎重考虑是否去除where子句,where子句指定哪些记录需要更新,如果省略where子句,所有记录都将更新。

     

    • 删 -- DELETE 语句

    DELETE 语句用于删除表中的记录。

    DELETE FROM table_name WHERE condition;

    ==>DELETE FROM `表名` WHERE 条件; 

    ==>要从哪一张表里面删除符合条件的数据 

     

    DELETE FROM table_name;  或  DELETE * FROM table_name;

    ==>可以在不删除表的情况下,删除表中所有的行。这意味着表结构、属性、索引将保持不变

     

    注意:在删除记录时要格外小心!因为删了就不能重来!

     

    学完以上知识后,就可以对数据库进行简单操作啦!

     

    展开全文
  • sqlserver的数据表结构建立的不严谨,没有一些创建、更新的时间,所以每次同步都能全部数据删除再写入,数据量多的话就会很慢,所以自己就想用触发器执行,同事说跨服务器跨数据库,你这样做的话,能达到么,自己...
  • sql语句的执行流程

    千次阅读 2020-10-18 15:13:47
    一条sql语句在mysql中的执行流程 Mysql的基本逻辑结构示意图 win下查看mysql数据文件存储位置 show global variables like “%datadir%”; 用户权限 这里注意,当已经建立了连接后,在mysql-user表里面修改了用户...
  • pl/sql学习(5): 触发器trigger/事务和锁 (一)触发器简单介绍 触发器是由数据库的特定时间来触发的, 特定事件主要包括以下几种类型: (1)DML: insert, update,delete 增删改 (2)DDL: create, alte ... MySQL表级锁和...
  • SQL基础4-存储过程与触发器存储过程存储过程的概述创建和执行用户存储过程不带参数的存储过程带输入参数的存储过程带输出参数的存储过程管理存储过程系统存储过程和扩展存储过程系统存储过程扩展存储过程存储过程的...
  • This article gives you an overview of Logon triggers in SQL Server and its usage to control SQL ... 本文为您概述了SQL Server中的登录触发器及其在控制SQL Server身份验证中的用法。 介绍 (Introduction)...
  • MySQL的常用SQL语句.md

    2021-01-19 01:32:46
    修改密码这是常见的大家一般都要用的首先安装成功了打开cmd –> mysql -u root -p–>输入你的密码–>修改mysql root用户密码格式:mysql> set password for 用户名@localhost = password(‘新密码’);...
  • } } 调用sql语句 查询 DataTable dt = new DataTable(); DataAccess da = new DataAccess(); da.QueryString = "SELECT LineName,ColorA,ColorB,ColorG,ColorR FROM dbo.Line_Config "; dt = da.ExecuteDataTable...
  • 文章目录今日学习目标学习内容一、python操作MySQL安装pymysql基本使用conn.cursor():获取游标补充二、SQL注入问题二次确认三、修改表SQL语句补充1.修改表的名字 rename2.添加字段 add3.修改字段 change(名字...
  • SQL Server提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。   触发器是在对表进行插入、更新或删除操作时自动执行的存储过程。 触发器通常用于强制业务规则,它是一种高级约束。比check更严格。 ...
  • DB2中常用sql语句语法

    2018-07-12 15:31:51
    转载地址DB2 提供了关连式资料库的查询语言sql(structured query language),是一种非常口语化、既易学又易懂的语法。此一语言几乎是每个资料库系统都必须提供的,用以表示关连式的操作,包含了资料的定义(ddl...
  • 原因分析及解决用数据库直接执行sql语句没问题,甚至还可以用Go来进行分批处理,但是当你用链接类访问数据库,并执行sql语句时就有些限制,如下:System.Data.SqlClient.SqlCommand cmd;try{using (System.Data.Sq.....
  • 1. Sql存储过程概述在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器
  • T-SQL 语句(五) —— 存储过程

    千次阅读 2017-02-12 04:42:44
    T-SQL 语句(五) —— 存储过程一、存储过程简介1、存储过程:一组预先写好的能实现某种功能的T-SQL 程序,指定一个程序名后编译后并将其存在SQL Server 中,以后要实现该功能可调用这个程序来完成。 2、存储过程...
  • 目录基本的sql语句索引触发器触发器实例储存过程系统储存过程:用户自定义储存过程视图约束约束的属性介绍:示例:游标表的关联查询内连接:左连接查询:右链接查询:完全外连接:交叉连接:UNION运算:EXCEPT运算:...
  • 总结--cmd命令操作sql server

    千次阅读 2018-10-24 17:14:34
    输入的 Transact-SQL 语句存储在缓冲区中。 在遇到 GO 命令时,它们将作为批处理命令执行。 1.sqlcmd连接sql server命令如下: 命令 命令详解   打开命令提示符窗口,键入 *sqlcmd -S***my...
  • 步骤:1)开启 xp_cmdshell(sql Server 2008):通过如下命令开启:EXEC sp_configure 'show advanced options', 1 --To allow advanced options to be changed.GORECONFIGURE --To update the cur...
  • sqlserver 使用 service broker 代替触发器

    千次阅读 2017-10-24 11:06:58
    sqlserver触发器根据columns_updated内容生成动态更新列 中,进行了初步探讨,但是在实际应用中发现一个很尴尬的问题,那就是批量更新数据时,效率感人 比如表A,有20个字段,500万行数据,其中有nvarchar(max)...
  • cmd连接数据库进行了更新, 但是没有commit cmd执行sql返回2, 因为sql结尾没有加分号
  • 一、SQL SQL:Structure Query Language:结构...SQL语句分类: DDL(*)(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等; DML()(Data Manipulation Language):数据操作语言,用来定...
  • MySQL的常用SQL语句

    千次阅读 2017-07-10 11:30:57
     安装成功了打开cmd –> mysql -u root -p –>输入你的密码 修改mysql root用户密码  格式:mysql> set password for 用户名@localhost = password(‘新密码’);  举例:mysql> set password for root@loca
  • T-SQL 语句 —— 存储过程

    千次阅读 2018-05-30 00:01:23
    存储过程可以包含数据操纵语句、变量、逻辑 控制语句等,比如:单个select语句,select语句块,select语句与逻辑控制块。存储过程优点: 执行速度更快 允许模块化程序设计 提高系统安全性 减少网络流通量存储...
  • SQL语句

    2017-11-01 23:01:03
    sql语句主要是用于操作数据库,全名结构查询语言
  • SQLSERVER记录登录用户的登录时间,下面是本人写的一个脚本,我的实现原理是使用触发器触发器是登录触发器,范围是整个服务器范围,如果有人登录过,就使用bcp命令把登录信息记录日志文件1、如果原来数据库已经存在...
  • 16、分析索引效率 方法:在一般的SQL语句前加上explain; 分析结果的含义: 1)table:表名; 2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的; 3)possible_keys:查询可以利用的索引名; 4)key:实际...
  • Sql server注入分类之语句总结

    千次阅读 2020-12-16 17:14:21
    suser_sname() //查出当前操作数据库的登入名,一般和触发器一起用来监控是谁对表做了操作 user //获取当前数据库用户名 db_name() // 当前数据库名 其中db_name(N)可以来遍历其他数据库

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,436
精华内容 2,574
关键字:

cmd建立触发器的sql语句