【C#】开发常见易错知识点

一、client:
(1)checkbox 实现自由多选  保证DataGridview的MultiSelect属性值为true
    读写可拷贝权限:
    1).只读不可拷贝
       ColumnViewOptionsBehavior.Editable = false;

    2).只读可拷贝
      ColumnViewOptionsBehavior.Editable = True;
      OptionsColumn.AllowEdit = True;
      OptionsColumn.ReadOnly = True;

    3).可编辑
      ColumnViewOptionsBehavior.Editable = True;
      OptionsColumn.AllowEdit = True;
      OptionsColumn.ReadOnly = False;

(2)c# XElement XML操作总结:
    1.读取xml
    2.遍历xml
    3.添加元素
    4.查找元素
    5.修改元素
    6.删除元素
    7.创建xml
(3)this.Invoke()作用是:在应用程序的主线程上执行指定的委托。一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke();
(4)string.Join 分隔
    就是将传入的字符串数组(必须是字符串string) value,用特定的分隔符 separator 进行分割

      例:  List<string> list = new List<string>();

               list.add("aa");

               list.add("bb");

               list.add("cc");

               Console.WriteLine(string.Join("-", list));

      输出的结果就是    aa-bb-cc
  (5)IList接口
    如果你自己想做一个具有List特点的类,继承它,实现所有的接口函数,CSDN里有例子.
    List <string> 泛型,内容是强类型的string.
    个人认为:List <string> 就够用了,Ilist没啥用,写那么多实现函数,麻烦,除非做特殊的数据结构.
    C#IList取前N行使用Take<T>()方法:
        IList<int> IDs = new List<int>();
                        IDs = IDs .Take(10).ToList<int>();
(6)Timer  计时器
    如果你需要使用规律的时间间隔重复执行一些方法,最简单的方式是使用定时器(timer)。
    .NET Framework 提供了 4 种定时器。下边两个类是通用的多线程定时器:
    (1)System.Threading.Timer
    (2)System.Timers.Timer
    另外两个是专用的单线程定时器:

    (3)System.Windows.Forms.Timer (Windows Forms 的定时器)
    (4)System.Windows.Threading.DispatcherTimer (WPF 的定时器)
    多线程定时器更加强大、精确并且更加灵活,而单线程定时器对于一些简单的更新 Windows Forms 和 WPF 控件的任务来说是安全的,并且更加便捷。
    
(7) if ()
      else if ()
      else
      只进if或else if 其中一个,就会跳出循环
      
(8)C#集合中的Add与AddRange方法
    Add:添加单个元素
    AddRange:添加实现了ICollection接口的一个集合的所有元素到指定集合的末尾
    
(9)C# 中 finally{} 的用法
    当一个异常抛出时,它会改变程序的执行流程。因此不能保证一个语句结束后,它后面的语句一定会执行,在 C# 中这个问题可以用 finally 解决。
    为了确保一个语句总是能执行(不管是否抛出异常),需要将该语句放到一个 finally 块中,finally 要么紧接在 try 块之后,要么紧接在 try 块之后的最后一个 catch 处理程序之后。只要程序进入与一个 finally 块关联的 try 块,则 finally 块始终都会运行 -- 即使发生了一个异常。、
    
(10)数组初始化
    arrActType.Initialize();  // 数组初始化
(11)SubString()的用法:
    String.SubString(int index,int length)  
    index:开始位置,从0开始    
    length:你要取的子字符串的长度 
    例:
    string myString = "Hello Word!";
    string subString1 = myString.Substring(0);  //从第0个字符开始截取,到字符串结束  输出:Hello Word!  
    string subString2 = myString.Substring(0, 5);  //输出:Hello
    
(12)c# 获取系统当前日期时间,

    按照2016-05-05-13-00-00格式输出:string dtnow = string.Format("{0:yyyy-MM-dd-HH-mm-ss}", DateTime.Now); //24小时制

    按照2016-05-05-01-00-00格式输出:string dtnow = string.Format("{0:yyyy-MM-dd-hh-mm-ss}", DateTime.Now); //12小时制
    M 月份数字。一位数的月份没有前导零。 
    MM 月份数字。一位数的月份有一个前导零。
    string格式的日期时间字符串转为DateTime:
        方法1:
            DateTime dt;
            DateTimeFormatInfo dtFormat = new System.GlobalizationDateTimeFormatInfo();
            dtFormat.ShortDatePattern = "yyyy/MM/dd";
            dt = Convert.ToDateTime("2011/05/26", dtFormat);
        方法2:
            string dateString = "20110526";
            DateTime dt = DateTime.ParseExact(dateString, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
    屏蔽电脑时间格式对代码的影响:System.Globalization.DateTimeFormatInfo
        例子:Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss",
              System.Globalization.DateTimeFormatInfo.InvariantInfo));
    DevExpress的DateEdit设置显示日期和时间的方法:设置Mask.EditMask和DisplayFormat,EditFormat属性,设置为一致:'yyyy-MM-dd HH:mm'。
    oracle数据库TIMESTAMP(6)时间戳类型:时间戳类型,参数6指的是表⽰秒的数字的⼩数点右边可以存储6位数字,最多9位。由于时间戳的精确度很小,我们也常常用来作为版本控制。
