AndyDavis

学习.net 2.0

统计

常用链接

留言簿

阅读排行榜

评论排行榜

2008年1月22日 #

[转帖]Web缓存加速指南[翻译]

     摘要: 这是一篇知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中。为了简要起见,某些实现方面的细节被简化或省略了。如果你更关心细节实现则完全不必耐心看完本文,后面参考文档和更多深入阅读部分可能是你更需要的内容。  阅读全文

posted @ 2008-01-22 18:52 AndyDavis 阅读(127) | 评论 (0)编辑

2006年9月10日 #

[转帖]通常你会在什么地方遇到DBNull?

DBNull在DotNet是单独的一个类型 System.DBNull 。它只有一个值 DBNull.Value 。DBNull 直接继承 Object ,所以 DBNull 不是 string , 不是 int , 也不是 DateTime 。。。

但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是DotNet储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。

对于 DataRow , 它的 row[column] 返回的值永远不为 null , 要么就是具体的为column 的类型的值 。 要么就是 DBNull 。 所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException。

DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

在 IDbCommand(OleDbCommand,SqlCommand…) 的ExecuteScalar的返回值中,情况可以这样分析:

select 1 这样返回的object是 1
select null 这样返回的是DBNull.Value
select isnull(null,1) 返回的是 1
select top 0 id from table1 这样返回的值是null
select isnull(id,0) from table1 where 1=0 返回的值是null

这里 ExecuteScalar 的规则就是,返回第一列,第一行的数据。如果第一列第一行不为空,那么ExecuteScalar就直接对应的DotNet的值。如果有第一行,但是第一列为空,那么返回的是 DBNull 。如果一行都没有,那么ExecuteScalar就返回null

规则就是这样的。这里容易犯的一个错误是,把ExecuteScalar返回DBNull与null的情况混淆,例如:

string username=cmd.ExecuteScalar().ToString();

除非你认为cmd执行后,肯定至少有一行数据,否则这里就会出错。

又或者 select id from usertable where username=@name 这样的sql语句,如果找不到记录,那么ExecuteScalar则会返回null,所以千万不要

int userid=Convert.ToInt32(cmd.ExecuteScalar());

或者你会这样写 SQL 语句:select isnull(id,0) from usertable where username=@name

但是 int userid=Convert.ToInt32(cmd.ExecuteScalar()); 依然会出错,因为上面的语句不成立时,仍然是不返回任何行。

对于IDbDataParameter(OleDDbParameter,SqlParameter..)的Value,如果为null,则代表该参数没有指定,或者是代表DEFAULT。如果为DBNull.Value,则代表SQL中的NULL

所以,如果你要调用存储过程,里面有参数 @val nvarchar(20)=”AABB” ,
那么cmd.Parameters[”@val”].Value=null 代表使用这个默认的 “AABB”
而cmd.Parameters[”@val”].Value=DBNull.Value 代表使用NULL来传给 @val

你可以用Convert.IsDBNull来判断一个值是否DBNull。注意Convert.IsDBNull(null)是false。

备注:以上的SQL语句全是指SQLSERVER2000的。

posted @ 2006-09-10 00:19 AndyDavis 阅读(97) | 评论 (0)编辑

2006年4月24日 #

FCKEditor 2.2 的上传功能与Maxthon的兼容问题

在ASP.NET 2.0下配置使用fckeditor 2.2,其它都没有问题,唯独这个上传功能一直不好使:用FCKeditor编辑器时, 按插下图片,弹出一个小对话框, 再按浏览服务器,但是打开窗口不在顶层,无法使用。 同样,插入FLASH等其它类似功能都有这个问题。

今天突然发现,竟然是与Maxthon 的兼容问题造成。在IE下,则正常。应该是关于模式对话框的问题。

Google了一下,在Maxthon的论坛也有人提到了:http://forum.maxthon.com/index.php?showtopic=31760 但没有人解决。 不知道这里有人解决这个问题没?

posted @ 2006-04-24 07:30 AndyDavis 阅读(579) | 评论 (4)编辑

2006年4月3日 #

获得GridView的EmptyDataTemplate中的控件

这个问题的提出,是我想在Gridview中整理添加记录的功能。
如果有数据的时候,我们可以把空的newTextBox放在FooterTemplate中,在程序里可以用
Gridview1.FooterRow.FindControl("newTextBox")来取得这个控件,完成添加记录的功能。
但如果数据表中没有记录,header和footer都不会显示出来。 这时,只会显示EmptyDataTemplate里的内容。
奇怪的是EmptyDataRow并不是Gridview的成员,于是上面的方法不行了。
找了很久,找到这样一个变通的办法来获得EmptyDataTemplate里的控件:
Dim txbNew As TextBox = GridView1.Controls(0).Controls(0).FindControl("newTextBox")
很变态,但确实可行。
如果大家有更好的办法,请告诉我。

