一些琐碎的知识

一、VS2008如何生成支持多国语言的资源文件,选中web的Design状态,此时Tools中会出现Generate Local Resource选项,点击即可生成国际化资源文件


二、ORA-01403: 未找到数据。 错误原因:如果select结果为空,执行select ..into..时会报异常,所以先获取个数,判断一下

三、Webservice中的out型参数有时会被转换成以返回值的形式返回,具体以调用时的为主。

四、下面的几句话是转载的,忘了原作者了。。。。

(转)

最近有个窗体要用ComboBox控件,发现在捕获SelectedIndexChanged事件时总是有一些问题。趁周末测试了一下,现总结如下:
1、任何时候,SelectedIndex变化都触发SelectedIndexChanged事件。
2.1、重新生成列表(先清空再添加)时:ComboBox显示空,但SelectedIndex保持不变。
2.2、重新绑定列表(ResetBinding)时:ComboBox会努力保持SelectedIndex不变;当SelectedIndex小于等于新列表的最大下标时,CombBox会显示新列表相应位置的项;但当SelectedIndex大于列表的最大下标时,ComboBox会先将SelectedIndex置为新列表的最大下标,然后再重新绑定列表,ComboBox显示新列表中新SelectedIndex处的值。但千万不要以在这种情况下,SelectedIndexChanged中就能获得与界面一致的值,因为ComboBox在绑定新列表之前重置SelectedIndex的值,因此,你在SelectedIndexChanged中获得的只是旧列表的值。
3、在初次将列表绑定到数据源时:ComboBox会显示列表中第一个选项,但SelectedIndex仍然是-1。

由于SelectedIndex的以上特性,若ComboBox使用绑定列表并且列表会变化,则在使用SelectedIndexChanged事件实时将ComboBox的显示项映射到内部数据时,必须加以小心。否则将极有可能内部数据与界面显示数据不一致。
我还尝试过使用SelectedValueChanged事件来代替SelectedIndexChanged事件,但是发现SelectedValueChanged事件与SelectedIndexChanged的唯一区别在于:当使用ComboBox列表绑定,用户尚未进行过选择操作时,SelectedValueChanged会在ComboBox的显示值变化时被触发。只要用户执行过选择操作,该事件就再也不会被触发。猜测SelectedValueChanged应该只在SelectedIndex为-1的时候才有可能被触发。
最终,我还是只好老老实实的用SelectedIndexChanged。为避免出现问题,建议:若要对ComboBox的列表使用绑定,则在初次绑定和重新绑定后,重置SelectedIndex为-1,然后将其置为一个默认值,或尝试将SelectedItem置为旧列表中的选中项。测试证明SelectedItem设置成功时并且该项在新旧列表中位置不同时,SelectedIndexChanged会被触发。

注:2.1,2.2均指列表改变时的特征,2.2为使用数据绑定列表时的情况。

针对这个问题,采用的解决办法是先设置displaymember和valuemember,然后再绑定数据


五、(转)二维数组定义以及动态分配空间
 下面三种定义形式怎么理解?怎么动态分配空间?
(1)、int **Ptr;
(2)、int *Ptr[ 5 ]; 我更喜欢写成 int* Prt[5];
(3)、int ( *Ptr )[ 5 ];
此文引自网上,出处不详,但是觉得非常好。略改了一点。


多维数组一向很难,一般都采用一维数组,但是一旦要用到还真是头疼。
闲话少说,这里我就以三个二维数组的比较来展开讨论:
     (1)、int **Ptr;
    (2)、int *Ptr[ 5 ]; 我更喜欢写成 int* Prt[5];
     (3)、int ( *Ptr )[ 5 ];
     以上三例都是整数的二维数组,都可以用形如 Ptr[ 1 ][ 1 ] 的
方式访问其内容;但它们的差别却是很大的。下面我从四个方面对它们
进行讨论:
     一、内容:
        它们本身都是指针,它们的最终内容都是整数。注意我这里说