(13)c#中dataset的常用方法
    DateSet.tables[0].Rows[i][j] //第i行第j列
    DateSet.tables[0].Columns.count  //总列数
    DateSet.tables[0].Rows.count  //总行数
    
(14)拼接字符串
    c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接,如果是频繁的长串操作,StringBuilder具有绝对的优势。
    
(15)C# TabControl(页签)控件禁用TabPage的问题
        TabPage没有Enabled的属性.
    但可使用变通的方法:
    tabControl1.TabPages.Remove(page1);  //移除tabpage
    tabControl1.TabPages.Add(page2);   //添加tabpage
     
(16)Form1的comboBox1首先绑定数据库的数据表test
     this.comboBox1.DisplayMember = "name";//下拉框要显示的数据库的字段
     this.comboBox1.ValueMember = "id";  //显示的数据库的字段对应的那张表的id
     comboBox1.ItemIndex = 0;  //默认显示第一个
    
(17)更改应用程序图标
    右击client的主程序--属性--应用程式--图示选择图片文件(要为.ico)
    
(18)C#中的break和Continue语句有什么区别?    
    break语句终止循环,并在循环之后立即将执行转移到该语句。
    Continue语句使循环跳过主体的其余部分,并在重新进行迭代之前立即重新测试其条件。
    当在循环内遇到break语句时,循环立即终止,程序控制在循环后的下一条语句处恢复。
    C#中的continue语句的工作原理与break语句类似。但是,continue不会强制终止,而是会强制执行循环的下一次迭代,从而跳过两者之间的任何代码。
(19)Oracle表字段的增加、删除、修改和重命名
    增加字段语法:alter table tablename add (column datatype [default value][null/not null],….);
    说明:alter table 表名 add (字段名 字段类型 默认值 是否为空);
    例:alter table sf_users add (HeadPIC blob);
    例:alter table sf_users add (userName varchar2(30) default '空' not null);
    
    修改字段的语法:alter table tablename modify (column datatype [default value][null/not null],….); 
    说明:alter table 表名 modify (字段名 字段类型 默认值 是否为空);
    例:alter table sf_InvoiceApply modify (BILLCODE number(4));
    
    删除字段的语法:alter table tablename drop (column);
    说明:alter table 表名 drop column 字段名;
    例:alter table sf_users drop column HeadPIC;

    字段的重命名:
    说明:alter table 表名 rename  column  列名 to 新列名   (其中:column是关键字)
    例:alter table sf_InvoiceApply rename column PIC to NEWPIC;

    表的重命名:
    说明:alter table 表名 rename to  新表名
    例:alter table sf_InvoiceApply rename to  sf_New_InvoiceApply;

(20)Linux之df命令 :显示指定磁盘文件的可用空间。
    df -h :以可读性较高的方式来显示信息
(21)linux常用命令
    1、ls  列出文件list
        ls -l  列出文件的详细信息
        ls -a  all,列出所有文件,包括隐藏文件
        
    2、cd  切换目录
        cd /home  切换/进入home目录
        cd..      返回上级目录
        
    3、cp  复制
        cp -ir  若有文件夹重名时,会询问是否覆盖;复制文件夹时,连同子文件(夹)一起复制!!!
        例子:cp -ir test/ c:index/test1  把当前路径下的test文件夹复制到C盘下的index文件夹中,并命名为test1
    4、mv  移动
    5、rm  移除、删除(remove)
    6、mkdir  创建文件夹(make directory)
    7、rmdir  删除文件夹
    8、grep  按行查找并匹配
        ps -ef | grep sshd  查找指定ssh服务进程 
        ps -ef | grep sshd | grep -v grep 查找指定服务进程,排除gerp身 
        ps -ef | grep sshd -c 查找指定进程个数 
    9、tar  打包、压缩、解压.tar文件
    10、unzip  解压.zip文件
    11、car  打印文件内容
    12、ps  查看进程process select
    13、kill  杀死进程
    14、pwd  显示工作目录
    15、tee  显示并保存
    16、reboot  重启
    17、:qw  保存修改
    18、vi 文件名        打开文件
        注意:使用vi编辑器打开文件后,并不能编辑,因为此时处于命令模式,点击键盘i/a/o进入编辑模式。
        编辑文件:
            使用vi编辑器打开文件后点击按键:i ,a或者o即可进入编辑模式。
            i:在光标所在字符前开始插入
            a:在光标所在字符后开始插入
            o:在光标所在行的下面另起一新行插入
        保存或者取消编辑:
            保存文件:
            第一步:ESC  进入命令行模式
            第二步::     进入底行模式
            第三步:wq     保存并退出编辑

        取消编辑:
            第一步:ESC  进入命令行模式
            第二步::     进入底行模式
            第三步:q!     撤销本次修改并退出编辑

