2009年7月24日星期五

drop table if exists in SQL Server

/* check if a table already exits before we drop it*/
IF EXISTS(SELECT name FROM sys.tables
WHERE name = 'Table_TempForTest')
BEGIN
/* drop table */
DROP TABLE Table_TempForTest
END
GO

/* see all the tables */
select * from sys.tables

powershell can't recognize the vairable setting for dtexec.exe

when I run dtexec.exe in powershell,the value after ";" is treated as a cmdlet and throw a exception" not recognized as a cmdlet, function, operable program, or script file".

This script can execute under cmd-line, but not in powershell.....

dtexec /f "C:\Users\Administrator\Documents\Visual Studio 2008\Projects\Integration Services Project1\Integration Services Project1\FileCopyPackage.dtsx" /set \package.variables[User::SourceFileName].Value;"C:\sharefolder\ssiscopied"

2009年7月21日星期二

在64位机上运行dtexec转换Excel数据

在64位操作系统上,dtexec默认是在64位模式下运行的,但是在三种情况下我们需要让dtexec运行于x86的模式:
  • 运行sql server 2000的DTS包
  • DTS包中使用的托管的.NET Framework Data Provider或者是本地OLE DB provider不支持64位模式
  • 脚本中引用的其它程序集或Com组件没有64位版本或者没有安装64位版本
如果我们用DTS来转换Excel数据,比如将数据导入sqlserver 2008 express,那么在读取Excel时就会使用OLE DB provider。OLE DB provider目前是没有64位版本的,按照前面说的这意味着在64模式我们无法使用DTS来导出Excel,而必须使用32位的模式。在dtexec的时候可以通过设置/x86参数来制定运行32位模式:

cd C:\Program Files\Microsoft SQL Server\100\DTS\Binn

dtexec /x86 /f c:\Sharefolder\Package2.dtsx /connection SourceConnectionExcel;"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Sharefolder\BusinessTemplate.xls;Extended Properties=Excel 8.0;HDR=YES" /connection DestinationConnectionOLEDB;"Data Source=.\SQLEXPRESS;Intial Catalog=SSISSampleDb;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=false"

pause
上面的例子中我们通过参数的形式重新设置了两个连接的值。在dtexec运行时,每个连接都可以通过一个单独的/connection参数来制定新的值,当有多个连接的时候,就设定多个/connection参数,这个好像在文档中没有提到。

参考资料:
64-bit Considerations for Integration Services

2009年7月10日星期五

sqlite 分页查询

select * from talbe_name limit @offset,@pageSize

一般 offset = pageSize * pageIndex

2009年6月12日星期五

Entity Framework Tips

by AlexJ : http://blogs.msdn.com/alexj/archive/2009/03/26/index-of-tips.aspx

Hopefully if you're reading this you've noticed that I've started a series of Tips recently. The Tips will mostly apply to Entity Framework.

Seeing as I expect to have a lots of tips, it probably makes sense to have some sort of index. That is what this is post is, as I add a new tip I will add it to this page too.

If you have any suggested topics for tips please let me know by leaving a comment or emailing me directly at Microsoft (Alexj is my alias at Microsoft, and emails at Microsoft are in the form alias@microsoft.com)

Without further ado here are what I have so far:

Tip 25 – How to get Entities by key the easy way

Tip 24 – How to get the ObjectContext from an Entity

Tip 23 – How to fake Enums in EF 4

Tip 22 - How to make Include really Include

Tip 21 – How to use the Single() operator – EF 4.0 only

Tip 20 – How to deal with Fixed Length Keys

Tip 19 – How to use Optimistic Concurrency with the Entity Framework

Tip 18 – How to decide on a lifetime for your ObjectContext

Tip 17 – How to do one step updates with AttachAsModified(..)

Tip 16 – How to mimic .NET 4.0’s ObjectSet today

Tip 15 - How to avoid loading unnecessary Properties

Tip 14 - How to cache Entity Framework Reference Data

Tip 13 - How to Attach an Entity the easy way

Tip 12 - How to choose an Inheritance Strategy

Tip 11 - How to avoid Relationship Span

Tip 10 - How to understand Entity Framework jargon

Tip 9 - How to delete an object without retrieving it