neilchen123的回复问到这两层Control是什么,我又写了一段测试程序来弄清这个问题:

1    Protected Sub btnAddNew_Click(ByVal sender As ObjectByVal e As System.EventArgs)
2        Label1.Text = TypeName(GridView1.Controls(0)).ToString + " "
3        Dim EmptyChildTable As Table = GridView1.Controls(0)
4        Dim EmptyGridView As GridViewRow = EmptyChildTable.Rows(0)
5        Label1.Text = Label1.Text + EmptyGridView.RowType.ToString + " "
6        Dim txbNewCltName As TextBox = EmptyGridView.FindControl("txbNewCltName")
7        Label1.Text = Label1.Text + txbNewCltName.Text
8    End Sub
其中的txbNewCltName和btnAddNew都是放在EmptyTemplate里的控件。
显示的结果是:
ChildTable EmptyDataRow 新添加的内容
可以知道,第一层Control是Table,第二层Control是Row.
 
我现在的做法是在FooterTemplate里插入新建的相关控件应付有数据的情况下的插入工作,在EmptyTemplate里也插入新建的相关控件应付无数据的情况下的插入工作。  这样,不需要虚增一行来显示FooterRow了。

posted @ 2006-04-03 04:12 AndyDavis 阅读(2337) | 评论 (8)编辑

2006年3月31日 #

ASP.NET 2.0 正式版中无刷新页面的开发(示例代码的补充)

     摘要: 原文请见Leon.Zhou的:http://pfzhou.cnblogs.com/archive/2006/03/31/363342.html下载了示例代码,并转换成VB了,AJAX功能测试成功。但遇到些小问题:Demo1很正常。Demo2按Leon原来的写法testAJAX.aspx.vb中Line 22不成功。所以我直接在IDE环境中,修改button3的OnClientClick属性,见te... 阅读全文

posted @ 2006-03-31 21:13 AndyDavis 阅读(3158) | 评论 (3)编辑

2006年3月23日 #

【原创】关于ASP,ASP.NET,VB.NET里的MD5加密函数

老文章了,在这里再帖一遍吧。

在ASP中,我们使用过如动网论坛等用的ASP中MD5函数加密出的字符串则如:
1165d25d8cd021d5

而在Asp.Net中下面的方法:
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password.Text,"MD5")

进行MD5加密出来的结果却是:
12C403B91165D25D8CD021D5F9B5BB7F

究其原因,是因为,在ASP中的MD5函数是使用了32位MD5 Hashvalue中的第9~25位再变小写作为密文。知道这个原因,把ASP.NET的结果稍加处理就可以用来比较老数据库中的密码字串了。
在ASP的MD5函数中第353、354行:
'MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
 MD5=LCase(WordToHex(b) & WordToHex(c))  'I crop this to fit 16byte database password :D
第一句是取全部的32位密文,第二句则是取中间第9~25位为16位密文。

到了vb.net问题又来了,在vb.net里,无法用到System.Web.Security名称空间,无法用上面简单的办法进行MD5加密。故我写了下面这个函数来处理:

VB.NET:
'MD5 加密函数
 Public Shared Function MD5(ByVal strSource As StringByVal Code As Int16) As String
  
'这里用的是ascii编码密码原文,如果要用汉字做密码,可以用UnicodeEncoding,但会与ASP中的MD5函数不兼容
  Dim dataToHash As Byte() = (New System.Text.ASCIIEncoding).GetBytes(strSource)
  
Dim hashvalue As Byte() = CType(System.Security.Cryptography.CryptoConfig.CreateFromName("MD5"), System.Security.Cryptography.HashAlgorithm).ComputeHash(dataToHash)
  
Dim i As Integer
  
Select Case Code
   
Case 16  '选择16位字符的加密结果
    For i = 4 To 11
     MD5 
+= Hex(hashvalue(i)).ToLower
    
Next
   
Case 32  '选择32位字符的加密结果
    For i = 0 To 15
     MD5 
+= Hex(hashvalue(i)).ToLower
    
Next
   
Case Else   'Code错误时,返回全部字符串,即32位字符
    For i = 0 To hashvalue.Length - 1
     MD5 
+= Hex(hashvalue(i)).ToLower
    
Next
  
End Select
 
End Function

posted @ 2006-03-23 17:04 AndyDavis 阅读(308) | 评论 (1)编辑

注册博客园

傍晚提交的申请,晚上回来就回复了。
这里的处理速度还挺快的。

高兴的是,申请时顺便提的一个关于邮件地址里不能有+号的建议立刻被接纳并处理。

posted @ 2006-03-23 00:34 AndyDavis 阅读(55) | 评论 (0)编辑