(22)砍资料SQL
    DECLARE 
    V_LYYYYMM VARCHAR2(32767);
    BEGIN 
    V_LYYYYMM := '201908';
    SYSTEM.EDCAUTOSPLIT ( V_LYYYYMM );
    COMMIT; 
    END;
    
    expdp edc_sys/edccft DIRECTORY=EDCSYS_EXPDP DUMPFILE=DATA_EXT_202205.dmp TABLES=EDC_SYS.D_EDC_DATA_EXTEND:P_202205 EXCLUDE=INDEX,STATISTICS 
    logfile=DATA_EXT_202205.log;
    impdp edc_sys/edccft DIRECTORY=EDCSYS_EXPDP DUMPFILE=DATA_EXT_202205.dmp TABLES=EDC_SYS.D_EDC_DATA_EXTEND 
    REMAP_TABLE=EDC_SYS.D_EDC_DATA_EXTEND:D_EDC_DATA_EXTEND_TEMP table_exists_action=append;

(23)数据实现获取前几条数据的方法
    1、SQL SERVER/MYSQL :SELECT TOP N * FROM 
    2、oracle:
            SELECT 列名1...列名n FROM
                (SELECT 列名1...列名n 
                FROM 表名ORDER BY 列名1...列名n ORDER BY )
            WHERE ROWNUM <= N(抽出记录数)
            ORDER BY ROWNUM ASC

(24)C# DialogResult.OK == Form.ShowDialog()  //将窗体显示为模式窗体并判断窗体的返回值来确定下一步的操作
    DialogResult 是Form类的一个属性,ShowDialog()是Form类的一个方法也就是函数。
    一般对话框上会有:确定,取消两个按钮。 
    点击确定,会设置 DialogResult =DialogResult.OK ;点击取消,会设置 DialogResult =DialogResult.Cancel ;
    然后在主进程根据 DialogResult 来判断用户是点了确定还是取消,并根据这个返回值,决定下面的操作。

(25)[C#] StringBuilder简介及使用方法:
    StringBuilder弥补了string在赋值时开辟新空间不足之处。StringBuilder类型变量会初始化一段长度,供后续对该变量进行增加。
    当然也可以手动定义其长度:StringBuilder sqlBuilder = new StringBuilder(500);
(26)GridView.Rows[e.RowIndex].Cell[1].Controls[0]
        这里是一个类型强制转换,把(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])这个控件转换当做一个TextBox类型的控件,然后取“这个TextBox   ”的text属性,接着把Text属性的值通过ToString()方法转成string,再通过Trim()方法去文本掉开头结尾的空格(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])。这是指获取GridView1控件的第“e.RowIndex+1”行的第2列单元格内的第一个控件。e.RowIndex是指当前鼠标选中的行的序号,+1是因为数组的下标从0开始,0表示第1,1实际表示第2了
(27)Oracle:ORA-00955: name is already used by an existing object
        名称已被现有对象使用。不知道怎么解决????
(28)StringBuilder中的Append和AppendFormat两个函数的区别
        Append是直接追加字符串。
        AppendFormat是使用类似String.Format方式追加具备一定格式的字符串。
        例如AppendFormat("现在时间:{0},您的ID:{1},确认时间{0}",DateTime.Now.ToString("HH:mm:ss"),19);
        等效于Append("现在时间:"+DateTime.Now.ToString("HH:mm:ss")+",您的ID:" + 19.ToString() +",确认时间:" + DateTime.Now.ToString("HH:mm:ss"));
(29)select column_name from user_tab_columns where table_name = 'DW_R2R_BOD_CFG' 查找出来的column 乱序
    select column_name from user_tab_columns where table_name = 'DW_R2R_BOD_CFG' order by column_id asc  //添加order by column_id asc
    数据库表解析?
(30)oracle string字段带有单引号,导致insert失败。要把单引号换成 ''  俩单引号,可以使用 str.replace("'", "''")。
    例:INSERT INTO D_EDC_EDCCHKHIS(OBJECTKEY,GLASS_ID,PRODUCT_ID,EC_CODE,OPERATION,EQP_ID,
    RECIPE_ID,EDC_ITEM,EDC_TYPE,EDC_VALUE,USPEC,
    LSPEC,UCL,LCL,TARGET,TARGETCHAR,
    OOS_ACTION,OOC_ACTION,SPEC_TYPE,CLM_USER,CLDATE,
    CLTIME,CHK_DATETIME,CHKTYPE,CHAMBER,ERRSHEETID) 
    VALUES (TASK_SEQUENCE.NextVal,'test-X3A2652HF-2542','PAE02XXXM12H','','66000','4BOD0610',
    '43'GOA                        ','TFT1_Scr_Set_X','001','1007','1000',
    '700','900','800','1000','',
    '1A','3A','A','Alice','2022-07-10',
    '06:41:28',systimestamp,'OOS','00','')

