使用vsto对office进行二次开发时,一般会自定义任务窗格!但有时我们并不需要在打开office时都带上任务窗格。而且对于一些外部用户(没有安装office二次开发产品的用户),打开同样的文档时会弹出烦人的提示窗口。那么如何将任务窗格跟office分离呢?
在需要的地方加上,以下代码:
if (ServerDocument.GetCustomizationVersion(targetfilepath) == 3) ServerDocument.RemoveCustomization(targetfilepath);
使用上面的代码要引用
using Microsoft.VisualStudio.Tools.Applications;如下图

注意版本
然后再次打开保存过的文档,会发现任务窗格已经没有了!!!
下面的是我的一个例子,我在vs2010中新建了一个“excel模板”项目,在任务窗格中添加了一个按钮,用来自定义“另存为”功能,但是用户要求是另存为后,只想看到office文档,不要任务窗格。所以有代码如下:
private void btnSaveAs_Click(object sender, EventArgs e)
{
try {
string targetfilepath = @"D:\学习\DesignPattern\练习\WinformTest\ExcelTemplateTest\ExcelTemplateTest14.xlsx";
Globals.ThisWorkbook.SaveCopyAs(targetfilepath);
if (ServerDocument.GetCustomizationVersion(targetfilepath) == 3) ServerDocument.RemoveCustomization(targetfilepath);
}
catch (Exception ex) { throw ex; }
finally {
Globals.ThisWorkbook.ThisApplication.UserControl = true;
Globals.ThisWorkbook.Close();
Globals.ThisWorkbook.ThisApplication.Quit();
}
}
1.首先定位csc.exe文件路径:一般来说是C:\Windows\Microsoft.NET\Framework\v4.0.30319(v4.0.30319是版本号,具体版本号取决你实际安装的版本);
2.开始-运行-键入cmd,把上面的路径粘贴过去,并在最后加上“\csc”,效果图如下:

此时我们已经可以键入“ -?”来验证能否正确运行,如果成功会把参数提示列表显示出来,失败则需重新定位csc.exe文件路径。如下图:

3.运行csc.exe 需要输入必要的参数,具体参数大家可以参考其它资料,这里仅仅说明几个本例中需要的参数
/target:library 可以简写为 /t:library 生成库
/out:<文件名> 此文件名包含路径,表示要生成的库文件名和路径,例如 /out: d:\test\a.dll.也就是说将把编译后的a.dll生成到d:\test\路径下。注意:如果没有写路径,只写了类库名称,如 /out:a.dll。那么a.dll文件将生成到命令行最开始字符所在盘符,如下图,a.dll将生成到G盘根目录。

4.指定类库的生成路径后,我们还要进一步的指定源文件在,也就是告诉csc将要编译那些文件。那么如何告诉呢?很简单,在上图中继续键入源文件路径即可。比如你的.cs文件路径如下:f:\csctest\programm.cs。那么效果将如下图:

