RSS 2.0 Feed
2004-09 Entries
摘要:JScriptProtector 是一个用来保护JScript代码的组件。因为版权不属于我,所以无法公开代码。 现在我在我的服务器上放了一个简单的服务,写惯JS的可以上去帮你的脚本加加密哦。 http://www.lostinet.com/jsps/ (举贤不避亲嘛。:-)...[阅读全文]

posted @ | Feedback (15) | Filed Under [ DotNet Browser AspNet ]

摘要:我一向都是用开 SqlCommandBuilder.DeriveParameters 的。 但是那个方法有一个BUG。这个BUG导致该方法无法处理关联了SqlTransaction的SqlCommand 具体原因是DeriveParameters是创建一个新的SqlCommand来执行sp_procedure_params_rowset的。 但是临时的SqlCommand没有设置SqlTransaction,这样就直接导致错误。 下面是根据SqlCommandBuilder.DeriveParameters的实现复制出来的一个可用的版本: namespace LostinetSample { using System; using System.Collections; using System.Data; using System.Data.OleDb; using System.Data.SqlClient; class SqlStoredProcedure { static public void DeriveParameters(SqlCommand cmd) { if(cmd==null)throw(new ArgumentNullException("cmd")); if(cmd.CommandType!=CommandType.StoredProcedure) throw(new ArgumentException("cmd.CommandType!=CommandType.StoredProcedure","cmd")); if(cmd.Connection==null) throw(new ArgumentException("cmd.Connection==null","cmd")); if(cmd.CommandText==null||cmd.CommandText.Length==0) throw(new ArgumentException("cmd.CommandText==null||cmd.CommandText.Length==0","cmd")); string dbname=null; string owner=null; string spname; string[] parts=cmd.CommandText.Split(new char[]{'.'}); switch(parts.Length) { case 1: spname=parts[0]; break; case 2: owner=parts[0]; spname=parts[1]; break; case 3: dbname=parts[0]; owner=parts[1]; spname=parts[2]; break; default: throw(new ArgumentException("cmd.CommandText have too many '.'","cmd")); } string cmdtext="sp_procedure_params_rowset"; if(dbname!=null) { cmdtext=dbname+"."+owner+"."+cmdtext; } else if(owner!=null) { cmdtext=owner+"."+cmdtext; } ArrayList ps=new ArrayList(); #region Fetch Parameters using(SqlCommand dpcmd=cmd.Connection.CreateCommand()) { dpcmd.Transaction=cmd.Transaction; dpcmd.CommandText=cmdtext; dpcmd.CommandType=CommandType.StoredProcedure; SqlParameter ppname=new SqlParameter("@procedure_name",SqlDbType.NVarChar,500); dpcmd.Parameters.Add(ppname); ppname.Value=spname; using(SqlDataReader sdr=dpcmd.ExecuteReader()) { while(sdr.Read()) { SqlParameter param=new SqlParameter(); param.ParameterName=(string)sdr["PARAMETER_NAME"]; switch((short)sdr["PARAMETER_TYPE"]) { case 2: param.Direction=ParameterDirection.InputOutput; break; case 3: param.Direction=ParameterDirection.Output; break; case 4: param.Direction=ParameterDirection.ReturnValue; break; default: param.Direction=ParameterDirection.Input; break; } param.SqlDbType=GetSqlDbTypeFromOleDbType((short)sdr["DATA_TYPE"],(string)sdr["TYPE_NAME"]); if(param.SqlDbType==SqlDbType.Decimal) { param.Scale=(byte)(((short) sdr["NUMERIC_SCALE"])&0xff); param.Precision=(byte)(((short)sdr["NUMERIC_PRECISION"])&0xff); } object objcml=sdr["CHARACTER_MAXIMUM_LENGTH"]; if(objcml is int) { param.Size=(int)objcml; } ps.Add(param); } } } #endregion if(ps.Count==0) throw(new Exception("StoredProcedure Not Found")); foreach(SqlParameter param in ps) { cmd.Parameters.Add(param); } } static SqlDbType GetSqlDbTypeFromOleDbType(short dbType,string typeName) { #region Copy From System.Data.SqlClient.MetaType SqlDbType type1 = SqlDbType.Variant; OleDbType type2 = (OleDbType) dbType; if (type2 <= OleDbType.Filetime) { switch (type2) { case OleDbType.SmallInt: case OleDbType.UnsignedSmallInt: { return SqlDbType.SmallInt; } case OleDbType.Integer: { return SqlDbType.Int; } case OleDbType.Single: { return SqlDbType.Real; } case OleDbType.Double: { return SqlDbType.Float; } case OleDbType.Currency: { return ((typeName == "money") ? SqlDbType.Money : SqlDbType.SmallMoney); } case OleDbType.Date: case OleDbType.Filetime: { goto Label_0104; } case OleDbType.BSTR: { goto Label_0161; } case OleDbType.IDispatch: case OleDbType.Error: case OleDbType.IUnknown: case ((OleDbType)......[阅读全文]

posted @ | Feedback (8) | Filed Under [ DotNet ]

摘要:不知道各位有没有做过用于打印的Web页。 我帮客户做这个页面的时候,喜欢把某些区域定为contentEditable="true",目的是让客户可以随便修改这些地方。 例如: <Asp:Panel runat=server contentEditable="true"/>..<Asp:Label runat=server id=PrintTitle Text=PrintTitle/>..</Asp:Panel>...[阅读全文]

posted @ | Feedback (17) | Filed Under [ 迷失中 DotNet AspNet ]

摘要:内容是: function _doPostBack(){}; if(typeof("__doPostBack")=="function") { _doPostBack=__doPostBack; __doPostBack=_doPostBackNew; } document.attachEvent("onmousemove",_onmousemove); var _isPosting=false; var _divMask=null; function _onmousemove() { if(_divMask) with(_divMask.runtimeStyle) { left=event.clientX+document.body.scrollLeft-4; top=event.clientY+document.body.scrollTop-4; } } function _makeMask() { var div=document.createElement("DIV"); with(div.runtimeStyle) { position="absolute"; zIndex=999999; fontSize="1px"; left=event.clientX+document.body.scrollLeft-4; top=event.clientY+document.body.scrollTop-4; width="8px"; height="8px"; cursor="wait"; backgroundColor="gray"; filter="alpha(opacity=10)"; } try { document.body.insertAdjacentElement("BeforeEnd",div); div.onblur=new Function("this.focus()"); div.focus(); } catch(x){} if(_divMask)_divMask.removeNode(true); _divMask=div; } function _doPostBackNew(sender,args) { if(_isPosting) return event.returnValue=!(event.cancelBubble=true); status="正在更新页面..."; _doPostBack(sender,args); _isPosting=true; _makeMask(); } function _onformsubmit() { if(_isPosting) return event.returnValue=!(event.cancelBubble=true); _isPosting=true; _makeMask(); } new function _attachForms() { with(new Enumerator(document.forms)) for(;!atEnd();moveNext()) { item().attachEvent("onsubmit",_onformsubmit); var div=document.createElement("div"); div.runtimeStyle.width="0px"; div.runtimeStyle.hight="0px"; div.runtimeStyle.overflow="hidden"; div.runtimeStyle.position="absolute"; item(0).insertAdjacentElement("afterbegin",div); div.innerHTML="<INPUT TYPE=Submit name='webformpatchsubmitelement' onclick='return event.returnValue=false' id='webformpatchsubmitelement' value='webformpatchsubmitelement'/>"; } } 把这个作为 <-script src=.....js-><-/script-> 的形式Render到每个页面中就可以了。|如果有PageBase,则在Init的时候用RegisterClientScriptBlock放上去更好。因为客户没有抱怨过,所以也没有改进过。...[阅读全文]

posted @ | Feedback (366) | Filed Under [ DotNet Browser AspNet ]

摘要: http://blog.joycode.com/lostinet/ /lostinet/ 谢谢GRACE的邀请。打算那天穿博客堂的衣服去 , 顺便让蝈蝈俊.net看看我有多胖:-) EAKU的订单其实我已经下了,不过因为没有在线支付,要把钱寄给他公司真难啊。 (我去附近的工行,那里竟然没有汇款到公司的服务。虽然说都是上海。希望那个网站能做好。。) 右边的是 <-FieldSet-> <-Legend-> Title <-/Legend-> Content  。 刚认识它,感觉简单方便实用。 ...[阅读全文]

posted @ | Feedback (13) | Filed Under [ 迷失中 ]

摘要:因为WebControl不会自动保存ControlStyle的ViewState,所以如果要重写CreateControlStyle,那么最好按默认的策略,把ViewState作为Style保存数据的地方:protected override Style CreateControlStyle(){   return new TableStyle(ViewState);}又或者是自己去保存这个Style.. (今天才注意到这个细节问题..)...[阅读全文]

posted @ | Feedback (9) | Filed Under [ DotNet AspNet ]

摘要:今天不只被外包,还要跑到虹桥机场去帮忙实施。可惜来到这里又好象没有什么事干。。:) 刚好可以写写Blog 。 刚好这几天写数据库操作比较多,是时候写写关于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是 1select null 这样返回的是DBNull.Valueselect isnull(null,1) 返回的是 1select top 0 id from table1 这样返回的值是nullselect 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 @ | Feedback (21) | Filed Under [ DotNet ]

摘要:这段时间写代码写晕了,犯了个致命的错误: if(x.IsAdmin) if(!y.IsAdmin)return -1; else if(y.IsAdmin)return 1; 如果你知道有问题了,那么找出问题很容易的。 反过来,如果心里没有认为它没有问题,那么就很难发现错误了。...[阅读全文]

posted @ | Feedback (39) | Filed Under [ 迷失中 DotNet ]

摘要:最近客户找我做一个更新SqlServer的算法,我在需求还算明确的情况下把代码写完,发了过去。结果客户很快就打电话给我,说他们不是用 System.Data.SqlClient 的。要求我把代码改成OleDb的。 为了使程序能让OleDb和SqlClient都能用,我把程序的接口改为 IDbXXX . 可是问题出现了,OleDb竟然不把参数送到SqlServer那边去! 例如这样的代码,namespace ConsoleApplication1 { using System; using System.Data; using System.Data.Common; using System.Data.OleDb; class Class1 { [STAThread] static void Main(string[] args) { string connstr="Provider=SQLOLEDB;Data Source=(local);Initial Category=Northwind;Integrated Security=SSPI;"; using(OleDbConnection conn=new OleDbConnection(connstr)) { conn.Open(); using(OleDbTransaction trans=conn.BeginTransaction()) { using(IDataReader reader=MyBussinessLogic(trans,1)) { while(reader.Read()) { Console.WriteLine(reader.GetValue(0)); } } } } } static public IDataReader MyBussinessLogic(IDbTransaction trans,int empid) { if(trans==null)throw(new ArgumentNullException("trans")); IDbCommand cmd=trans.Connection.CreateCommand(); cmd.Transaction=trans; cmd.CommandText="select ShipName from Orders where EmployeeID=@empid"; IDbDataParameter pEmplolyeeId=cmd.CreateParameter(); pEmplolyeeId.ParameterName="@empid"; pEmplolyeeId.DbType=DbType.Int32; pEmplolyeeId.Value=empid; cmd.Parameters.Add(pEmplolyeeId); return cmd.ExecuteReader(); } } }其中 MyBussinessLogic 是我的实现。通过IDbXXX的方法,把CommandText,参数等信息放进去后,就执行Command 。 如果外面传一个 SqlTransaction 进来,那么是没有问题的。 但是如果外面传 OleDbTransaction 进来,那么这个OleDb的提供者就只把CommandText传到SqlServer去,那么执行当然会出错了。 以前没有用 OleDb 时,以为 SqlClient 只是性能上更加优化而已, 直到今天才知道还有这个问题存在。。...[阅读全文]

posted @ | Feedback (22) | Filed Under [ DotNet ]