(31)Oracle中判断某字段不为空及为空的SQL语句
    sql中判断非空不能用等号,因为null在sql中被看作特殊符号,必须使用关键字 is和not应该如此使用:
    select * from A where b1 is null -- 为空
    或者:
    select * from A where b1 is not null -- 不为空

(32)C#中将string类型转换为double类型
    String salary = "5555"; 
    // 例 1 
    Double mySalary = Double.Parse(salary);
    // 例 2 
    mySalary = System.Convert.ToDouble(salary);
    上例在C#中如何进行数据类型转换。注意:异常捕获
(33)oracle中nvl函数的用法
    在oracle中,nvl()函数用于从两个表达式返回一个非null值,语法为“nvl(表达式1,表达式2)”;若表达式1的计算结果为null值,则该函数返回表达式2的结果,
    若表达式1的计算结果不是null值,则返回表达式1的结果。

(34)查询指定表中的所有字段名
    select name from syscolumns where id=Object_Id('table_name');

(35)C#里sqlDataAdapter.fill(DataSet,String)的用法
    第二个参数 String是指定DataSet 里表的名字,例如 sqlDataAdapter.fill(DataSet,"学生表") 
    指定后,以后就可以这样调用这张表 DataSet.Tables["学生表"] 
    第二个参数可以不要的,如果不要第二个参数 String  那你调用这张表只能通过索引号,例如 DataSet.Tables[0]  如果填充的表比较多的话,用这个参数比较容易管理和
    调用。

(36)select into from 和 insert into select 的用法和区别
    select into from 和 insert into select都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建。insert into select from 要求目标表存在
    
(37)Oracle sql查询时如何保留两位小数
    SELECT * FROM A WHERE ROUND(AVG(A.ITME1,2));  //保留2位小數,round會四捨五入
    SELECT * FROM B WHERE TRUNC(0.3333,3);  //保留3位小數,trunc 不會四捨五入、

(38)oracle 陌生數值類型
    number(m,n) --m长度,n为小数点后部分的长度
    INT、INTEGER 是 NUMBER 的受限子类型(只表示整数)
    BigDecimal、double  //保留小數,BigDecimal来表示小数,它比double的精度高一些
    BINARYFLOAT和BINARYDOUBL   //这两种分别IEEE-754标准中的单精度,双精度二进制浮点类型,不允许为NULL,而且发生溢出时也不会抛出异常。

(39)在 System.IO.IOException 中第一次偶然出现的“mscorlib.dll”类型的异常
    File.Create("D:\\date\\" + txtname.Text + ".txt"); //你在这里创建了一个文件
    name = @"D:\date\" + txtname.Text + ".txt";
    File.WriteAllText(name, txtname.Text); //这个方法会自动创建一个文件,与上面冲突了。删除上面的create方法

(40) c#声明数组变量&&C/C++声明数组变量&&JS定义数组
    C#:
    string[] array1 = {"S","A","B"};  //array1包括S,A,B 三个元素
    INT[] ARRAY2 = NEW INT[6];  //定义array2的长度为6
    
    C/C++:
    char array1[] = {"S","A","B"};
    INT ARRAY2[6];

    JS:
    var cars=new Array("Saab","Volvo","BMW");
    或var cars=["Saab","Volvo","BMW"];
    
(41)DECODE的语法:可用在select decode()from,也可以用在select* from table where table.a = decode()
    DECODE(value,if1,then1,if2,then2,if3,then3,...,else)
    相当于:
    if a=... then
    ......
    else
    ....
    end if;

(42)HashSet
    .NET 3.5在System.Collections.Generic命名空间中包含一个新的集合类:HashSet。这个集合类包含不重复项的无序列表。

(43)oracle中,保存以"0"开头的字段字符类型不能用number,用number会自动把"0"去掉,可以用varchar2

(44)C#判断字符串内所有所有字符都是数字
    public static bool IsNumber(string s)
    {
        const string partern = "^[0-9]*$";
        Regex rx = new Regex(partern);
        return rx.IsMatch(s);
    }

(45)linq学习
    一些有用的linq扩展方法:
    1.Any    如果数据源中有任何一个条目与谓词相匹配,则返回true
    2.All    如果数据源中所有条目都与谓词相匹配,则返回true
    3.FirstOrDefault    返回数据源的第一个条目,无条目时返回默认值
    4.LastOrDefault     返回数据源的最后一个条目,无条目时返回默认值
    5.count    返回数据源的条目数
    6.Sum    对谓词选定的词进行求和
    7.Where   过滤掉数据源中与谓词不相匹配的条目
    8.ToList/ToArray/ToDictionary    把数据源转化为数组或字典
    9.Max/Min    返回由lambda表达式表示的最大值或最小值
    10.
    
    实例:
    var itemValue2 = ItemList.GroupBy(i => i.ItemID).Select(dx => new {ItemID = dx.Key,Qty = dx.Max(q => q.SealQty)}).ToList();     
    //在ItemList中按ItemID进行分组,储存为新建的dx临时表,表中的字段以ItemID为Key,Qty为普通字段
 
 (46)oracle 去重
 ①row_number() over(partition by )
 例:select  id  ,name from 
  (select row_number()  over(partition by id order by name ) t1 , t2.id,t2.name from b t2) 
  where t1 = 1  )  t3   on t3.id = t5.id
 ②distinct
 例:select distinct(id) from a 

