数据库操作杂谈

将SqlCommand的参数集合做成static对象会遭遇什么问题?
在一次项目中,要执行几千次Insert操作,每次调用同一个存储过程,因此需要的参数集合是相同的,只是这些参数的值随每次插入操作而改变,于是,我就想把它们做成静态变量,省的每次Insert都生成一堆的参数集合,然后用过又扔掉了。下面我分2个方面来阐述遇到的问题。

(1)这些参数仅仅被Insert操作所使用
插入第一条记录,正常;插入第二条记录时,就遭遇到这样一个异常:
System.ArgumentException: 另一个 SqlParameterCollection 中已包含 SqlParameter。
我的Insert代码中每一次执行都是新生成一个SqlCommand,然后把这些静态参数加进去,莫非是这个SqlCommand对象还没有被GC来得及回收?于是我在退出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语句:
sql_count  =  string.Format(" SELECT   COUNT ( * FROM  IPSPSD_YF.SDXJ_BUGPHRASE b
 
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: 括号内的字符串没有正确结束

转载于:https://www.cnblogs.com/Peter-Yung/archive/2007/07/07/809672.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值