Tip 8 - How to write 'WHERE IN' style queries using LINQ to Entities

Tip 7 - How to fake Foreign Key Properties in .NET 3.5 SP1

Tip 6 - How and when to use eager loading

Tip 5 - How to restrict the types returned from an EF Query

Tip 4 - Conceptual Schema Definition Language Rules

Tip 3 - How to get started with T4

Tip 2 - Entity Framework Books

Tip 1 - How to sort Relationships in the Entity Framework

Enjoy.

2009年6月9日星期二

指定程序运行时的CultureInfo

程序的执行结果有时候跟Culture密切相关,比如在格式化“钱”的时候:

textBoxMoneyWonFiltered.Text = moneyWon.ToString("C");

假设moneyWon的值是24.1,在不同的Culture下显示的结果会不同,比如¥24.1(中国)或者$24.1(美国)。对于一个支持Globalization的程序而言,设定基于应用程序或者线程的Culture是一个非常好的习惯,可以避免一些怪异的情况出现。

对于一个Windows程序,默认使用与系统相同的Culture设定,要修改程序特有的Culture很简单,只需要在启动的时候添加如下代码:

//覆盖系统默认的 zh-CHS
Application.CurrentCulture = new System.Globalization.CultureInfo("en-US");


2009年6月4日星期四

Linq to SQL要复活吗?

自从微软推出了EntityFramework(EF)之后,linq to sql的开发就几乎是中断了,原先开发linq to sql的人转而为EF编写代码,甚至连微软ado.net team的人也推荐开发人员转向EF。.Net社区里基本上认为linq to sql已经被微软枪毙了。这里有一篇关于linq to sql是否已死的讨论:Is Linq to SQL truly dead? .

然而令人意想不到的是,微软数据开发组的Damien Guard却突然给出了一个.net 4.0中Linq to SQL的更新列表,涉及到性能、可用性、稳定性、SqlMetal(从数据库生成dbml文件的工具,也可以生成代码)、类设计器和代码生成等方面的问题。



2009年6月3日星期三

当?: 操作遇到可空值类型(Nullable Value Type)


double? PE = String.IsNullOrEmpty(txtHistoryPE.Text)?
null:Double.Parse(txtHistoryPE.Text)

上面的代码试图达到这样一个目的:如果文本框没有输入,则让变量PE保持为 'null' 。但是这段代码无法通过编译,编译错误如下:
Error: Type of conditional expression cannot be determined because there is no implicit conversion between '' and 'double'
null是引用类型,而double是值类型的,?:操作符无法应用到这两者上面。这可能跟大多数人预想的不太一样,一般会认为如果条件为true,那么PE等于null,否则执行Double.Parse的操作并就将结果赋给PE。翻译成代码就是这样的:

double? PE;

if (string.IsNullOrEmpty(txtHistoryPE.Text))
{
PE = null;
}
else
{
PE = double.Parse(txtHistoryPE.Text);
}

但是实际上如果我们真的把代码写成上面那样,恰恰是没有问题的。然而?:操作在这里需要做转型操作,需要对 'null' 做一个转型,将它转换为Nullable :

double? PE = String.IsNullOrEmpty(txtHistoryPE.Text)
? (double?) null : Double.Parse(txtHistoryPE.Text)

或者使用default关键字,取double?的默认值null:


double? PE = String.IsNullOrEmpty(txtHistoryPE.Text)
? default(double?) : double.Parse(txtHistoryPE.Text)
值得注意的是这里使用的是default(double?) 而非 default(double),这是因为后者返回0.0,而不是我们所需要的null

2009年6月2日星期二

开始在八一中学体育馆打羽毛球了

昨天终于又去打羽毛球了,这次可能会长久一点,因为一次性订了3个月的场地,每个星期一下午6:00~8:00,两个小时。场地是订在八一中学的体育馆,就在我们公司的楼下,下班直接过去,真近,呵呵。昨天是第一次去那个地方打球,跟公司的3个同事,一个同事的老婆,外加一个微软的哥们,没算错的话应该是6个人一起。八一中学场地是30块一个小时,在北京还算是便宜的了,昨天打了2个小时感觉那的场地还不错,不过灯光稍稍有点暗。