(47)C# WqlObjectQuery出错
    using System.Management; //调用类库


(48)什么时候用静态方法,什么时候用非静态方法??
      调用类里面的静态方法(static)不需要创建实例、不能调用非静态方法,调用类里面的非静态方法(不带static)才需要创建实例
      解答:静态方法从启动程序就一直占用内存,非静态方法在实例化的时候才会占用内存,但是每实例化一个对象会占用另外的内存。
            比如说,数据库的连接方法会经常访问数据库调用,这时就可以使用静态方法,如果使用非静态方法就会经常实例化,这样相比来说占用内存较大就不划算了。
            还有,登录页面的方法不会经常被调用,就使用非静态方法。(总结:经常调用用静态,不常调用用非静态)

(49)什么时候用泛型比较好?

(50)创建datatable并添加行和列
    DataTable dt = new DataTable();
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Age", typeof(int));
    dt.Columns.Add("Height", typeof(double));
    foreach (var item in listItem)
    {
        DataRow dr = dt.NewRow();
        dr["Name"] = "小明";
        dr["Age"] = 13;
        dr["Height"] = 134.3;
        dt.Rows.Add(dr);
    } 

(51)using ()  //咋使用??
      {
      
      }

(52)【ERROR】C# 无法直接启动带有“类库输出类型”的项目
        原因:类库无法直接启动
        解决:解决方案项目-右击-属性-应用程序—输出类型改为Windows应用程序
        
(53)C#转义字符 (调试时会是两个\\,打印出来才会是一个\)
        ①string test = "\\" 等同于 string  test = @ "\"   //输出\
        ②\t
        ③\n  换行