的是最终内容,而不是中间内容,比如你写 Ptr[ 0 ],对于三者来说,
其内容都是一个整数指针,即 int *;Ptr[ 1 ][ 1   ] 这样的形式才
是其最终内容。
     二、意义:
        (1)、int **Ptr 表示指向"一群"指向整数的指针的指针。
        (2)、int *Ptr[ 5 ] 表示指向 5 个指向整数的指针的指针,或者说Ptr有5个指向"一群"整数的指针,Ptr是这5个指针构成的数组的地址
        (3)、int ( *Ptr )[ 5 ] 表示指向"一群"指向 5 个整数数组的指针的指针。
     三、所占空间:
        (1)、int **Ptr 和 (3)、int ( *Ptr )[ 5 ] 一样,在32位平台里,都是4字节,即一个指针。
        但 (2)、int *Ptr[ 5 ] 不同,它是 5 个指针,它占5 * 4 = 20 个字节的内存空间。
     四、用法:
        (1)、int **Ptr
        因为是指针的指针,需要两次内存分配才能使用其最终内容。首
先,Ptr = ( int ** )new int *[ 5 ];这样分配好了以后,它和(2)的
意义相同了;然后要分别对 5 个指针进行内存分配,例如:
   Ptr[ 0 ] = new int[ 20 ];
   它表示为第 0 个指针分配 20 个整数,分配好以后, Ptr[ 0 ] 为指
向 20 个整数的数组。这时可以使用下标用法 Ptr[ 0 ][ 0 ] 到
Ptr[ 0 ][ 19 ] 了。
       如果没有第一次内存分配,该 Ptr 是个"野"指针,是不能使用
的,如果没有第二次内存分配,则 Ptr[ 0 ] 等也是个"野"指针,也
是不能用的。当然,用它指向某个已经定义的地址则是允许的,那是另外
的用法(类似于"借鸡生蛋"的做法),这里不作讨论(下同)。


例子:


C语言:


