一些琐碎的知识
2014-03-10 11:56
225 查看
一、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 <==> 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 不冲突
具体小例子:
二、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 <==> 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
相关文章推荐
- struts的一些琐碎知识(一)
- 开发Android,记录一些琐碎的知识
- Java中一些琐碎的知识和访问权限
- ubuntu 一些琐碎知识
- 关于css 的一些琐碎知识
- struts的一些琐碎知识(二)
- c9一些琐碎的运算符知识
- 一些琐碎的理解
- Python基础1:一些小知识汇总
- 虚拟化的一些基本知识
- 一些关于UI方面的知识
- 【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类
- 关于程序存储的一些基本知识
- python琐碎的知识积累,闭包
- 【C#小知识】C#中一些易混淆概念总结(五)---------继承
- iOS中线程以及GET和POST请求的一些知识
- nfs的一些小知识
- Unity与安卓开发的一些路径知识
- 一些容易忽略的小知识
- 取得CakePHP的一些知识