昨天打球用的是亮羽的羽毛球,那是我在北邮门口临时买的,以前经常用的诺地波尔502没有买的。亮羽的球好像没有诺地波尔好用,可是价钱差不多。主要是亮羽的球头太软,打一会头都扁了……

2009年5月26日星期二

Microsoft机器翻译MSDN杂志

今天看2009年5月份的MSDN杂志时发现这样一段话:
"请注意: 从即日起,杂志的内容将由机器翻译为简体中文。得益于这一快速发展的新技术,我们将能够以更多的语言、更快的速度与全世界的读者分享内容。我们欢迎您评估这些页面的翻译质量并提出意见。"


这一段话中提到了“机器翻译”,让我想起还在学校的时候使用过的Google Translation服务,不过我记得当时的翻译结果是惨不忍睹的:)我仔细看了MSDN的翻译结果之后,感觉这次微软的机器翻译基本上也是这个情况。


Google的翻译工具有一个提供修改意见的地方,如果觉得翻译结果不满意,我们可以给出自己的翻译建议。毕竟在现阶段,人的理解能力是机器所无法达到的。这个可以为翻译工具提供建议的特性我在MDSN的翻译结果页面里找到了,请看下面这个图:

note:不过我始终无法正确提交翻译的建议,不知为何……

虽然翻译的质量不怎么样,但是微软已经打算要将机器翻译用作商用了,因为微软不在提供中文版的MSDN杂志,而是让用户阅读由机器翻译成的内容:
请注意,我们将不再提供简体中文版的 MSDN Magazine CHM 文件。然而,您仍可通过单击“HTML Help Format”按钮,以访问美国英语版的 CHM 文件。
看来微软是要逼我们为它的翻译机器做出贡献了,呵呵
此为机器翻译内容,社区成员可对其进行编辑。我们十分希望您能单击与以下任一句子关联的“编辑”链接,对翻译进行改进。

2009年5月21日星期四

S#arp Architecture for the ASP.NET MVC Framework

This is a solid architectural foundation for rapidly building maintainable web
applications leveraging the ASP.NET MVC framework with NHibernate. The primary
advantage to be sought in using any architectural framework is to decrease the
code one has to write while increasing the quality of the end product

S#arp Architecture adheres to the following key principles:
•Focused on Domain Driven Design
•Loosely Coupled
•Preconfigured Infrastructure
•Open Ended Presentation


Watch the introduction video on dimecasts.net: # 75 - Introdction to S#arp Architecture . It's an opensource project holded on google code.


2009年5月19日星期二

DataBinding无法绑定到public字段上

DataBind连接UI控件和后台数据源的技术,我们可以非常方便地将它用于DataGridView或ListBox这样的数据控件的数据显示。通过简单地设置一下数据源和所要显示的属性名就可以了:

listBox.DataSource = bindingSource;
listBox.DisplayMember = "propertyName";

上面代码中的DisplayMember就是设置将数据源中对象的哪个属性显示出来。这里需要注意,DisplayMember只能对应到对象的属性(Property)上,不能设置为对象的字段(Field),即使公共字段也不行。对于下面这个对象:

internal class TestBinding
{
public string publicField;

private string publicProperty;

public string PublicProperty
{
get { return publicProperty; }
set { publicProperty = value; }
}
}

如果我们设置绑定:

listSubsetHeaders.DisplayMember = "publicField"; //failed:bind to public field
listSubsetHeaders.DisplayMember = "PublicProperty"; //ok: bind to property

DataBind不允许绑定到公共字段上,必须绑定到属性才行:
One of the reasons why data-binding support is limited to properties happens to
be the fact that all of data-binding is built around PropertyDescriptors and not
on direct reflection.


这里有篇blog讨论了这个问题:Data-binding to public fields... yes or no?

2009年5月15日星期五

Assertion failed: _CrtIsValidHeapPointer(pUserData) in dbgheap.c.

今天将在vs2003中写的c++项目升级到vs2005,结果发现运行的时候报异常了。

Assertion failed: _CrtIsValidHeapPointer(pUserData) in dbgheap.c