//动态分配二维数组空间
{
   m_iHight=10;//二维数组的高度
m_i;//二维数组的宽度
//动态分配一个二维数组m_ppTable内存空间
//其类型为int
   //m_ppTable指向该数组
   int **m_ppTable;
   m_ppTable=new int *[m_iHight];


//动态分配m_iHight个类型为int *的内存空间
//分配的是行地址空间
   for(int i=0;i
            m_ppTable[i]= new int[m_iWidth];


  //动态分配m_iWidth个类型为int的内存空间
//分配的是某行的数值空间
}
//由此分配的二维数组空间并非是连续的
//可以使用m_ppTable[row][col]来给该二维数组赋值
//其中 0<=row
//释放所分配的内存空间
{
    for(int i=0;i
       delete[m_iWidth]m_ppTable[i]; //以行为单位释放数值空间
    delete [m_iHight]m_ppTable;      //释放行地址空间
}


int **a;
a=(int **)calloc(sizeof(int *),n);
for (i=0;i   a[i]=(int *)calloc(sizeof(int),n);
这样就可以了
使用的时候就和普通的二维数组一样
最后用
for(i=0;i   cfree(a[i]);
cfree(a);释放内存
就可以了
       (2)、int *Ptr[ 5 ]
       这样定义的话,编译器已经为它分配了 5 个指针的空间,这相当
于(1)中的第一次内存分配。根据对(1)的讨论可知,显然要对其进行一次
内存分配的。否则就是"野"指针。
       (3)、int ( *Ptr )[ 5 ]
       这种定义我觉得很费解,不是不懂,而是觉得理解起来特别吃力,
也许是我不太习惯这样的定义吧。怎么描述它呢?它的意义是"一群"
指针,每个指针都是指向一个 5 个整数的数组。如果想分配 k 个指针,
这样写: Ptr = ( int ( * )[ 5 ] ) new int[ 5 * k ]。
这是一次性的内存分配。分配好以后,Ptr 指向一片连续的地址空间,
其中 Ptr[ 0 ] 指向第 0 个 5 个整数数组的首地址,Ptr[ 1 ] 指向第
1 个 5 个整数数组的首地址。
    综上所述,我觉得可以这样理解它们:
    int ** Ptr &lt;==> int Ptr[ x ][ y ];
    int *Ptr[ 5 ] <==> int Ptr[ 5 ][ x ];
    int ( *Ptr )[ 5 ] <==> int Ptr[ x ][ 5 ];
    这里 x 和 y 是表示若干的意思。

六、查找约束
select constraint_name,constraint_type
from user_constraints
where table_name='EMP'

七、将字符串转换成日期

update KS set csrq=to_date('1993-2-6','yyyy-MM-dd'),xbdm=1,xm='孙玉玺',sfzhm='410225199302060000' where bmxh='70020103'

八、在ashx文件执行跳转页面时会出现异常,原因大概是因为Dirctect实际上执行了异常中断,具体参考网址:// 关于ashx出现线程终止的原因
http://zxianf.blog.163.com/blog/static/301207012008111663547717/

九、导入导出oracle数据库,通过imp和exp命令

导出数据库的操作:用户名/用户密码@数据库名
exp gkbm/manager@gkbmtest file="e:\gkbmtest201311012231.dmp" log="e:\gkbmtest201311012231.txt" owner=(gkbm)
导入数据的操作:
1、清空原先的Package、Table、Sequence等(建议,清除之前先备份原先的数据库)
在该数据库的sql窗口输入(注意:如果执行语句时出现错误,就手动删除原先的非系统PACKAGE,TABLE,SEQUENCE)
BEGIN 
    FOR rec IN 
    (SELECT object_name,object_type from user_objects 
    WHERE object_type='PROCEDURE' 
    OR object_type='TABLE' 
    OR object_type='VIEW' 
    OR object_type='FUNCTION' 
    OR object_type='PACKAGE' 
    OR object_type='SEQUENCE' 
    ) 
    LOOP 
        IF rec.object_type='TABLE' THEN 
           EXECUTE IMMEDIATE 'DROP '||rec.object_type||' '||rec.object_NAME||' CASCADE CONSTRAINTS'; 
        ELSE 
            EXECUTE IMMEDIATE 'DROP '||rec.object_type||' '||rec.object_NAME; 
        END IF; 
   END LOOP;     
END; 
2、执行导入语句:
imp gkbm/manager@gkbm file="D:\GKBM_BACKUP_2012030510422889.dmp" log="D:\IClog.txt" fromuser=GKBM touser=GKBM  ignore=y
注意,如果此语句导入不正确,不妨尝试一下下面的语句(主要是改变一下用户为sys):
imp 'sys/cust1607@GKBM.10-CLIENT as sysdba' file="c:\gkbm201310051642.dmp" log="c:\gkbm201310051642.txt" fromuser=gkbm touser=gkbm ignore=y

十、oracle将某一列连成一个字符串

关键技术:1,SYS_CONNECT_BY_PATH这个函数是oracle9i才新提出来的!它一定要和connect by子句合用!

第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符!

START WITH 代表你要开始遍历的的节点!

CONNECT BY PRIOR 是标示父子关系的对应!

关键技术2,

语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的每条xlh记录返回一个序号。 
示例: 
xlh           row_num 
1700              1 
1500              2 
1085              3 
710                4

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

注意:over中的order by和from后面的order 不冲突

具体小例子:

select bmxh,trim(max(sys_connect_by_path(zgdm,' '))) zgdm_temp from(
  select bmxh,zgdm,row_number()over(partition by bmxh order by bmxh,zgdm)rn_by_id,
  row_number()over(order by bmxh,zgdm)+bmxh rn from zgjf
  )
  start with rn_by_id = 1 connect by rn-1 = prior rn group by bmxh order by bmxh


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值