注意:f前面有空格
这样你就可以把programm.cs文件编译到d:\test\a.dll文件里了。
如果你想编译指定目录下的所有cs文件都编译到a.dll文件中,那么把programm.cs改成*.cs即可。
至此你就可以实现手动编译了。
是不是仅仅通过判断一个对象有没有真正的标识符来确定它到底是不是实体?那么对于一个Person类,如果只有姓名,年龄,性别属性,那么它就不是实体,如果它包含了身份证号属性(排除身份证号重复的情况,这是一帮不负责任的二人搞出来的),那Person类就是实体了?而且领域驱动模型精简版中有这么一句话:"因此,在软件中实现实体意味着创建标识符"。
以下是对msdn中关于sp_excutesql存储过程描述的理解:
msdn关于sp_excutesql的描述分成三个方面:
自包含批处理:
理解自包含批处理最好先理解“批处理”的概念。“批处理”是个名词,msdn中对批处理的解释是:批处理是同时从应用程序发送到 SQL Server 并得以执行的一组单条或多条 Transact-SQL 语句。SQL Server 将批处理的语句编译为单个可执行单元,称为执行计划。
自包含批处理就是:当 sp_executesql 或 EXECUTE 语句执行时,语句中的字符串将作为它的自包含批处理执行,也就是说sp_executesql 或 EXECUTE 语句中的字符串会被编译成独立的执行计划。例如:
DECLARE @CharVariable CHAR(3);
SET @CharVariable = 'abc';
EXECUTE sp_executesql N'PRINT @CharVariable';
GO
上面语句的其实是两个批处理,首先是go语句之上(包括go语句)的是一个批处理,sp_executesql N'PRINT @CharVariable';是另一个批处理(自包含批处理)。SQL Server将这两个批处理分别编译成执行单元。所以上面的例子在执行时会报以下错误:必须声明标量变量 "@CharVariable"。也就是说sp_executesql 存储过程根本访问不到"@CharVariable变量。
另外,还有以下几点需要注意:
(1)在执行sp_executesql 或 EXECUTE 语句之前,不会将它的自包含批处理编译到执行计划;在执行自包含批处理之前,不会分析或检查其错误,执行时再检查。
(2)如果在sp_executesql 或 EXECUTE 的自包含批处理中包含一个更改数据库上下文的USE语句,那么这个更改仅持续到sp_executesql 或 EXECUTE 语句运行结束。例如:
USE master;
GO
EXECUTE sp_executesql N'USE AdventureWorks2008R2;'
GO
/* This statement fails because the database context
has now returned to master. */
SELECT * FROM Sales.Store;
GO
上面的例子包含三个批处理,其中一个是sp_excutesql的自包含批处理。这个例子将不能正确运行,因为自包含批处理中虽然将数据库设置成了AdventureWorks2008R2,但是该语句执行完后,数据库又立刻换成了master,所以select语句中将找到不到Sales.Store对象。
替换参数值:
这一点msdn讲的非常全面而且细致,它在sp_executesql 或 EXECUTE的对比中得到体现:
sp_executesql 支持替换 Transact-SQL 字符串中指定的任何参数值,但 EXECUTE 语句不支持。因此,由 sp_executesql 生成的 Transact-SQL 字符串比那些由 EXECUTE 语句生成的字符串更加相似。SQL Server 查询优化器可能将 sp_executesql 的 Transact-SQL 语句与以前所执行的语句的执行计划相匹配,从而节省编译新的执行计划的开销。
使用 EXECUTE 语句,所有参数值都必须转换为字符或 Unicode,并成为 Transact-SQL 字符串的一部分。
如果重复执行语句,则即使只有提供的参数值不同,每次执行时也必须生成全新的 Transact-SQL 字符串。这样就会以下列方式生成额外的开销:
(1)不断更改字符串文本(特别是复杂 Transact-SQL 语句)中的参数值,会影响 SQL Server 查询优化器将新的 Transact-SQL 字符串与现有执行计划相匹配的功能。
(2)每次执行时均必须重新生成整个字符串。
(3)每次执行时必须将参数值(非字符或 Unicode 值)转换为字符或 Unicode 格式。
上面是msdn的原话,本来想用自己的语言再描述一遍,但是发现msdn的描述已经很简洁明了,不用画蛇添足了。
重用执行计划:
在 SQL Server 早期版本中,唯一可以重用执行计划的方式是将 Transact-SQL 语句定义为存储过程并让应用程序执行该存储过程。这会产生管理应用程序的额外开销。使用 sp_executesql 可有助于减少此开销,并允许 SQL Server 仍重用执行计划。当提供给 Transact-SQL 语句的参数值只有一个变量时,如果要多次执行 Transact-SQL 语句,则可以使用 sp_executesql 而不要使用其他存储过程。因为 Transact-SQL 语句本身保持不变,仅参数值发生更改,所以 SQL Server 查询优化器可能会重用第一次执行时生成的执行计划。
实际上,我们在应用程序中多数不会直接使用sp_executesql 作为存储过程的名称,因为它不具有任何含义,理解起来不方便。
1.读取域账户信息:
string username = Request.ServerVariables["LOGON_USER"];
摘要: 首先请确保GetType方法中的字符串所代表的程序集已经被引用,除非调用类和被调用类都在一个程序集里。然后记得在字符串中除了包括类型的完整限定名之外,还得包括程序集名称(比较安全的方式),如string typename = "CAI.Domain.UIA.FormLogin";AbstractLogin login = (AbstractLogin)System.Activator.Create...
阅读全文
摘要: 干了这么多年编程,发现今天被一个数据库连接字符串给整蒙了,惭愧,知耻而后勇!加油吧 <add name="SqlConnectionUIA" connectionString="data source=192.168.0.20;Integrated Security=SSPI; Initial Catalog=web2.0; UID=sa;Password=sa" providerName="S...
阅读全文
摘要: 最近在读程杰老师的《大话设计模式》,个人感觉是绝佳的设计模式入门学习必备资料,它通过生动简洁的例子能让你迅速了解各个模式。今天学习Builder模式时,突然发现Builder模式和Strategy模式的类图非常相似。因此写下本文用于比较两个模式,深化对两个模式的认识。先来看创建者模式的类图再来看一下策略模式的类图通过比较两者的类图,发现两者还是很相似的,都有一个抽象类,然后是具体实现类,最后是一个第三方类来组织和维护抽象类。不同的是创建者类还有一个产品类。但是从功能上来说两者相差很远:(1)建造者模式是创建型的,也就是说用来创建对象的,而策略模式属于行为型模式,通过将行为封装成对象来降低类之间
阅读全文
摘要: 思路:因为AD本身就是一棵树,而且.Net Framework中提供了对AD的操作对象(DirectoryEntry).该对象包含children和parent属性.所以利用这些属性使用递归算法可以批量生成Insert语句.获得这些SQL语句后,你就可以按照你想要的方式来执行了. 假设你的部门表有三个字段:DeptID,DeptName,ParentDeptID.根据一般情况,DeptID分类两种类型:整型和GUID类型.DeptName为字符型,ParentDeptID跟DeptID一致. 先说DeptID为GUID类型: 这种情况比较简单,因为window os 中的AD存储时,默认使用.
阅读全文