对于托管的C++代码,当它们被编译成dll时,默认情况下是不能使用本地c/c++库(Native c/c++ lib)的,这些本地库包括C run-time(CRT)、ATL和MFC。有这个限制是因为在c++.net 的dll中默认不能使用任何的静态变量(除非是像整形这样非常简单的类型),而这些本地库通常都使用了静态变量。在c++.net项目的属性中默认使用/NOENTRY编译参数来实现这个限制。应用了/NOENTRY参数的DLL项目中不能使用CRT、ATL和MFC,否则就会产生异常。而我的C++ 项目中正好使用了MFC的窗体控件,而且是被编译成DLL的,所以报错了。
这个问题的解决办法有两个:
  1. 在编译时仍然使用/NOENTRY参数,但是禁用自动初始化,改为手动初始化所引用的静态变量 。自动初始化CRT、ATL和MFC有可能会产生死锁(DeadLock)。关于如何手动初始化,请参考Microsoft的技术支持文档“You receive linker warnings when you build Managed Extensions for C++ DLL projects”中的“Resolution”部分。
  2. 在编译时去掉/NOENTRY参数。 这是非官方的解决方案,非常简单。

我直接使用了第二种方案,问题解决了。如果你也遇到跟我一样的问题,不妨试试看。

2009年5月13日星期三

第一次遇到在多种语言同时出现在一个真实的项目中

换到新公司了,这里几乎都是用微软的技术,包括.net 2.0/3.5, vs2005/2008, sql server 2005/2008, windows 2003/2008。其中.net 3.5中WPF和WCF的使用非常频繁。以前都听说.net不适用与企业级项目,只能做中小型应用,现在看来情况好像不是这样的。不过微软的解决方案相较于Linux阵营的而言,从成本上好像确实好高出很多,据说我所知公司在开发和运行环境上的投入非常大,这包括微软的软件licence费用和微软的咨询服务收费。公司从开发流程,开发方式以及技术的使用上都是走微软的路子:)

记得在刚学习微软的.net时,书上就介绍说.net平台提供了各种语言之间的互操作性,同一个项目了可以使用各种不同的语言进行开发,只要这些语言是.net兼容的。之前一直以为没有人会这么做的,毕竟不同的语言在写法和思维方式上多少会有些差异,而且同一项目的人在阅读别人的代码会很困难,想象一下突然让你去读你不熟悉的语言,还要修改功能是个什么感觉?

我最近就遇到了这样的问题。在接手现在的项目之前,我只用C#,对于C++不怎么了解,更不用说用它来开发了。可是现在的项目在拿到源代码的时候就傻了,真的,不开玩笑,呵呵。你猜怎么地,混合编程啦,c++和c#语言各完成一部分工作,读起来那叫一个痛苦……

你也许觉得是我不怎么会C++的原因,其实不全是这样。同组的同事中有多年C++背景的,不过他们是纯C++的,不是微软的c++.net,看起来也很头大,基本上认同c++.net的行为比较奇怪,呵呵,看来还是不适应。

Anyway,硬着头皮继续看吧……

2009年4月29日星期三

LinqToSql异常:"you can't new an Entity in a query"

下面这段代码执行的时候就会抛出标题中提到的异常:

public Product GetProduct(int productId)
{
var product = (from p in dbContext.Products
where p.ProductID == productId
select new Product { Name = p.Name, ListPrice = p.ListPrice, ProductID = p.ProductID }
).Single();
return product;
}


原因在于我们在查询语句的最后执行了一个创建新的Product的方法,这就是异常中提到的new entity的意思。在query中我们并不是不能创建对象的实例,而是不能创建“实体”的实例,在linq to sql中实体指的就是与数据库表对应的那个对象,比如这里的Product

为了验证这一点,我们将Product换成别的类,比如ProductData:

public ProductData GetProduct(int productId)
{
var product = (from p in dbContext.Products
where p.ProductID == productId
select new ProductData {
Name = p.Name,
ListPrice = p.ListPrice,
ProductID = p.ProductID
}).Single();
return product;
}

这样就没问题了,query可以正常执行。ProductData类是我们自定义的类,用作DataContract,不是linq to sql的建模工具从数据库生成的。

[DataContract]
public class ProductData
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int ProductID { get; set; }
[DataMember]
public decimal ListPrice { get; set; }
}
所以,如果你得到这个异常,不妨检查看看你的query语句里是否包含了“实体”。