2007年1月的存档

  • 31
  • 1月

玩NorthWind的时候发现其中Order Detail表中有两个主键,但每个主键的列中都存在有相同值的行,由此推断:
一个表中有两个主键表示的意思是由这两个主键共同确定一个记录。
没怎么学过数据库,见笑。
18:17 2007-1-31

已查阅数据库方面的书,这好像是数据库里最基础的知识……
21:20 2007-3-8

  • 31
  • 1月

上课老师没讲过这个对象,用到了,自己总结一下。

使用这个对象的前提要已经存在需要进行关联的两个表,就目前情况,也就是要求DataSet对象中要存在两个有关系的表。所以之前会用到SqlConnection、SqlDataAdapter和DataSet。

建立一个DataRelation对象时方法如下:(不使用new操作符)
DataRelation myRelation=myDataSet.Relations.Add(“给它起个名字”,父表中的列,与父表对应的子表中的列)
两个列具有相同内容的行即为有关系的行。

  • 31
  • 1月

今天看到了《C#入门经典》的第24章“数据库和ADO.NET”,由于上学期听过大四的那门.net数据库编程,所以看这部门感觉是颇顺利的,要做的基本上就是逐一验证书上的代码。

不 过刚刚发现一个课上老师没提到过的类:SqlCommandBuilder,而且代码中也有使用,赶紧研究了一下,发现确实是个好东西。有了它在使用 DataAdapter时就不用自己写与SELECT语句对应的那些INSERT、UPDATE、DELETE语句了。只要在声明好一个 DataAdapter对象后,用这个DataAdapter初始化一个SqlCommandBuilder对象就OK,adapter就可以直接 Update()了。
例:
SqlConnection thisConnection = new SqlConnection(@”Data Source=riqe\sqlexpress;Initial Catalog=Northwind;Integrated Security=True”);
SqlDataAdapter thisAdapter = new SqlDataAdapter(“SELECT CustomerID,CompanyName FROM customers”, thisConnection);

SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisAdapter);

DataSet thisDataSet = new DataSet();
thisAdapter.Fill(thisDataSet, “Customers”);

thisDataSet.Tables[“Customers”].Rows[9][1] = “Acme, Inc.”;

thisAdapter.Update(thisDataSet, “Customers”);
thisConnection.Close();

如果没有定义那个SqlCommandBuilder的话,可是要自己设定DataAdapter的UpdateCommand属性,可是很麻烦的。

  • 31
  • 1月

Q1:在类中重写Equal方法,类的静态方法Equals就可以比较两个对象?
Q2:在类中实例化自己为一个字段对象有什么用处?(p265)
21:36 2007-1-21
刚才翻了一下书,重新看了一下那个程序,Q2总算是明白了。书上那个类是将自己实例化成了自身中的一个静态的Default字段,好处是可以在使用时不用每次都显式地实例化一个此类的变量,只需直接使用类的这个静态字段就可以获得一这此类的实例,在重复使用时能提高效率。
21:27 2007-1-31
又看了一下Q1也终于想明白了。首先Q1这个问题本身就有点小问题:书上代码中重写的是Equals(object obj)这个方法,不是Equal,基类中也没有Equal方法。
Equals 方法有两个重载:public virtual bool Equals(object obj)与public static bool Equals(object objA , object objB),是两个相互无关的方法,其中第二个是静态的,可以在没有实例的情况下使用。
至 于为什么会让我产生这个问题,是因为书上的代码中对两个对象同时使用了这两种方法进行比较,结果相同都为false。让我产生了误解,其实书中重写了 Equals(object obj)这个方法,比较一个对象与另一个对象的内容是否相等,而Equals(object objA , object objB)还是原始那个方法,并不会比较对象的内容,它只是简单地检查一下两个对象是否引用了相同的实例,当然两个内容都不同的对象不可能引用相同的实 例,于是也返回false。
问题解决。
21:46 2007-1-31

  • 31
  • 1月

