KeyFansClub

首页 » - 特色讨论区 - » 键社茶餐厅 » 这个BUG让我找了3天
I_Shinji - 2009/10/21 3:15:00
public datetime UserLastOnline(string UID, string CustomerID)
{
  datetime ret;
  IDbConnection con = null;
  try
  {
  con = new SqlConnection();
  con.ConnectionString = InstantIssue_Utility.DecryptConnectionString(connectionString);
  con.Open();
  IDbCommand cmd = con.CreateCommand();
  cmd.Connection = con;
  string sql_command = "select LastActivityTimeStamp from UserToken where UserId1 = '" + UID + "' and Status = 'A'";
  IDbCommand com = con.CreateCommand();
  com.CommandType = CommandType.Text;
  com.CommandText = sql_command;
  IDataReader reader = com.ExecuteReader();
  while (reader.Read())
  {
   
    ret = Convert.ToDateTime(reader[0]);
  }
  reader.Close();
  com.Cancel(); 
  reader.Close();
  com.Cancel();
  return ret;
  }
  catch (InstantIssue_Exception)
  { }
 
 
  con.Close();
     
}

竟然漏连接了>_<
我太年轻了
水羊 - 2009/10/21 3:35:00
怎麼.......
C語言沒有那尋找除錯鍵的按鈕嗎........
還是........LZ其實寫了一大串,這只是其中一小片!?  囧
另外,找錯辛苦+默哀你的懷具
I_Shinji - 2009/10/21 3:40:00
没有错误,  但是IIS不停死机, SQL连接爆满.
Prz - 2009/10/21 6:43:00
呵呵, 没有try ... finally是C++的语法大缺点之一啊。
Prz - 2009/10/21 6:47:00
不过,好像M$有非标准的__try ... __finally扩展,LZ可以用用。
只要运行进入了__try,那么__finally段的内容,不论如何都会运行。
maxiem - 2009/10/21 8:22:00
pascal,F7各种TRACE和Trace Into……
完毕……
C语言无研究。
li5jun1 - 2009/10/21 8:24:00
看着眼熟而已的人路过……
高手不少啊
I_Shinji - 2009/10/21 9:36:00
原帖由 Prz 于 2009-10-21 6:47:00 发表
不过,好像M$有非标准的__try ... __finally扩展,LZ可以用用。
只要运行进入了__try,那么__finally段的内容,不论如何都会运行。


Orz, 最后直接把return移到con.close下面了事。
wdx04 - 2009/10/21 9:58:00
C++标准建议用函数对象,在对象析构时释放资源,比finally更高效。
另外,M$的Managed C++是有finally的(try-catch-__finally),不过这段代码似乎是C#?
I_Shinji - 2009/10/21 10:26:00
原帖由 wdx04 于 2009-10-21 9:58:00 发表
C++标准建议用函数对象,在对象析构时释放资源,比finally更高效。
另外,M$的Managed C++是有finally的(try-catch-__finally),不过这段代码似乎是C#?


恩,是C#  所以可以用finally.  不过当时写这段东西的时候脑抽了下。  就成了这么个大毒瘤了。  虽然,后来我也还是没有用finally,  直接把return移下来。  Orz
Prz - 2009/10/21 11:28:00
呵呵,C#啊,怪不得看起来很亲切... 和Delphi有血缘关系嘛... :D

恩,Finally段的执行效率确实不好,不知道随着编译器的发展能不能得到改善,毕竟用起来很友善... >_<

-------
另外,还是建议LZ用finally把那几个Close放进去,不然万一发生了那个被Catch然后忽略掉的异常,又会有东西漏了... XD
I_Shinji - 2009/10/21 11:43:00
恩,感谢提醒.  Orz
明天要改很多东西了。:miffy12:
kaiz - 2009/10/21 12:51:00
C#?我还以为是Java呢,嘛,反正看起来用起来都差不多的样子=_=b

咱可是痛恨finally,原因就在于过去写Java转C的转换工具时finally无法解决,但是Java程序员太喜欢用finally处理异常,C/C++实在要用类似功能的话可以考虑一下goto,但还是很恶心啊~~~
Bce - 2009/10/22 11:30:00
你这个情况编译器应该提示检测到无法访问的代码才对.....

好吧,我的项目强制全部使用强类型DS,严禁出现拼接字符串甚至new cmd这样的东东出现.....

你这样做小心SQL注入哦..........就算要用拼接cmd至少也要做成参数吧?

而且为啥不单独上一个conn类........

可以吐的地方太多了....反而不知道从何开始........

不上单独conn类至少也要上using保证即时销毁吧..........

只取单独一个用不着上Reader吧.....一个 DateTime?  + ExecuteScalar 应该就能搞定.........

项目没有分层么?至少把DataAccess单独摘出来排错的时候也方便一点.......
xish - 2009/10/22 12:12:00
这段好像是C#代码吧?
漏关连接的代价是巨大的……
粘土火星 - 2009/10/22 12:15:00
楼主,既然用try,那么请继续用using语句,这样几乎可以完全避免资源释放类问题

PS:突然发现bce君把可吐的地方都吐得差不多了w
Bce - 2009/10/23 8:00:00
唔。。。。。。。。好吧,我承认最近看招聘来人员的机试作业太多了。。。。。。。。。

结果面机试了一堆大学生,一个合适的都没有。。。。悲剧阿
ypf - 2009/10/23 8:16:00
完全看不懂写的是什么····:onion6:
I_Shinji - 2009/10/23 12:47:00
Orz,  VS没有报检测到无法访问的代码。
我其实没有学过应该如何在VS下用SQL, 甚至连C#都没有学过, 全部是自己现学,一边翻着书一边乱写出来的。  Orz
粘土火星 - 2009/10/23 15:03:00
原帖由 I_Shinji 于 2009-10-23 12:47:00 发表
Orz,  VS没有报检测到无法访问的代码。
我其实没有学过应该如何在VS下用SQL, 甚至连C#都没有学过, 全部是自己现学,一边翻着书一边乱写出来的。  Orz 


感觉有点悲剧,或者你可能看错了书。。。。orz



没检测其实是正常的,return放在try或者catch里面都不会报错,放在finally才会出问题

不过我的习惯从来都是把return放在异常处理外面
Bce - 2009/10/23 15:52:00
原帖由 粘土火星 于 2009-10-23 15:03:00 发表
原帖由 I_Shinji 于 2009-10-23 12:47:00 发表
Orz,  VS没有报检测到无法访问的代码。
我其实没有学过应该如何在VS下用SQL, 甚至连C#都没有学过, 全部是自己现学,一边翻着书一边乱写出来的。  Orz 


感觉有点悲剧,或者你可能看错了书。。。。orz

没检测其实是正常的,return放




恩,可以理解,看书看多了没有跟大型项目的经验实际做起来总是会出这样那样的问题。。。。

就本例来说。。。。不知道你为虾米做了错误拦截却没有作处理。。。。我猜你是想避免没有数据可以读取时的问题?

标准化的做法是。。。错误处理的原则大致有以下几个:1.可以预知的逻辑问题不要用try来处理,尽量做完整的逻辑分支判断;2.如果可能会发生了不可预知错误(如连接问题,应该将异常弹出到上一级进行处理,如本例中可能会出现取不到数据这样的应该通过正确的判断来解决如把返回值改成DateTime?然后再判断是否为null来确定有没有数据。。。。

使用try catch来避过正常的逻辑判断坏处可是多多地。。。。
1
查看完整版本: 这个BUG让我找了3天