2007年5月18日星期五

keil中察看c51的ram

   今天给别人讲51单片机的题,难理解,就用Keil uVision3给她演示,期间发现我不知道怎么显示内外ram中的数据,后来研究了一下找到了方法:
   在MEMORY WINDOW里输入D:0x00就能查看内ram中的数据
   在MEMORY WINDOW里输入X:0x00就能查看外ram中的数据
   在MEMORY WINDOW里直接输入地址或者输入C:0x00显示出来的是rom中的数据
      完!

2007年5月14日星期一

给表起个别名(sql)

    今天碰见这么一个问题,抽象成模型是这样的:
    在数据库中有两个表,分别是[Messages]聊天记录和[Users]用户,聊天记录中包括[MsgId]消息编号(int)、[SenderId]发送者编号(int)、[ReceiverId]接收者编号(int)和[Content]消息内容(text)四个字段,其中MsgId是主键;用户表中包括[UsrId]用户编号(int)和[UsrName]用户名(nvarchar)两个字段,主键为UsrId,即
MsgIdSenderIdReceiverIdContent
112Hello!
221Hi!
331How R U ?
432Good Day
513Fine!
............
UsrIdUsrName
1Tom
2Jim
3Lucy
......
    由于要人性化,现在需要展现给观众的是消息编号、发送人姓名、接收者姓名和消息内容,即
MsgIdSenderNameReceiverNameContent
1TomJimHello!
2JimTomHello!
3LucyTomHow R U ?
4LucyJimGood Day
5TomLucyFine!
............
    这就不得不对Users表进行两次关联,从而的到需要的结果 。起初我以为很简单只要用SELECT #$%#$% FROM MessagesINNER JOIN Users ON Messages.SenderId = Users.UsrId ON Messages.ReceiverId = Users.UsrName就可以,结果发现SELECT后面不知道该怎么写了(乱码那里),由于也不知道该怎么形容这种问题,书上和网上都没找到相关方法。有人说编一个翻译函数,还有人说建一个临时表来协助查询,但我认为应该有更好的办法,后来偶然间发现原来可以用一个关键字叫AS对Users表做一个“镜象”,再来完成查询,就能得到正确的结果,语句这么写:
SELECT Messages.MsgId, Sender.UsrName AS SenderName, Receiver.UsrName AS ReceiverName,Messages.Content FROM Messages INNER JOIN Users AS Sender ON Sender.UsrId= Messages.SenderId INNER JOIN Users AS Receiver ON Messages.ReceiverId= Receiver.UsrId
意思是用tableexpression1 AS tableexpression2对User表做了两个“镜象”,一个用来关联Messages.SenderId,另外一个用来关联Messages.ReceiverId,这样就完成了对编号进行翻译的功能。
    值得一提的是如果要考虑到某个人对空气说的话(ReceiverId为空或Users表中对应不上)并保证可以看到全部聊天记录的话,可以把INNERJOIN换成LEFT JOIN或RIGHT JOIN,总之要多去尝试就会发现问题的解决方法。