(54)XML的序列化和反序列化(对象不能再网络中进行传输,XML可以作为对象信息的载体在网络中传输)    
        Deserialize方法将XML字符串转换为指定类型的对象;(反序列化)----XML拆分
        Serialize方法则将对象转换为XML字符串。(序列化)----生成XML
        序列化示例:
        class Program
        {
            static void Main(string[] args)
            {
                int i = 10;
                //声明Xml序列化对象实例serializer
                XmlSerializer serializer = new XmlSerializer(typeof(int));
                //执行序列化并将序列化结果输出到控制台
                serializer.Serialize(Console.Out, i);
                Console.Read();
            }
        }

        反序列化示例:
        static void Main(string[] args)
        {
            using (StringReader rdr = new StringReader(@"<?xml version=""1.0"" encoding=""gb2312""?>
        <int>10</int>"))
            {
                //声明序列化对象实例serializer 
                XmlSerializer serializer = new XmlSerializer(typeof(int));
                //反序列化,并将反序列化结果值赋给变量i
                int i = (int)serializer.Deserialize(rdr);
                //输出反序列化结果
                Console.WriteLine("i = " + i);
                Console.Read();
            }
        }
(55)Tuply元组:包含不同数据类型的数据结构。用于需要数据结构来保存具有属性的对象,但又不想单独为其建立单独类型的情况。
    语法:Tuply<T1,T2,T3,T4,T5,T6,T7,TRest>  //最多可以访问8个T
    示例:Tuply<int,string,double> penson = new Tuply<int,string,double>(1,"name",1.23)


(56)C#程序优化的50种方案:
    一、用属性代替可访问的字段
    二、readonly(运行时常量)和const(编译时常量)
    三、is与as
    四、ConditionalAttribute代替#if #endif条件编译
    五、提供ToString()方法
    六、值和引用类型的区别
    九、相等判断的多种表示关系
    十一、优先使用foreach循环语句
    十五、利用using和try/finally语句来清理资源
    十七、尽量减少装箱和拆箱
    十九、定义并实现接口优于继承类型
    二十一、使用委托表达回调
    二十二、使用事件定义外部接口
    二十三、避免返回内部类对象的引用
    二十八、避免强制转换操作符
    三十五、重写优于事件处理器
    四十一、DataSet优于自定义结构

(57)GridView.RowCount与DataTable.Rows.Count的区别:
    获取网格部件记录的条数:GridView.RowCount
    获取网格部件数据的行数:DataTable.Rows.Count
    
(58)在C#中加载XML文件路径
    XDocument document = XDocument.Load(@"\service\AppValues.xml");
    
(59)winfrom 只允许运行一个程序
     Application.EnableVisualStyles();
     Application.SetCompatibleTextRenderingDefault(false);
 
     bool createdNew;//返回是否赋予了使用线程的互斥体初始所属权
     System.Threading.Mutex instance = new System.Threading.Mutex(true, "MutexName", out createdNew); //同步基元变量
     if (createdNew) //赋予了线程初始所属权,也就是首次使用互斥体
     {
         Application.Run(new MainFrm());
         instance.ReleaseMutex();
     }
     else
     {
     }
     
(60)Replace(A , B) //A替换为B
    
(61)winform 缩放自适应
    1. 首先在窗体上放上一个Panel容器,并将容器的Dock属性设为Fill,即所有的控件都放在了这个容器里。
  2. 设置缩放窗体时需要用到的变量

(62)C# 获取文件的创建时间、访问时间、修改时间
    // 文件
    string path = "D:\\test\\001.txt";
 
    FileInfo fileInfo = new FileInfo(path);
 
    // 获取或设置文件或文件夹的创建日期
    DateTime createionTime = fileInfo.CreationTime;
 
    // 获取或设置最后一次访问文件或文件夹的时间
    DateTime lastAccessTime = fileInfo.LastAccessTime;
 
    // 获取或设置最后一次修改文件夹或文件夹的时间
    DateTime lastWriteTime = fileInfo.LastWriteTime;

(63)C# 当前时间加、减指定时间(加为正,减为负)
    DateTime dt = DateTime.Now;
    dt = dt.AddHours(-5);  //5小时前
    dt = dt.AddMinutes(-5);//5分钟前
    dt = dt.AddSeconds(-5);  //5秒钟前
    dt = dt.AddDays(-5);  //5天前
    

(64)insert into tableA(column1,column2,column3) values("1","2","3");
    //tableA表存在:
      insert into tableA(column1,column2,column3)
      select column1,column2,column3
      from tableB ;
    //tableA表不真实存在:
      select column1,column2,column3
      into tableA 
      from tableB ;
      
      update tableA set(column1 = '1',column2 = '2',column3 = '3');

(65)oracle 分组查询最新的数据:
    SELECT * FROM  (select cc.carrier_id,cc.carrier_name,cc.location,cc.high_thres_hold,cc.safety_thres_hold,cc.low_thres_hold,cc.latest_data,cc.qty,
cc.comments,cc.user_name,cc.carrier_family_key,cc.trx_date,MAX(cc.trx_date) over(partition by cc.carrier_id) 
 as  atime from MBDM_CARRIER_CHECK cc) x where carrier_family_key = '{0}' and trx_date = atime
(66)C#中Regex.Replace 方法的使用
    public static string Replace(string input,string pattern,string replacement,RegexOptions options);
    //input  要搜索匹配項的字符串
    //pattern  要匹配的正則表達式的模式
    //replacement 要替换的字符串
    //options  枚举的一个按位组合,这些枚举值提供匹配选项
    item.value = Regex.Replace(value,"[[]]","_") //查找value中带有[]的,把[]替换为_
(67)var的特点:在编译时会根据初始值判断出其类型;只能作为局部变量定义在方法中,不能作为全局变量放在类中;定义时必须初始化赋值,初始化后不能再给变量赋不同的值;
(68)打开winform格式出现错误:Error HRESULT E_FAIL has been returned from a call to a COM component.
    1.重启VS
    2.重建项目
(69)ref 参数:变量作为参数传给方法,同时希望在方法执行完成后,对参数所做的修改能够反映到变量上
(70)SQL函数 timestampdiff
    一个标量日期/时间函数,它返回指定日期部分的两个时间戳之间差异的整数计算。
    TIMESTAMPDIFF(interval-type,startdate,enddate)
    //interval-type 表示时间日期间隔类型
    //startdate 时间戳值表达式
    //enddate 将与startdate进行比较的时间戳值表达式
    TIMESTAMPDIFF(4,CHAR(CURRENT TIMESTAMP - (TIMESTAMP(RPT_DATE, RPT_TIME))))//保留4位,即00:00
(71)SQL查询字段大于指定长度的数据: select * from user t where length(t.sfhm)>18
(72)SQL decimal(10,6),表示数值中共有10位数,其中整数占4位,小数占6位
(72)1.SQL中的cast()函数使用方法
    语法:CAST (expression AS data_type)
    expression:任何有效的SQServer表达式。
    AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
    data_type:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。
    2.Oracle trunc 函数用法详解:
        语法:trunc(number,[decimals])
        number:指需要截取的数字,
        [decimals]:截取位数,可选参数,如果参数是负数表示从小数点左边截取。注意这里的截取都不做四舍五入。直接舍掉
    3.复合键:
    主键(primary key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。
    所谓的复合主键 就是指你表的主键含有一个以上的字段组成。
    如果表里没有可以当唯一主键,可以使用复合主键,确定一条记录的唯一性。
    4.向数据库添加日期格式数据:insert into student(sno,sname,birthdate) values (009,'Car',to_date('2022-11-18,'yyyy-MM-dd'));
    5.SQL之case when then end用法:CASE WHEN条件表达式函数:类似JAVA中的IF ELSE语句。
        例如:
        SELECT
        CASE
            WHEN
                share_id = #{userId}
                THEN
                share_name
                ELSE
                share_by_name
            END AS 'shareName'
        FROM
            calendar_share
        WHERE
            calendar_id = #{id},
            is_shared ='0',
            AND (share_id = #{userId} OR share_by_id = #{userId});

(73)1.SQL查询某几个字段值一样,某一字段值不一样的数据:
    select t1.* from tableName t1,
    (select A,B from tableName group by A,B having COUNT(id)>1) t2 
    where t2.A=t1.A and t2.B=t1.B
    2.SQL查找出A表存在B表不存在的a字段的记录:
    select *
    from test_find_a t1
    left join test_find_b t2
    on t1.a = t2.a
    where t1.b <> t2.b
(74)C#中CompareTo()语法的用法:
    CompareTo 这是字符串比较的函数,用法:
    string s1 = “c”;
    string s2 = “b”;
    if(s1.CompareTo(s2)==1)
    {
    }    
    它有三个返回值~:
    当s1>s2时,s1.CompareTo(s2)==1
    当s1=s2时,s1.CompareTo(s2)0
    当s1<s2时,s1.CompareTo(s2)-1
(75)c#字典嵌套字典Dictionary<string, Dictionary<string, string>>
    Dictionary<string, Dictionary<string, string>> a = new Dictionary<string, Dictionary<string, string>>();
            a.Add("大键", new Dictionary<string, string>());//给字典添加一个键值对,大键和值
            a["大键"].Add("小键","小键值");//a[]就是大字典的值,此值就是一个小字典,给内层小字典赋值
            Console.WriteLine(a["大键"]["小键"]);//意思是先a["大键"]得到外部大字典的值--此值就是内部小字典,然后小字典["小键"]通过键得到里面的值
(76)查询最近一个月的数据
    SELECT * FROM 表名
    WHERE 日期列 between to_char(sysdate-30,'yyyy-mm-dd hh24:mi:ss') and to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')

(77)oracle 根据partition、索引查询数据,提高查询效率
    解析:其中根据PROCESS_START_TIME划分时间段分区条件,TIME_STAMP 为索引字段
SELECT EQP_ID,COUNT(*) FROM D_EDC_DATA_EXTEND
WHERE PROCESS_START_TIME BETWEEN TO_CHAR(SYSDATE - 4,'YYYY-MM-DD HH24:MI:SS')  AND TO_CHAR(SYSDATE - 3,'YYYY-MM-DD HH24:MI:SS')
AND TIME_STAMP BETWEEN SYSDATE - 4 AND SYSDATE - 3
AND EQP_ID NOT IN ('1CDSX000','1CDAX000','1UPWX000','1EXHX000','1TMTX000','1DIWX000','1H2WX000')
GROUP BY EQP_ID
(78)TO_CHAR(日期,"转换格式")                          //将日期格式按照指定格式输出,得到字符串,而非date类型
      TO_DATE("时间字符串","转换的时间日期格式")        //将字符串转换为指定的日期时间格式
      TO_TIMESTAMP("时间字符串","转换的时间日期格式")   //将字符串转换为时间戳格式
      
      "yyyy-MM-dd-HH-mm-ss"  //24小时制
      "yyyy-MM-dd-hh-mm-ss"  //12小时制
      "yyyy-MM-dd"  //
      "yyyy-mm-dd"
      常见于解决 ORA-01843 月份无效 错误:由于当前会话的语言环境与你进行数据操作的SQL语句中DATE型字段的显示格式不匹配。
(79)PL/SQL 常见用法
    *1.定义一个新的存储过程:
    CREATE OR REPLACE PROCEDURE 存储名 AUTHID CURRENT_USER
    BEGIN
    IS
        ****定义变量****
        BEGIN
        ****执行动作****
        END;
    END;
    *2.定义变量:
    v_sql VARCHAR2(2000);
    v_num number;
    v_date date;
    *3.变量赋值:
    v_sql := 'select * from dataTable where EQP_ID = '1PHL0120' and date between '''||v_date||''' and  '''||v_date2||'''';
    *4.打印变量:
    dbms_output.put_line(v_sql);
    *5.异常捕获:
    BEGIN
    EXCEPTION
        WHEN OTHERS THEN
        ......
    END;
    *6.循环(游标):
    TYPE curtype IS REF CURSOR;  //定义游标
    l_cursor curtype;
    TYPE dataTable IS TABLE OF SYS.DATATABLE%ROWTYPE;  //使dataTable的表结构和SYS.DATATABLE表一致,SYS.DATATABLE 为DB中现有table
    l_dataTable dataTable;
    open l_cursor for v_sql;  //打开游标
    LOOP
        FETCH l_cursor BULK COLLECT INTO l_dataTable; //把游标里的数据into到新table
        FORALL i in 1..l_dataTable.COUNT  //循环新table,从1开始
            .......
        EXIT WHEN l_cursor%NOTFOUND;  //当游标没有数据时结束循环
    END LOOP;
    CLOSE l_cursor;  //关闭游标
    *7.plsqldev debug :右击procedure -> 选择Test -> 点击 Start debugger -> 再点击Step into一步步调试下去

(80)找出Oracle中两表数据不同之处
    方法一:MINUS ( SELECT column1, column2, column3 FROM table1 MINUS SELECT column1, column2, column3 FROM table2;)
    方法二:EXCEPT (SELECT column1, column2, column3 FROM table1 EXCEPT SELECT column1, column2, column3 FROM table2;)
    方法三:使用left join table2和where table2.column1 IS NULL
    方法四:使用Oracle Data Compare工具
(81)Oracle知识点之Delete与Truncate的区别
    1)Truncate 是DDL 语句,DELETE 是DML语句。
    
    2)Truncate 的速度远快于DELETE。当执行DELETE操作时所有表数据先被COPY到回滚表空间,数据量不同花费时间长短不一。而TRUNCATE 是直接删除数据,不进回滚表空间。
    
    3)delete 数据可以运行Rollback 进行数据回滚。而Truncate 则是永久删除,不能回滚。
    
    4) Truncate 操作不会触发表上的delete触发器,而delete 会正常触发。
    
    5) Truncate 语句不能带 where 条件,意味着只能进行全部数据删除,而DELETE可带 where 条件进行局部删除数据。
    
    6)Truncate 操作会重置表的高水位线(High Water Mark),而delete 不会。
    
    7)DELETE可以操作视图,TRUNCATE不能操作视图。
(82)Oracle 数据库的类型转换
    Oracle 数据库的类型转换方法主要有: TO_CHAR()函数、TO_NUMBER()函数、TO_DATE()函数以及CAST()函数。
    
    (一)TO_CHAR()函数
    
    TO_CHAR()函数用于将其他数据类型转为 VARCHAR2 格式,它主要由两部分组成:
    
    (1)要转换的值:例如,数字、日期类型以及文本;
    
    (2)格式字符串:格式化输出的格式,例如 yy、yyyy、dd、hh24、mi等,这些格式可由用户自定义。
    
    代码示例:
    
    select to_char(systimestamp,’YYYY-MM-DD HH24:MI:SS’) from dual;
    
    –将系统时间转换为格式为 YYYY-MM-DD HH24:MI:SS 的字符串
    
    (二)TO_NUMBER()函数
    
    这个函数可以将字符型数据、日期类型数据转换为 number 类型,但必须满足以下要求:
    
    (1)要转换的值必须是字符串或者是有效的日期格式;
    
    (2)要转换的值必须能正确地表达一种数字形式;
    
    (3)给定的格式必须与要转换的值匹配;
    
    代码示例:
    
    select to_number(‘122.67′,’999.99’) from dual;
    
    –将字符串122.67转换为以999.99格式显示的数字
    
    (三)TO_DATE()函数
    
    这个函数用于将字符串或者数字类型转换成 DATE 格式,要求格式与字符串匹配,否则会报错。
    
    代码示例:
    
    select to_date(’04-APR-2019′,’DD-MON-YYYY’) from dual;
    
    –将字符穿04-APR-2019转换为以DD-MON-YYYY格式显示的日期
    
    (四)CAST()函数
    
    CAST()函数用于将一种数据类型的值转换为不同的数据类型,但它与 TO_* 系列的函数的用法有所不同,它需要使用 AS 关键字将之前的类型和将要转换的类型区分开来。
    
    代码示例:
    
    select cast(‘123’ as number) from dual;
    
    –将字符串123转换为数字变量
    
    总之,Oracle 数据库为转换不同类型数据提供了 TO_CHAR()、TO_NUMBER()、TO_DATE() 和 CAST() 等函数,这些函数可以帮助开发者将不同类型之间的值转换,同时使代码更简洁,易于理解,从而提高执行效率。

(83)oracle SQL 去掉空格
    Update table_name set xm=replace(xm , ' ') ;

(84)在db2中varchar和character有何区别:
    character  其实就是 char ,
    1. 最大长度不同
        char  最大254 bytes,而 varchar  最大 32672 bytes
    2. 存储不同
    char (n)  在数据库占用 n 个字节,在数据库中以空格补足,但在取出来时末尾的空格将被去掉
    varchar (n) 在数据库中至少占用1个字节,在数据库中末尾的空格将自动去掉,实际占用录入数据长度 +1 或者 +2 字节。 
    一般使用varchar,取出的数据没有空格
 

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值