• 【知识碎片】SQL篇


     43、group by多个字段

    查询每个班级男女生各多少人

    Select count(id),xingbie,banji from tablename group by  xingbie,banji

    42、SQL Server 导入 MDF LDF文件

    EXEC  sp_attach_db  @dbname  =  'OA',     
    @filename1  =  'C:OA.mdf',     
    @filename2  =  'C:OA_log.ldf'

    41、 快速删除表

    1) drop直接删掉表。

    2) truncate删除表中数据,再插入时自增长id又从1开始。

    3) delete删除表中数据,可以加where字句。

    40、 循环更新

      declare @temp int
      set @temp=1
      while @temp<21
      begin
      --insert into Person (TNmae,TXingBie,Tlike) values('name001',1,'lpay')
      update Person set TNmae='name'+CONVERT(nvarchar, @temp)
      where ID=@temp
      set @temp=@temp+1
      end

    39、 MSSQL 时间转换

    SELECT  REPLACE(CONVERT(varchar, Date, 111 ),'/','-') date
      FROM Logs
      where ISNULL(SiteName,'')>''

    38、oracle 转换成时间

      to_date('2016/4/21 9:19:05', 'yyyy-mm-dd hh24:mi:ss'),

    37、谁能介绍一下 oracle 中检查点 及SCN的用法。

     简单来说 就是你一个存储过程当中 创建了一个表 table_a 然后要用insert into将其他的数据插入到这个table_a当中,但是因为你在创建过程的时候 table_a还不存在,过程就会显示有编译错误,因为table_a不存在必然导致过程无法执行,所以无法编译成功,而把insert into语句加如到 execute immediate之后 则oracle不会再去理会这个对象是否存在,因此可以成功编译和执行。

     35、oracle nvl 等同于 sql server isnull()

    35、SQL,根据不同条件拼接不同SQL,非if拼接 改为SQL where形式

    (参数=0or(参数=1 and 其他条件)or(参数=2 and 其他条件)

     34 oracle连接字符串

    <--<configuration>-->
      <connectionStrings>
        <!--<add name="connStr" connectionString="Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.68)(PORT = 1521)))(CONNECT_DATA =(SID =orcl)(SERVER =geothermal)));Integrated Security=no;User ID=geothermal;Password=geothermal;Unicode=True;Max Pool Size=75; Min Pool Size=5" providerName="System.Data.OracleClient"/>-->
        <add name="connStr" connectionString="Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.122)(PORT = 1521)))(CONNECT_DATA =(SID =orcldb)(SERVER =orcname)));Integrated Security=no;User ID=username;Password=pwd;Unicode=True;Max Pool Size=75; Min Pool Size=5" providerName="System.Data.OracleClient" />
      </connectionStrings>

    33、插入时返回自增ID

    --执行这个SQL,就能查出来刚插入记录对应的自增列的值
    insert into mytable values('李四')
    select @@identity  --不推荐用这个  用scope_identity() 这个是区分作用域的  而上一个不区分只返回最后一个,微软的EF用的也是这个方法

    insert into tname(name) output inserted.ID --inserted触发器 values('dfdf')

    32、判断data中 row中某个字段是否为空

    userInfo.UserName = row["UserName"] != DBNull.Value ? row["UserName"].ToString() : string.Empty;

     31、SQLServer 辅助功能

    set statistics time on 
    -- 设置SQLSever 显示详细执行消息
    --CPU 时间 = 0 毫秒,占用时间 = 0 毫秒

    Ctrl+L 对比两个语句执行所消耗的不同

     30、创建临时表备份表

    create table tablename1 as select  * from tablename2  where 1=1;--如果是1=2是指复制表结构,不复制数据,1=1可不加
     select * into test2 from PersonList

    29、存储过程

    --创建存储过程
    create proc trim
        @str1 varchar(10)
    as
    begin
        --begin end内 存储过程内容
        select LTRIM(RTRIM(@str1))
    end
    --执行存储过程'abc'
    exec trim '  abc  '
    
    --编辑存储过程,查询表中的总数据,及当前页的数据
    --pageindex,pagesize
    alter proc GetPageList
        @pageIndex int,
        @pageSize int,
        @rowsCount int output
    as
    begin
        SET NOCOUNT ON;//不显示:(2行受到影响)
        select @rowsCount=COUNT(*) from StudentInfo where IsDelete=0
        
        select * from 
        (select *,ROW_NUMBER() over(order by sid desc) as rowIndex
        from StudentInfo where IsDelete=0) as t1
        where rowindex between (@pageIndex-1)*@pageSize+1 and @pageIndex*@pageSize
    end
    View Code

    调用

    declare @temp int
    exec GetPageList 1,2,@temp output
    print @temp

    C#调用  和正常执行一样,指定名称和类型即可 

    //指定命令类型为存储过程
    cmd.CommandType = CommandType.StoredProcedure;

     28、SQL取diff

    DATEDIFF(DAY, getdate(), EndTime) EndDayNum

     27、判断是否为空

    select * fromwhere isnull(字段,'')=''
    
    CASE WHEN ISNULL(a.RemarkName,'')='' THEN b.NickName ELSE a.RemarkName END DispName

    26、Oracle虚拟表

    --dual oracle 虚表
    select rownum, t3.*
      from (select count(*)
              from (select *
                      from TRIPINFO t
                     where t.starttime between 20130905001339 and 20130905202651) t2
             group by t2.starthour
             order by t2.starthour) t3
      from dual
    View Code

    25、 查询数据库表的总数

    --SQL Server 查询当前数据库表的总数
    select count(*) as TableCount 
    from sysobjects
    where type='u' and status>=0

     24、MySql字符串拼接

    不能直接  ' '+' '  需要用concat(' ',' ')

    UPDATE p_exp SET expdoc=REPLACE(expdoc,'/static/resources/img',CONCAT('/static/resources/img/',expcode))

    这段代码  是更新expdoc字段,将expdoc字段内的‘/static/resources/img’ 替换成‘/static/resources/img’+expcode。

    结果: /static/resources/img/20150909

    23、大小写转换

    LOWER('adc')  --大写转小写,sqlserver

    UPPER('text') --小写转大写,sqlserver

    UCASE('adc')  --大写转小写,其他

    LCASE('text') --小写转大写,其他

    SELECT LCASE(column_name) FROM table_name;

    22、简单易懂 解释左联右联

    /*例表a 
    aid adate 
         a1 
         a2 
         a3 
    表b 
    bid bdate 
         b1 
         b2 
         b4  
    --inner join  两个表a,b相连接,要取出id相同的字段 */
    select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据. 
    /*此时的取出的是: 
    a1 b1 
    a2 b2 */
    --那么left join 指: 
    select * from a left join b on a.aid = b.bid 
    /*首先取出a表中所有数据,然后再加上与a,b匹配的的数据 
    此时的取出的是: 
    a1 b1 
    a2 b2 
    a3 空字符 */
    /*同样的也有right join 
    指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据 
    此时的取出的是: 
    a1 b1 
    a2 b2 
    空字符 b4*/
    View Code

    21、事务

    -- tran 是TRANSACTION  简写,没区别
    begin try
        begin tran--设置反悔点,开启事务
        delete from UserInfo where UserId>5
        delete from ClassInfo
        commit tran--不反悔,提交事务
    end try
    begin catch
        rollback tran--反悔啦,回滚事务
    end catch
    
    --也可以不等保存提交回滚,直接回滚,适合调试,设置执行以下,看看报错不
    begin tran--设置反悔点,开启事务
        delete from UserInfo where UserId>5
        delete from ClassInfo
    rollback tran--反悔啦,回滚事务 没有结果
    View Code

    20、try catch

    --异常处理
    begin try
        delete from ClassInfo
    end try
    begin catch
        print @@error
    end catch
    View Code

    19、循环语句 if/while

    --选择语句
    declare @id int
    set @id=10
    if @id>5
    begin
        --满足条件时,执行如下代码
        print 'ok'
    end
    else
    begin
        --不满足条件时,执行如下代码
        print 'no'
    end
    
    --循环
    declare @id int
    set @id=1
    while @id<10
    begin
        print @id
        set @id=@id+1
    end
    
    --输出1-10之间的所有偶数
    declare @num int
    set @num=1
    while @num<11
    begin
        if @num%2=0
        begin
            print @num
        end
        set @num=@num+1
    end
    View Code

    18、变量

    declare @name nvarchar(10)--声明变量,MySQL oracle于此有所不同
    set @name='武大头帖'--赋值
    print @name--使用输出
    
    --全局变量:使用双 @ 符号
    --@@version --数据库版本
    --@@identity --进行插入后调用,返回最亲的标识值
    insert into ClassInfo values('四不像123');
    select @@IDENTITY--最近的insert语句的标识
    --@@servername --服务器名称
    --@@error --返回执行的上一个 Transact-SQL 语句的错误号,如果没有错误则返回0
    --@rowcount --返回受上一语句影响的行数
    View Code

    17、case when

    /*判不等语法:
        case 
            when 条件1 then ...
            when 条件2 then ...
            when 条件3 then ...
            else ...
        end*/
    //列转行
    select sName 姓名,
    --如果当前的STitle的值是"语文",则输出ScoreValue
    max(case sTitle when '语文' then scoreValue end) 语文,
    min(case when sTitle='数学' then scoreValue end) 数学,
    sum(case sTitle when '英语' then scoreValue end) 英语
     from Student_Score
     group by sName
    View Code

    16、子查询  (= in exists)

    exists 效率比in高

    --查询参与了考试的学生信息 exists in
    select * from StudentInfo
    where sId in(select distinct stuid from ScoreInfo)
    
    select * from StudentInfo
    where exists 
    (select * from ScoreInfo where ScoreInfo.stuId=StudentInfo.sid)
    View Code

    15、视图

    --创建视图
    create view VStudent_Class--alter
    as
    select StudentInfo.*,ClassInfo.cTitle from StudentInfo
    inner join ClassInfo on StudentInfo.cid=ClassInfo.cId
    --视图中存储的是select语句,而不是结果集数据
    select * from VStudent_Class
    where IsDelete=0 and cTitle='白虎'
    --删除
    drop view VStudent_Class
    View Code

    14、SQLhelper

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace King.CMS.DAL
    {
        public class SQLHelper
        {
            private static readonly string connString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            public static DataTable GetTable(string sql, CommandType type, params SqlParameter[] pars)
            {
                using (SqlConnection conn = new SqlConnection(connString))
                {
                    using (SqlDataAdapter apter = new SqlDataAdapter(sql, conn))
                    {
                        apter.SelectCommand.CommandType = type;
                        if (pars != null)
                        {
                            apter.SelectCommand.Parameters.AddRange(pars);
                        }
                        DataTable da = new DataTable();
                        apter.Fill(da);
                        return da;
                    }
                }
            }
            public static int ExecuteNonquery(string sql, CommandType type, params SqlParameter[] pars)
            {
                using (SqlConnection conn = new SqlConnection(connString))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        cmd.CommandType = type;
                        if (pars != null)
                        {
                            cmd.Parameters.AddRange(pars);
                        }
                        conn.Open();
                        return cmd.ExecuteNonQuery();
                    }
                }
    
            }
            public static object ExecuteScalare(string sql, CommandType type, params SqlParameter[] pars)
            {
                using (SqlConnection conn = new SqlConnection(connString))
                {
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        cmd.CommandType = type;
                        if (pars != null)
                        {
                            cmd.Parameters.AddRange(pars);
                        }
                        conn.Open();
                        return cmd.ExecuteScalar();
                    }
                }
            }
    
        }
    }
    View Code
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace t2_StudentInfo
    {
        public static partial class SqlHelper
        {
            private static string connStr = ConfigurationManager.ConnectionStrings["dbtest"].ConnectionString;
    
            public static int ExecuteNonQuery(string sql,params SqlParameter[] ps)
            {
                using (SqlConnection conn=new SqlConnection(connStr))
                {
                    SqlCommand cmd=new SqlCommand(sql,conn);
                    cmd.Parameters.AddRange(ps);
                    
                    conn.Open();
                    return cmd.ExecuteNonQuery();
                }
            }
    
            public static object ExecuteScalar(string sql, params SqlParameter[] ps)
            {
                using (SqlConnection conn=new SqlConnection(connStr))
                {
                    SqlCommand cmd=new SqlCommand(sql,conn);
                    cmd.Parameters.AddRange(ps);
    
                    conn.Open();
                    return cmd.ExecuteScalar();
                }
            }
    
            public static DataTable ExecuteTable(string sql,params SqlParameter[] ps)
            {
                using (SqlConnection conn=new SqlConnection(connStr))
                {
                    SqlDataAdapter adapter=new SqlDataAdapter(sql,conn);
                    //用于进行select操作,可以通过SelectCommand属性获取此操作的SqlCommand对象
                    adapter.SelectCommand.Parameters.AddRange(ps);
    
                    DataTable dt=new DataTable();
                    adapter.Fill(dt);
    
                    return dt;
                }
            }
    
            public static SqlDataReader ExecuteReader(string sql,params SqlParameter[] ps)
            {
                SqlConnection conn=new SqlConnection(connStr);
                SqlCommand cmd=new SqlCommand(sql,conn);
                cmd.Parameters.AddRange(ps);
    
                conn.Open();
    
                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
        }
    }
    View Code

    传参调用

    string sql ="";
                if (string.IsNullOrEmpty(label1.Text))
                {
                    //添加
                    sql = "insert into studentinfo(sname,sgender,sbirthday,cid) values(@name,@gender,@birthday,@cid)";
                }
                else
                {
                    //修改
                    sql = "update studentinfo set sname=@name,sgender=@gender,sbirthday=@birthday,cid=@cid where sid=" +label1.Text;
                }
    
                SqlParameter[] ps =
                {
                    new SqlParameter("@name",textBox1.Text), 
                    new SqlParameter("@gender",radioButton1.Checked), 
                    new SqlParameter("@birthday",dtpBirthday.Value), 
                    new SqlParameter("@cid",cboClassInfo.SelectedValue), 
                };
                int result=SqlHelper.ExecuteNonQuery(sql, ps);
                if (result > 0)
                {
                    FreshForm();
                    this.Close();
                }
                else
                {
                    MessageBox.Show("保存失败");
                }
    View Code

     2019年8月4日

    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    /// <summary>
    /// 数据库基本操作类
    /// </summary>
    public class SQLHelper
    {
        //数据库连接字符串
        private string connSTR;
    
        //数据库连接对象
        private SqlConnection myConnection;
    
        //数据库操作命令对象
        private SqlCommand myCommand;
    
        /// <summary>
        /// 构造函数,创建连接
        /// </summary>
        public SQLHelper()
        {
            connSTR = ConfigurationManager.ConnectionStrings["SQLCONNECTIONSTRING"].ConnectionString;
            myConnection = new SqlConnection(connSTR);
        }
    
        #region 执行带参数的sql语句(插入、删除、修改),返回-1表示执行失败
    
        public int ExcuSqlWithPara(string cmdText, SqlParameter[] para)
        {
            //创建Command
            myCommand = new SqlCommand(cmdText, myConnection);
           
            //传递参数
            for (int i = 0; i < para.Length; i++)
            {
                myCommand.Parameters.Add(para[i]);
            }
    
            //定义返回值
            int nResult = -1;
    
            try
            {
                //打开链接
                myConnection.Open();
    
                //执行SQL语句
                nResult = myCommand.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                //抛出异常
                throw new Exception(ex.Message, ex);
            }
            finally
            {   //关闭链接
                myConnection.Close();
            }
            //返回nResult
            return nResult;
        }
        #endregion
    
        #region  执行带参数的sql语句(select语句),返回数据流
        public SqlDataReader GetDRWithPara(string cmdText, SqlParameter[] para)
        {
            //创建Command
            myCommand = new SqlCommand(cmdText, myConnection);
            for (int i = 0; i < para.Length; i++)
            {
                myCommand.Parameters.Add(para[i]);
            }
    
            ///定义返回值
            SqlDataReader dr = null;
            try
            {
                ///打开链接
                myConnection.Open();
                ///执行SQL语句
                dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (SqlException ex)
            {
                ///抛出异常
                throw new Exception(ex.Message, ex);
            }
            return dr;
        }
        #endregion
    
        #region  执行带参数的sql语句(select语句),返回数据表
        /// <summary>
        /// 执行带参数的sql语句(select语句),返回数据表
        /// </summary>
        /// <param name="cmdText">带参数的SQL语句</param>
        /// <param name="para">参数列表</param>
        public DataTable GetDTWithPara(string cmdText, SqlParameter[] para)
        {
            //创建Command
            myCommand = new SqlCommand(cmdText, myConnection);
            for (int i = 0; i < para.Length; i++)
            {
                myCommand.Parameters.Add(para[i]);
            }
            SqlDataAdapter da = new SqlDataAdapter();
            DataSet ds = new DataSet();
            try
            {
                ///打开链接
                myConnection.Open();
                ///执行SQL语句
                da.SelectCommand = myCommand;
                da.Fill(ds);
            }
            catch (SqlException ex)
            {
                ///抛出异常
                throw new Exception(ex.Message, ex);
            }
            //返回dr时不能关闭连接
            finally
            {   ///关闭链接
                myConnection.Close();
            }
            //返回nResult
            return ds.Tables[0];
        }
        #endregion
    
        #region 执行不带参数的sql语句(select语句),返回数据表
        public DataTable GetDataTable(string cmdText)
        {
            ///定义返回值
            DataTable dt = null;
            try
            {
                myConnection.Open();
                SqlDataAdapter da = new SqlDataAdapter(cmdText, myConnection);
                DataSet ds = new DataSet();
                da.Fill(ds, "Table1");
                dt = ds.Tables["Table1"];
                da.Dispose();
    
            }
            catch (SqlException ex)
            {
                throw new Exception(ex.Message, ex);
            }
            finally
            {
                myConnection.Close();
    
            }
            return dt;
        }
        #endregion
    
       
    }
    View Code

    13、cast 函数

    convert  cast  convert就是比cast多了第三个参数,定义格式的,且都是西方的,我们根本用不到,就当做一样就可以了

    elect cast(89.000000 as decimal(4,1))  --结果 89.0
    
    select convert(decimal(4,1),89.000000) --结果 89.0

    数字与字符串拼接的时候会用到

    select cast(1 as char(1))+'1'    --错误demo select 1+'1'

    12、插入时重另一个表查询值

    Insert into S_Citytest(CityName) Select CityName from  S_City

    11、开窗函数 OVER

    --将统计信息分布到行中

    求科目一的平均分

    错误

    Select ScorrInfo.*, avg(scorrvalue) from ScoreInfo where subId=1

    正确

    Select ScorrInfo.*, avg(scorrvalue) over() from ScoreInfo where subId=1

    效果

    10、事务实例

    BEGIN TRY  
        BEGIN TRANSACTION  --开始事务
        DECLARE @myMemberID NVARCHAR(36) ,--用户ID
            @myBizID NVARCHAR(36) ,
            @myBizType NVARCHAR(36) ,
            @myZanNum BIGINT
    
     --业务ID            
        SET @myMemberID = '773415785c964cf89ad40528228f111b'
        SET @myBizID = 'B6C0738D-CDDC-4361-964B-870FAA795FD2'
        SET @myBizType = '0601'
    --根据点赞状态更新主表点赞数量
        UPDATE  [D_Activity]
        SET     ZanNum = CASE WHEN ( SELECT IsDel
                                     FROM   dbo.D_MemberAdmire
                                     WHERE  MemberID = @myMemberID
                                            AND BizID = @myBizID
                                   ) = 0 THEN ZanNum - 1--记录为0,-1
                              ELSE ISNULL(ZanNum + 1, 1)
                         END --没有记录记录为1,+1
        WHERE   ID = @myBizID    
    --如果存在点赞记录更新,否者插入              
        IF EXISTS ( SELECT  1
                    FROM    D_MemberAdmire
                    WHERE   MemberID = @myMemberID
                            AND BizID = @myBizID ) 
            UPDATE  dbo.D_MemberAdmire
            SET     IsDel = CASE WHEN IsDel = 1 THEN 0
                                 ELSE 1
                            END--1变0,0变1
            WHERE   MemberID = @myMemberID
                    AND BizID = @myBizID;     
    
                                             
        ELSE 
            INSERT  INTO D_MemberAdmire
                    ( ID ,
                      BizType ,
                      BizID ,
                      MemberID ,
                      Status ,
                      IsDel
                        
                    )
            VALUES  ( NEWID() ,
                      @myBizType ,
                      @myBizID ,
                      @myMemberID ,
    ,
     
                    )
        COMMIT TRANSACTION --提交事务
    END TRY
    BEGIN CATCH --抓取异常
        ROLLBACK TRANSACTION --回滚事务
    END CATCH
    View Code

    9、MySQL数据库优化

    SQL 优化

    慢查询分析 分表 分区 读写分离 数据库集群
    5.1.1
    慢查询
    查询优化
    开启慢查询日志
    EXPLAIN 工具分析

    存储引擎
    考虑业务场景
    银行类 必须用事务类引擎 innodb 较为安全效率低、
    MyISAM 非事务类 效率高

    分表
    垂直拆分:
    把一个表的字段分多个表存储
    水平拆分
    按照ID或者其他唯一条件 分到多个相同表结构中存储

    分区
    配置一下即可 比较简单

    读写分离
    多数是从写数据库同步到读数据库 保证数据同步

    数据库集群
    推荐 MyCat 搭建 开源的 稳定的 性能强大

    硬件优化
    内存优化
    更大内存
    IO优化
    IO 比如SSD告诉硬盘 或者购买磁盘阵列
    CPU优化
    在BIOS 开启最大性能

    数据库三范式 列不可拆分 :唯一标识 :引用主键

    8、项目实例 声明包 创建存储过程,调用

    --声明包
    create or replace package pkg_region_to_region
    as
     type  type_cursor is ref cursor;
     procedure read_rows (header varchar2, result out type_cursor);
    end pkg_region_to_region;
    
    
    --创建存储过程
    create or replace package body pkg_region_to_region
    as
     procedure read_rows(header varchar2, result out type_cursor)
     is
      sqlText varchar2(5000);
     begin
       open result for
       select  * from (
    select count(*), br2.name, br2.code,header startcode
      from (select * 
              from (select R.name      startname,
                           R.code      startcode,
                           B.stationid startstationid
                      from Region R
                      left join BASECELLSTATION B
    
                        on B.region = R.code) br
              left join (select t.*, t.DESTINATIONSTATION stationid
                          from TRIPINFO t) TR
                on tr.stationid = br.startstationid
             where startcode = header
             order by startcode) TT1
      left join (select R.name name, R.code code, B.stationid stationid
                   from Region R
                   left join BASECELLSTATION B
    
                     on B.region = R.code) br2
        on br2.stationid = TT1.ORIGINSTATION
     GROUP by br2.code, br2.name
     order by br2.code);
      --dbms_output.put_line(sqlText);
       --sqlText;
     end read_rows;
    end pkg_region_to_region;
    
    
    --调用存储过程
    var result refcursor
    exec pkg_region_to_region.read_rows('1',:result);
    print result
    View Code

    1.连接池,知道原理就好,没办法控制

    close()之后把连接放到连接池,并不是真正关闭,然后再次连接的时候,数据库直接去连接池中取这个连接,效率大大提高,sqlserver默认是开始的,如果加“looping=false”,就手动关闭,不是特殊需要,不要关闭

    2.参数化SQL语句,防止SQL注入

    //using 释放资源 
    using (SqlConnection conn = new SqlConnection("server=.;database=dbtest;uid=sa;pwd=123"))
                {
                    string sql = "insert into userinfo values(@name,'202cb962ac59075b964b07152d234b70')";
    
                    SqlCommand cmd = new SqlCommand(sql, conn);
    
                    cmd.Parameters.Add(new SqlParameter("@name", textBox1.Text));
    
                    conn.Open();
                    int i = cmd.ExecuteNonQuery();
                    MessageBox.Show(i.ToString());
                }
    View Code

     创建存储过程

    create proc trim
        @str1 varchar(10)
    as
    begin
        select LTRIM(RTRIM(@str1))
    end
    --'abc'
    
    
    --trim 定义的存储过程名称     @str1  参数  
    
    
    --执行存储过程
    exec trim '  abc  '

    创建存储过程

    --编写存储过程,查询表中的总数据,及当前页的数据
    --pageindex,pagesize
    alter proc GetPageList
        @pageIndex int,
        @pageSize int,
        @rowsCount int output
    as
    begin
        SET NOCOUNT ON;
        select @rowsCount=COUNT(*) from StudentInfo where IsDelete=0
        
        select * from 
        (select *,ROW_NUMBER() over(order by sid desc) as rowIndex
        from StudentInfo where IsDelete=0) as t1
        where rowindex between (@pageIndex-1)*@pageSize+1 and @pageIndex*@pageSize
    end
    
    declare @temp int
    exec GetPageList 1,2,@temp output
    print @temp
    View Code

    调用存储过程

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Windows.Forms.VisualStyles;
    
    namespace t1_ProcTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private int pageIndex,pageSize;
            private void Form1_Load(object sender, EventArgs e)
            {
                pageIndex = 1;//设置默认是第一页
                pageSize = 3;
                LoadList();
            }
    
            private void LoadList()
            {
                string sql = "GetPageList";//存储过程的名称
    
                SqlParameter pCount = new SqlParameter("@rowsCount", SqlDbType.Int);
                pCount.Direction = ParameterDirection.Output;//将参数设置为输出
    
                using (SqlConnection conn = new SqlConnection("server=.;database=dbtest;uid=sa;pwd=123"))
                {
                    SqlCommand cmd=new SqlCommand(sql,conn);
                    //指定命令类型为存储过程
                    cmd.CommandType = CommandType.StoredProcedure;
    
                    //根据存储过程来构造参数
                    SqlParameter pIndex=new SqlParameter("@pageIndex",pageIndex);
                    SqlParameter pSize = new SqlParameter("@pageSize",pageSize);
                    
                    //为cmd添加参数
                    cmd.Parameters.Add(pIndex);
                    cmd.Parameters.Add(pSize);
                    cmd.Parameters.Add(pCount);
    
                    conn.Open();
                    SqlDataReader reader = cmd.ExecuteReader();
    
                    List<StudentInfo> list=new List<StudentInfo>();
                    while (reader.Read())
                    {
                        list.Add(new StudentInfo()
                        {
                            Sid = Convert.ToInt32(reader["sid"]),
                            SName = reader["sname"].ToString()
                        });
                    }
    
                    dataGridView1.DataSource = list;
                    
                }
                //当整个操作执行完成后,连接关闭了,再去获取参数的返回值
                txtCount.Text = pCount.Value.ToString();
            }
    
            private void 上一页ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                pageIndex--;
    
                if (pageIndex < 1)
                {
                    pageIndex = 1;
                }
    
                LoadList();
            }
    
            private void 下一页ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                pageIndex++;
    
                int rowsCount = int.Parse(txtCount.Text);
                //1.1
                //计算总页数
                int pageCount = (int) Math.Ceiling(rowsCount*1.0/pageSize);
                //修正页索引,不能超出总页数
                if (pageIndex > pageCount)
                {
                    pageIndex = pageCount;
                }
    
                LoadList();
            }
        }
    }
    View Code

    分页存储过程 

    GO
    /****** Object:  StoredProcedure [dbo].[execByPage]    Script Date: 2015/9/9 9:55:34 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROC [dbo].[execByPage]
          @sqlQuery NVARCHAR(MAX), --//输入参数:SQL检索语句或表名
          @pageSize INT, --//输入参数:每页显示记录条数
          @pageIndex INT, --//输入参数:当前页码
          @order NVARCHAR(100)='' --排序字段 :例如ordercol desc
    AS
          SET NOCOUNT ON
          SET ANSI_WARNINGS OFF
          
          DECLARE @tmpTableName VARCHAR(50)
    
          SET @tmpTableName = '##TB1516_' + REPLACE(CAST(NEWID() AS VARCHAR(36)),
                                                    '-', '') --//生成随机临时表名称
          IF ( @order != '' )
             SET @order = ' order by ' + @order
    
          SET @sqlQuery = 'select *,IDENTITY(numeric,1,1) as ID1516 into ' +
              @tmpTableName + ' from ( ' + @sqlQuery + ') t' + @order
              print(@sqlQuery);
          EXEC sp_executesql @sqlQuery --//建立并初始化临时表数据
    
          DECLARE @indexStart VARCHAR(20),
                  @indexEnd VARCHAR(20)
          SET @indexStart = CAST(( ( @pageIndex - 1 ) * @pageSize + 1 ) AS VARCHAR(20)) --//数据起始行ID
          SET @indexEnd = CAST(( @pageIndex * @pageSize ) AS VARCHAR(20)) --//数据结束行ID
    
          EXEC ('select * from ' + @tmpTableName + ' where ID1516 between ' + @indexStart + ' and ' + @indexEnd ) --//检索该页数据
          EXEC('select (case when max(ID1516)>0  then max(ID1516) else 0 end) as recordCount from ' + @tmpTableName) --//提取总条数
          EXEC('drop table ' + @tmpTableName) --//删除临时表
    
    
    go
    
    ALTER PROC [dbo].[execByPageList]
          @sqlQuery NVARCHAR(MAX), --//输入参数:SQL检索语句或表名
          @pageSize INT, --//输入参数:每页显示记录条数
          @pageIndex INT --//输入参数:当前页码
    AS
    BEGIN
    
        SET NOCOUNT ON
        SET ANSI_WARNINGS OFF
    
        declare @tmpTableName varchar(50)
        set @tmpTableName = '##TB1516_' + replace(cast(newid() as varchar(40)),'-','') --//生成随机临时表名称
    
        declare @subIndex int
        set @subIndex = charindex('from',@sqlQuery)
        if (@subIndex > 0)
        begin --//带FROM的标准检索语句
        declare @sqlQuery1 varchar(8000)
        declare @sqlQuery2 varchar(8000)
        set @sqlQuery1 = substring(@sqlQuery,1,@subIndex - 1)
        set @sqlQuery2 = substring(@sqlQuery,@subIndex,len(@sqlQuery))
        set @sqlQuery = @sqlQuery1 + ',IDENTITY(numeric,1,1) as ID1516 into ' + @tmpTableName + ' ' + @sqlQuery2
        end
        else --//不带FROM的表名
        begin
        set @sqlQuery = 'select *,IDENTITY(numeric,1,1) as ID1516 into ' + @tmpTableName + ' from' + @sqlQuery
        end
        exec(@sqlQuery) --//建立并初始化临时表数据
    
        declare @indexStart varchar(20),@indexEnd varchar(20)
        set @indexStart = cast((@pageIndex-1)*@pageSize+1 as varchar(20)) --//数据起始行ID
        set @indexEnd = cast(@pageIndex * @pageSize as varchar(20)) --//数据结束行ID
    
        exec('select * from ' + @tmpTableName + ' where ID1516 between ' + @indexStart + ' and ' + @indexEnd) --//检索该页数据
    
        exec('select (case when max(ID1516)>0  then max(ID1516) else 0 end) as recordCount from ' + @tmpTableName) --//提取总条数
    
        exec('drop table ' + @tmpTableName) --//删除临时表
    View Code

     动态类型

    public IEnumerable<dynamic> RunDynamicList(string sql)
            {
                var table = RunSelectQuery(sql);
                if (table == null || table.Rows.Count < 1)
                    return null;
                return table.AsEnumerable().Select(x => new DynamicRow(x));
            }
    

      

    linq 去重

     

    索引、触发器

    CREATE TRIGGER BeforeInsertTest
      ON student
      FOR INSERT
    AS
    DECLARE
      @major varchar(20) ;
    BEGIN
     -- 取得 专业名.
     SELECT @major = major FROM INSERTED;
     -- 更新专业的人数.
     UPDATE
      major
     SET
      snumber  = snumber + 1
     WHERE
      name = @major;
    END;
    go
    View Code

    参考地址:http://www.runoob.com/sql/sql-hosting.html

  • 相关阅读:
    Django之信号
    Django缓存
    git简介
    Django request.path
    Django loaction.pathname 属性
    Ajax
    Anaconda 执行命令报ssl错误
    几行代码快速去掉迅雷临时文件的后缀
    win7 64 位安装 python,提示: 0x80240017-未指定的错误
    系统变量 %USERPROFILE%
  • 原文地址:https://www.cnblogs.com/xiaoshi657/p/4113776.html
Copyright © 2020-2023  润新知