Q1:为什么结构体中还用new操作符?(11章p249)
A1:貌似结构体也可以实现构造函数,用new可以执行它。(?不确定)
Q2:结构体也可以实现接口吗?(同上)
A2:貌似类能实现的东西结构体都可以实现。
恐怕是除其实例为值类型,与类实例的引用类型不同外,其他的都相同吧。也许…

10:59 2007-1-21
经过查阅MSDN的有关结构的文档,现在终于可以确定是怎么回事了。在C#中结构是可以看作一个轻量的、值类型的类,结构与类共享几乎所有相同的语法,但结构比类受到的限制更(MDSN原文)。
Q2现在很容易解释了,既然结构可以看作值类型的类,为什么不能实现接口呢?
至 于Q1,也查到了答案:所有的类型(包括int这样的值类型)都有默认的构造函数,也都可以使用new操作符调用其默认构造函数。对于值类型的变量,使用 new与不用它之间的区别是,不用new时,变量处于未赋值状态,很多时候是不可以直接使用的。而使用new操作符,则会给变量赋以默认值(可参见 MSDN的默认值表)。
21:02 2007-1-31

  • 30
  • 1月

刚刚突然想起这个问题:为什么书上的代码在连接字符串时往往是使用一个StringBuider的对象,而不是常见的string。查了一下MSDN,终于明白是怎么回事了。
以下是MSDN上的原文:
String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

StringBuider还可以通过构造函数传入或设置Capacity属性来指定它的容量。不过这里的容量并不是指它 的最大长度,实际上是存储空间的分配增量。它的意思与当初学数据结构时,“线性表的顺序表示和实现”那部分讲用数组存储线性表时定义的那个增量一致:初始 申请该属性大小的内存空间,在内容的长度在此大小内变化时就不需要进行申请或释放内存的操作,当内容长度大于该属性值时,申请一块比目前空间大 Capacity的空间,将现有数据复制进去,释放原始空间进行操作。
以上是个人理解,尚未经过验证。

  • 30
  • 1月

在WinForm应用程序中,防止在进行耗时操作时界面假死的一种解决方案–开启一个新的线程处理那些耗时的操作。于是Control类(Form的基类)提供了一个方法用于开启新的线程,这就是BeginInvoke()。
这个方法的语法看起来有些特别:
public IAsyncResult BeginInvoke (
Delegate method,
params Object[] args
)
使用前需要先定义好一个委托,使用委托来调用类自己的方法,且原始方法的参数要放在委托之后,作为BeginInvoke()的参数传进去。例如书上这段代码:
this.BeginInvoke(new UpdateWatchTextDelegate(UpdateWatchText), “Wrote change event to log”);

相关原始定义:
private delegate void UpdateWatchTextDelegate(string newText);
public void UpdateWatchText(string newText)  {…}
没有再多的研究,就先写到这里了。

  • 29
  • 1月

在练习StreamReader对象时,我建立了一个名为StreamReader的解决方案,结果问题就来了,using System.IO后,StreamReader sr=new StreamReader();一句中的StreamReader不会变蓝。与书上一模一样的main函数代码,一启动调试就报,说我把命名空间当类型来 使用。研究了半天发现书上的解决方案用的名字是StreamRead,没有er,我的StreamReader的namespace覆盖了 System.IO的StreamReader,解决方法:使用完整定位–System.IO.StreamReader。

  • 29
  • 1月

Connections区域到底是个怎么回事?!(p548)
书上的代码也调不过去,看书又看不明白
Web编程的部分都看完了,还是感觉一头雾水。与asp相比多了个.net的后缀,咋就那么不好理解呢?

  • 29
  • 1月

又发现跟书上不一样的地方了:书上的每个WebPart都有下拉菜单,能最小化、关闭,怎么我的就死活弄不出这两个东西来?

经过一番实验,终于找到了问题所在–用户。WebPart的状态是需要保存的,进入数据库又是得用用户名进行区分,所以,没有登录别想编辑!

所有标签:.net Ajax Java javascript Linux map MySQL RSS TD-SCDMA Ubuntu vim web Win7 乱码 基础知识 备份 奥运会 希望泉 性能 缓存 编程