2009年7月24日星期五
drop table if exists in SQL Server
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
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数据
- 运行sql server 2000的DTS包
- DTS包中使用的托管的.NET Framework Data Provider或者是本地OLE DB provider不支持64位模式
- 脚本中引用的其它程序集或Com组件没有64位版本或者没有安装64位版本
cd C:\Program Files\Microsoft SQL Server\100\DTS\Binn上面的例子中我们通过参数的形式重新设置了两个连接的值。在dtexec运行时,每个连接都可以通过一个单独的/connection参数来制定新的值,当有多个连接的时候,就设定多个/connection参数,这个好像在文档中没有提到。
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
参考资料:
64-bit Considerations for Integration Services
2009年7月10日星期五
2009年6月12日星期五
Entity Framework Tips
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
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
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要复活吗?
然而令人意想不到的是,微软数据开发组的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 'null是引用类型,而double是值类型的,?:操作符无法应用到这两者上面。这可能跟大多数人预想的不太一样,一般会认为如果条件为true,那么PE等于null,否则执行Double.Parse的操作并就将结果赋给PE。翻译成代码就是这样的:' and 'double'
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:
值得注意的是这里使用的是default(double?) 而非 default(double),这是因为后者返回0.0,而不是我们所需要的null
double? PE = String.IsNullOrEmpty(txtHistoryPE.Text)
? default(double?) : double.Parse(txtHistoryPE.Text)
2009年6月2日星期二
开始在八一中学体育馆打羽毛球了
昨天终于又去打羽毛球了,这次可能会长久一点,因为一次性订了3个月的场地,每个星期一下午6:00~8:00,两个小时。场地是订在八一中学的体育馆,就在我们公司的楼下,下班直接过去,真近,呵呵。昨天是第一次去那个地方打球,跟公司的3个同事,一个同事的老婆,外加一个微软的哥们,没算错的话应该是6个人一起。八一中学场地是30块一个小时,在北京还算是便宜的了,昨天打了2个小时感觉那的场地还不错,不过灯光稍稍有点暗。
昨天打球用的是亮羽的羽毛球,那是我在北邮门口临时买的,以前经常用的诺地波尔502没有买的。亮羽的球好像没有诺地波尔好用,可是价钱差不多。主要是亮羽的球头太软,打一会头都扁了……
2009年5月26日星期二
Microsoft机器翻译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 productS#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字段上
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.
对于托管的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的,所以报错了。Assertion failed: _CrtIsValidHeapPointer(pUserData) in dbgheap.c
这个问题的解决办法有两个:
- 在编译时仍然使用/NOENTRY参数,但是禁用自动初始化,改为手动初始化所引用的静态变量 。自动初始化CRT、ATL和MFC有可能会产生死锁(DeadLock)。关于如何手动初始化,请参考Microsoft的技术支持文档“You receive linker warnings when you build Managed Extensions for C++ DLL projects”中的“Resolution”部分。
- 在编译时去掉/NOENTRY参数。 这是非官方的解决方案,非常简单。
我直接使用了第二种方案,问题解决了。如果你也遇到跟我一样的问题,不妨试试看。
2009年5月13日星期三
第一次遇到在多种语言同时出现在一个真实的项目中
记得在刚学习微软的.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的建模工具从数据库生成的。
所以,如果你得到这个异常,不妨检查看看你的query语句里是否包含了“实体”。
[DataContract]
public class ProductData
{
[DataMember]
public string Name { get; set; }
[DataMember]
public int ProductID { get; set; }
[DataMember]
public decimal ListPrice { get; set; }
}