2005年7月22日
MSDN中指出,DataSet序列化是要调用WriteXml产生。但是当我们的一个类中包含有一个类型为DataSet的属性时,直接使用XmlSerializer来做Serialize产生的XML文件中,DataSet是必然带有schema信息的。这样是无可厚非的,如果不这样是无法反序列化的。
可是我们也许有时需要DataSet生成的XML只包括数据,并不关系结构。这样就需要写一个DataSet派生类,同时为了实现XML序列化,需要实现IXmlSerializable接口 class MyDataSet : DataSet, IXmlSerializable
除了默认的构造函数,我们需要一个通过DataSet构造MyDataSet的构造函数
public MyDataSet(DataSet inputDs)
{
this.DataSetName = inputDs.DataSetName;
this.Prefix = inputDs.Prefix;
this.Namespace = inputDs.Namespace;
this.Locale = inputDs.Locale;
this.CaseSensitive = inputDs.CaseSensitive;
this.EnforceConstraints = inputDs.EnforceConstraints;
for(int index = 0; index < inputDs.Tables.Count; index++)
this.Tables.Add(new DataTable(inputDs.Tables[index].TableName));
this.Merge(inputDs, false, MissingSchemaAction.Add);
}
可以通过实现的IXmlSerializable接口函数WriteXml写出不带架构的XML
public new void WriteXml(XmlWriter writer)
{
this.WriteXml(writer, XmlWriteMode.IgnoreSchema);
}
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
另,如果还需要反序列化,那么还要实现ReadXml,这样就可以把xml反读回到DataSet中,不过原DataSet的很多结构信息就丢掉了。
public new void ReadXml(XmlReader reader)
{
XmlTextReader tr = reader as XmlTextReader;
bool flag = true;
bool hasTables = false;
if(tr != null)
{
flag = tr.Normalization;
tr.Normalization = false;
this.DataSetName = tr.Name;
hasTables = tr.Read();
}
if(hasTables)
this.ReadXml(tr,XmlReadMode.Auto);
if(tr != null)
tr.Normalization = flag;
}
2005年5月21日
这样一行c#代码 int i = (int)(8.0/15.0); 结果是0
而在vb.net下Dim i As Integer = 8.0 / 15.0 结果是1,四舍五入了,如果不要四舍五入需要这样修改
Dim i As Integer = Decimal.Truncate(8.0 / 15.0)
2005年1月25日
最近调试ASP.NET程序的时候总是时常出现
Access is denied
....
<add assembly="*" />
....
的错误信息
需要很长时间才能恢复正常。
尝试过重启iis等都没有用,而且到asp.net临时目录下发现网站的临时目录存在没有访问权限的目录。
郁闷了一段时间
今天偶尔发现了问题所在
http://support.microsoft.com/default.aspx?scid=kb;en-us;329065原来是与我前不久装的msn desktop search有关,是Indexing的问题。
解决方法按KB上讲的就可以了
2005年1月14日
下面的存储过程,ID1是同时作为输入输出参数的。
CREATE Procedure usp_test
@ID1 int output,
@ID int
AS
IF @ID1 = 0
BEGIN
SELECT * FROM Customers
SET @ID1 = 1
end
ELSE
begin
SELECT Employees.* FROM Employees
SET @ID1 = 2
end
GO
通过查询分析器直接运行还是通过VS.NET都能正常运行,可是当用ado.net写一个程序调用时,就不一样了。设置ID1这个参数等于0根本没有用,从Profiler来看,ID1一上来就是1,IF那部分不会执行下去。
不过,如果将两个参数调整一下位置就可以了
CREATE Procedure usp_test
@ID int,
@ID1 int output
AS .....
有些奇怪,因无从下手找KB,不知道这个是不是ADO.NET的问题,还是其他问题
(1-15更新)
问题好像不是那么简单,今天无论调整成怎样都不行。后来又好了,但是不关次序的问题,而是与设置ParameterDirection.InputOutput还是ParameterDirection.Output有关。而且发现当是ParameterDirectioin.Output的时候,参数设置什么都没有用,都是NULL,存储过程改称
IF @ID1 = 0 OR @ID1 is NULL
就可以了
不过,即使设置了ID1=1也执行不了ELSE的内容,奇怪的问题。
2004年12月31日
前不久,赫然看到了一个同事还在用sp_开头在SQL Server来做存储过程,于是引经据典的给了他msdn的link,说这样会有效率问题。
在很久前帮一家公司的一个存储过程,据说光执行那个存储过程需要好多秒钟的时间,那个存储过程用一个死循环在临时表里面写东西,然后从临时表里用一个很复杂的查询语句查一个东西,直到能查出某个数来才跳出死循环。
还记得去年的一个项目,设计的存储过程开始没有考虑锁表问题,中间出过一些问题。
也许第一个问题是我吹毛求疵了,第二个问题我建议了改数据结构了。
可是数据库效率问题真的应该需要考虑,这个不单单是SQL Server的问题。
像Locking, Transaction等等不是数据库本身就能做到完全满足要求的,是需要做一些工作的。
关于SQL Server调优的书和文章挺多的,可是一般的数据库设计人员都是觉得懂了些SQL就行了,既然SQL是一种语言,就有他的设计技巧和设计方法的。
我觉得下面三本书应该可以解决绝大部分SQL Server 2000的效率问题
Improving .NET Application Performance and Scalability,这是microsoft的Patterns & Practices系列中的一篇
SQL Performance Tuning,Addison Wesley出的一本书
Inside Microsoft SQL Server 2000, MS Press的
2004年11月27日
摘要: DataGrid如果绑定了数据之后,会出现下面的情况。当用鼠标选中某一编辑框的情况下,对DataGrid的数据源DataSource进行更新,会出现列xxx不属于table的错误stacktrace最后是.... DataRow.CheckColumn .....出现的前提情况包括:1、对datagrid设置了tablestyle,做了对字段的映射2、在向右拉动了滚动条3、选中的编辑框不是最后一列...
阅读全文
2004年10月18日
摘要: 介绍了如何处理更多的事件(除DrawingControl已有的事件)http://www.cnblogs.com/xenogear/articles/53738.aspx
阅读全文
2004年10月12日
摘要: 现成的Winform下的Label控件的三种BorderStyle没有突起效果的,None, FixedSingle, Fixed3D。要做个突起效果的,就继承一个Label来做。里面加上:protectedoverrideCreateParamsCreateParams{get{CreateParamscp=base.CreateParams;cp.ExStyle&=(~NativeMe...
阅读全文
2004年10月10日
摘要: 一直以来在Form上的TextBox要显示数据库内容,通常就是直接赋值。看了http://www.15seconds.com/issue/040908.htm上讲的要做对应类,现在来说,ORM没什么做的特别好的,所以这么做还是有些累。http://tech.ccidnet.com/pub/article/c1138_a9879_p1.html里面介绍也只是单向绑定,而且实现的不是很好。于是就想直接...
阅读全文
2004年10月6日
摘要: (读自http://www.dotnetbips.com/displayarticle.aspx?id=147有源代码下载)这个问题的出现是因为RadioButtons控件是不能直接加在DataGrid的模板列的。因为DataGrid会给每个单选按钮生成一个唯一名,这样这些单选按钮就不是一个组的了。解决问题的办法是,在模板列中加入一个Label控件。在DataGrid的ItemDataBound事...
阅读全文