博客堂近期活动安排

根据上次博客堂腐败大典的精神,博客堂准备印制一批文化衫,现在就此问题,与广大博客堂的热心读者及作者进行讨论。

1)价格

本次博客堂T恤衫我们可能委托李争同志(MVP&MCT,Beijing)来全权代理。根据他为VCHelper印制T恤衫的经验,制版费应该是¥50元左右,而每个的成本价是¥17元左右。为了便于收款,我们决定把定价定在¥20元左右,多余的钱将作为制版费及腐败费上,由李争代为管理。当然,如果有其它公司及团体愿意赞助,我们也可以免费发放此T恤。

2)款式

款式现在正在征集中,基本上主体应该是白色圆领T恤,将会印上博客堂的Logo以及网址,并且印有“Enjoy coding”的口号,希望哪位热心读者能够帮助我们热心制版。或者把您们的想法告诉我们。

3)范围

所有中国大陆的博客堂的读者及作者均可以购买博客堂的文化衫,可能需要付一定的邮费,如果您有意购买,请先在评论中把您的意向告诉我们,以便我们能够按需定制。也希望大家转告所有博客堂爱好者。

4)后续活动

博客堂将与业内的杂志社共同推出一期博客堂专刊,希望各位博客堂的作者能够多写出一些文章来,以便我们与杂志社联系。

DataReader.IsClosed属性

在CSDN论坛上看到下列问题,如果把DataReader当作DataGrid的DataSource,在DataGrid.DataBind()之后,在下列两种情形下,DataReader的IsClosed的值是不同的

1.
IDataReader reader = SomeDBCommand.ExecuteReader();
DataGrid1.DataSource = reader;
DataGrid1.DataBind();

在这里,reader的IsClosed的值是false

2.
IDataReader reader = SomeDBCommand.ExecuteReader(CommandBehavior.CloseConnection);
DataGrid1.DataSource = reader;
DataGrid1.DataBind();

在这里,reader的IsClosed的值是true

结论是,如果DataReader的CommandBehavior是CloseConnection的话,DataGrid1.DataBind()在某种(也许是非直接的)方式下,调用了DataReader的Close方法。在网上找到了一个类似的讨论,但他们没有给出原因。

把DataReader作为DataGrid的DataSource时,DataReader是当作IEnumerable来看待的,从IEnumerable可以获取IEnumerator,然后可以用它的MoveNext/Current来依次获取每个记录,难道MoveNext调用了DataReader的Close方法?做了个试验

using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Collections;

class TestClose
{
  static void Main()
  {
 SqlConnection conn = new SqlConnection(“server=localhost;database=pubs;uid=sa;pwd=;”);
 SqlCommand cmd = new SqlCommand(“select * from authors”, conn);

 conn.Open();
 SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
 TestRead(reader);
 reader.Close();

 conn.Open();
 reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
 TestMoveNext(reader);
 reader.Close();

   }

  static void TestRead(IDataReader reader)
  {
 while (reader.Read());
 Console.WriteLine(“after Read(), reader is closed? {0}”, reader.IsClosed);
  }

  static void TestMoveNext(IDataReader reader)
  {
 IEnumerator e = ((IEnumerable)reader).GetEnumerator();
 while (e.MoveNext());
 Console.WriteLine(“after MoveNext(), reader is closed?{0}”, reader.IsClosed);
  }

}

输出是
after Read(), reader is closed? False
after MoveNext(), reader is closed? True

果不其然啊,用Lutz Roeder的Reflector(大力推荐!)工具看了一下.NET里SqlDataReader的实现

IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
      return new DbEnumerator(this, (CommandBehavior.Default != (CommandBehavior.CloseConnection & this._behavior)));
}
 

可见SqlDataReader的CommandBehavior确实是传进去的,再看DbEnumerator的实现

public DbEnumerator(IDataReader reader, bool closeReader)
{
      if (reader == null)
      {
            throw ADP.ArgumentNull(“reader”);
      }
      this._reader = reader;
      this.closeReader = closeReader;
}

 

public bool MoveNext()
{
      object[] objArray1;
      if (this._schemaInfo == null)
      {
            this.BuildSchemaInfo();
      }
      this._current = null;
      if (this._reader.Read())
      {
            objArray1 = new object[this._schemaInfo.Length];
            this._reader.GetValues(objArray1);
            this._current = new DbDataRecord(this._schemaInfo, objArray1, this._descriptors, this._fieldNameLookup);
            return true;
      }
      if (this.closeReader)
      {
            this._reader.Close();
      }
      return false;
}

果然, 如果DataReader的CommandBehavior是CommandBehavior.CloseConnection的话,MoveNext调用了Close方法!

忘记 ADSL 连接密码,怎么办?

从 eCompanyStore 拿到 Wireless Base Station 后,开始更改机器上 ADSL  的拨号方式,在设置 Base Station 的时候却突然发现网通给的那个包含用户名和密码的“机密函件”丢失了,在网络连接里的 ADSL 是自动连接,是可以成功连接的,但连接对话框里只能看到用户名,看不到密码。

网通客服10060 的人说, ADSL忘记密码,只能带着身份证、最近一月的清单等去网通的营业厅重设密码  …… 晕,本来我的 ADSL 就是包月,密码应该不会象计时使用的用户密码那样敏感,应该可以通过其它手段解决的吧,这折腾一趟,成本也不少,唉,服务部门应该多替用户考虑一下,别动不动就是中国特色的“带着身份证,户口本,登记单 … 去某某某地办理” ,真有那个必要吗?成本太不对称了 …

“网通宽带“(宽带?)论坛里人也都没什么好办法,说只能去营业厅了。

坚信密码既然还在系统中,就应该能找得回来!

费了点时间,终于找到一个还不错的工具:Password Recovery Toolbox ,可以显示 Internet Explorer 记录的站点密码、用户密码、表单域信息等,Outlook Express 帐户密码,网络连接(如 ADSL或 Modem)密码等,如图所示:

 

不过,如果这个工具被非法使用,也有点恐怖的,后两个功能自不用说,就显示 IE 的用户密码和表单域信息这个功能来说,基本上可以查出用户在网上的很多活动信息,如各个网站的登录凭据(Gmail 的也在其中,汗~~),在 Search Engine 的 Search 过的 Keyword List ,在一些网站的个人注册信息等。

谨慎使用吧。

我的第一个Mono习作

虽然自己装了一个Redhat 9.0的虚机,可是安装Mono那些繁琐的步骤还是把我吓怕了,最终我的虚机上只装了一个金山的WPS For linux,测试了一把文字功能就删掉了。

还好,卢彦已经安装好了Mono正式版的Redhat,而且还很nice的给我开放了telnet权限,虽然速度不是非常理想,但远程编程还是不错,于是我使用telnet上去编了自己第一个mono作品:Hello World。

由于是telnet,暂时还无法使用X系统,所以测试Windows form的工作看来还得放一下,而Web Form现在看来还没有问题,卢彦与我还想把Duwamish等示例程序移植到mono上,不知道是否有版权问题?