在一次项目中,要执行几千次Insert操作,每次调用同一个存储过程,因此需要的参数集合是相同的,只是这些参数的值随每次插入操作而改变,于是,我就想把它们做成静态变量,省的每次Insert都生成一堆的参数集合,然后用过又扔掉了。下面我分2个方面来阐述遇到的问题。
(1)这些参数仅仅被Insert操作所使用
插入第一条记录,正常;插入第二条记录时,就遭遇到这样一个异常:
cmd.Dispose( );
发现仍然有异常。
最后这样被解决掉了:在退出前添加代码:cmd.Parameters.Clear( );
这说明这样一个问题,SqlCommand.Parameters包含了对一些SqlParameter对象的引用,
而这些对象不能同时被不同的Parameters集合引用;同时,释放掉对象SqlCommand也不解决问题,因为该对象相关的其它资源不会被同时释放,而你无法猜测GC何时来收集这些资源,而且这里的Parameters集合无法被显式释放。
(2)这些参数同时被其它操作所引用
假定我们排除(1)中遇到的同时引用的问题(即我每次操作后执行cmd.Parameters.Clear( )),假定我们的静态参数集是个最大的参数集合,即包含了所有操作都需要的参数,而大部分操作可能只需要用到这其中的少数几个,问题就这样来了。
你在操作GetNameById中设置参数@Name的Direction属性为Output,完成你的操作后,多半情况下你会忘记将这个属性还原;于是在Insert操作中报错:@Name并未声明为Output参数,但传递进来的实参请求输出!
嘿嘿,这一情况其实就是面向过程编程中函数内部的静态变量在多线程环境下遭遇到的问题;请避免使用静态参数集!起码,请谨慎使用之,虽然效率的提升是很明显的。
当定义的列的数据类型不足以容纳实际数据的长度时,会发生什么?
今天在访问数据库时遭遇到这样一个异常:
经检查,原来是一个文件的名字长度达到了58个字符,而我定义的最大长度为50,所以被数据库引擎截断了,呵呵,挺有意思的啊;于是只好使用alter table alter column将该列的类型改变下了。
查询数据库中是否存在某个表
SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='table_name'
执行ExcecuteScalar如果返回NULL值
string sql = "SELECT ID FROM XXX_TABLE";
int id = Convert.ToINT32(cmd.ExecuteScalar(sql)); // 发现id=0;
Oracle中的to_date函数的使用方法
详细讲述Oracle中的to_date参数含义
日期格式参数 含义说明
D 一周中的星期几
DAY 天的名字,使用空格填充到9个字符
DD 月中的第几天
DDD 年中的第几天
DY 天的简写名
IW ISO标准的年中的第几周
IYYY ISO标准的四位年份
YYYY 四位年份
YYY,YY,Y 年份的最后三位,两位,一位
HH 小时,按12小时计
HH24 小时,按24小时计
MI 分
SS 秒
MM 月
Mon 月份的简写
Month 月份的全名
W 该月的第几个星期
WW 年中的第几个星期
1.日期时间间隔操作
当前时间减去7分钟的时间
select sysdate,sysdate - interval ’7’ MINUTE from dual
当前时间减去7小时的时间
select sysdate - interval ’7’ hour from dual
当前时间减去7天的时间
select sysdate - interval ’7’ day from dual
当前时间减去7月的时间
select sysdate,sysdate - interval ’7’ month from dual
当前时间减去7年的时间
select sysdate,sysdate - interval ’7’ year from dual
时间间隔乘以一个数字
select sysdate,sysdate - 8 *interval ’2’ hour from dual
2.日期到字符操作
select sysdate,to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-mm-dd hh:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-ddd hh:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-mm iw-d hh:mi:ss’) from dual
参考oracle的相关关文档(ORACLE901DOC/SERVER.901/A90125/SQL_ELEMENTS4.HTM#48515)
3. 字符到日期操作
select to_date(’2003-10-17 21:15:37’,’yyyy-mm-dd hh24:mi:ss’) from dual
具体用法和上面的to_char差不多。
4. trunk/ ROUND函数的使用
select trunc(sysdate ,’YEAR’) from dual
select trunc(sysdate ) from dual
select to_char(trunc(sysdate ,’YYYY’),’YYYY’) from dual
5.oracle有毫秒级的数据类型
--返回当前时间 年月日小时分秒毫秒
select to_char(current_timestamp(5),’DD-MON-YYYY HH24:MI:SSxFF’) from dual;
--返回当前 时间的秒毫秒,可以指定秒后面的精度(最大=9)
select to_char(current_timestamp(9),’MI:SSxFF’) from dual;
6.计算程序运行的时间(ms)
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
查询注册表以获取本机上安装的SQL Server实例
HKEY_LOCAL_MACHINE -> SOFTWARE -> MICROSOFT -> MICROSOFT SQL SERVER -> INSTANCE NAMES -> SQL使用SQLDMO以及sqlcmd -L常无法获取所有实例列表,但查询注册表一定可以
为什么要使用参数?
考虑如下sql语句:
JOIN IPSPSD_YF.SDXJ_CHECKITEM i ON i.ID=b.CHECKITEM_ID
JOIN IPSPSD_YF.SDXJ_CHECKITEMCATEGORY c ON c.ID=i.CHECKITEMCATEGORY_ID
WHERE c.NAME='{0}' AND i.NAME='{1}' AND b.NOTE='{2}'", categoryName, checkitemName, note);
如果串checkitemName="what's going on?";
数据库执行时就会发生错误:
System.Data.OracleClient.OracleException: ORA-01756: 括号内的字符串没有正确结束