ERROR: The version of SQL Server in use does not support datatype 'datetime2'

我把程序中的Entity Framework的SQL2012的数据库转为SQL2005后

出现了错误:

The version of SQL Server in use does not support datatype 'datetime2'.

解决办法:

把.edmx后缀文件中的

<Schema Namespace="NerdDinnerModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2012" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">

改为

<Schema Namespace="NerdDinnerModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">

即可

微软开放了.NET 4.5.1的源代码

.NET Reference Source 发布了 beta 版,可以在线浏览 .NET Framework 4.5.1 的源代码,并且可以通过配置,在 Visual Studio 2013 中调试 .NET Framework

  .NET Framework 团队的项目经理 Alok Shriram 在.NET Framework 的博客中撰文介绍了最新的 .NET Reference Source。它不仅可以用来浏览最新的 .NET 代码,而且通过强大的 Roslyn,改善了“Go to Defination”和“Finding Reference”的在线体验。此外,开发者还可以下载整个源代码包,在 Visual Studio 中打开并浏览。使用 Schabse Laks 编写的插件,可以在 VS 中直接导航到该网站。

  通过简单的配置,开发者可以在 Visual Studio 中单步调试 .NET Framework 4.5.1 及其后续补丁和更新。这无疑是广大开发者翘首以盼的功能。启动 Visual Studio 2013,打开 Tools -> Options -> Debugging -> General 菜单,进行如下配置:

  • 禁用 Just My Code
  • 禁用 Step over properties and operators
  • 禁用 Require source files to exactly match the original version
  • 选中 Enable .NET Framework source stepping
  • 选中 Enable source server support

  这样,开发者在调试代码时,就可以通过 F11 直接进入 .NET 代码。

  这并不是微软第一次开放 .NET Framework 的源代码。早在 2007 年,他们就第一次公布了 .NET 3.5 的源代码并支持 Visual Studio 调试。并且对于后续的 4.0 和 4.5,也都提供了相应的源代码包。但当框架升级时,这些旧的包就变得毫无价值了。从 4.5.1 开始,.NET Framework 团队彻底改变了符号索引和发布的过程,使其与构建过程同步,这样在新版本发布时,相应的 PDB 文件也会从 Reference Source 网站进行更新。

  目前的 beta 站点只是临时的,届时将会取代现在的旧站点。后续微软也会将还未公布源代码的程序集逐步添加进来。

  新的 .NET Reference Source 许可协议回归到了 MS-RSL,这也使得像 Mono 这样的团队可以放心大胆地使用。

  正如 Scott Hanselman所说:微软可能并不是开源的,但却绝对是源代码开放的。

SQL Server 2005/2008 加密存储过程解密

SQL Server 2005 以上存储过程无法进行查看和编辑,解密存储过程代码如下:

Create PROCEDURE [dbo].[sp_windbi$decrypt]
(@procedure sysname = NULL, @revfl int = 1)
AS
/*
调用形式为:
exec dbo.sp__windbi$decrypt @procedure,0
如果第二个参数使用1的话,会给出该存储过程的一些提示。
--版本4.0  修正存储过程过长解密出来是空白的问题
*/
SET NOCOUNT ON
IF @revfl = 1
BEGIN
PRINT '警告:该存储过程会删除并重建原始的存储过程。'
PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。'
PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'
PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。'
RETURN 0
END
DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@procNameLength int
select @maxColID = max(subobjid) FROM
sys.sysobjvalues WHERE objid = object_id(@procedure)
--select @maxColID as 'Rows in sys.sysobjvalues'
select @procNameLength = datalength(@procedure) + 29
DECLARE @real_01 nvarchar(max)
DECLARE @fake_01 nvarchar(max)
DECLARE @fake_encrypt_01 nvarchar(max)
DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max)
declare @objtype varchar(2),@ParentName nvarchar(max)
select @real_decrypt_01a = ''
--提取对象的类型如是存储过程还是函数,如果是触发器,还要得到其父对象的名称
select @objtype=type,@parentname=object_name(parent_object_id)
from sys.objects where [object_id]=object_id(@procedure)
-- 从sys.sysobjvalues里提出加密的imageval记录
SET @real_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procedure) and valclass = 1 order by subobjid)

--创建一个临时表
create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL ,
[real_decrypt] NVARCHAR(MAX) )
--开始一个事务,稍后回滚
BEGIN TRAN
--更改原始的存储过程,用短横线替换
if @objtype='P'
  SET @fake_01='ALTER PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='FN'
  SET @fake_01='ALTER FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END'
else if @objtype='V'
  SET @fake_01='ALTER view '+ @procedure +' WITH ENCRYPTION AS select 1 as col
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='TR'
  SET @fake_01='ALTER trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
EXECUTE (@fake_01)
--从sys.sysobjvalues里提出加密的假的
SET @fake_encrypt_01=(SELECT top 1 imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procedure) and valclass = 1 order by subobjid )
if @objtype='P'
  SET @fake_01='Create PROCEDURE '+ @procedure +' WITH ENCRYPTION AS select 1
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='FN'
  SET @fake_01='CREATE FUNCTION '+ @procedure +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/ END'
else if @objtype='V'
  SET @fake_01='Create view '+ @procedure +' WITH ENCRYPTION AS select 1 as col
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
else if @objtype='TR'
  SET @fake_01='Create trigger '+ @procedure +' ON '+@parentname+'WITH ENCRYPTION AFTER INSERT AS RAISERROR (''N'',16,10)
  /**//*'+REPLICATE(cast('*'as nvarchar(max)), datalength(@real_01) /2 - @procNameLength)+'*/'
--开始计数
SET @intProcSpace=1
--使用字符填充临时变量
SET @real_decrypt_01 = replicate(cast('A'as nvarchar(max)), (datalength(@real_01) /2 ))
--循环设置每一个变量,创建真正的变量
--每次一个字节
SET @intProcSpace=1
--如有必要,遍历每个@real_xx变量并解密
WHILE @intProcSpace<=(datalength(@real_01)/2)
BEGIN
--真的和假的和加密的假的进行异或处理
SET @real_decrypt_01 = stuff(@real_decrypt_01, @intProcSpace, 1,
NCHAR(UNICODE(substring(@real_01, @intProcSpace, 1)) ^
(UNICODE(substring(@fake_01, @intProcSpace, 1)) ^
UNICODE(substring(@fake_encrypt_01, @intProcSpace, 1)))))
SET @intProcSpace=@intProcSpace+1
END

--通过sp_helptext逻辑向表#output里插入变量
insert #output (real_decrypt) select @real_decrypt_01
--select real_decrypt AS '#output chek' from #output --测试
-- -------------------------------------
--开始从sp_helptext提取
-- -------------------------------------
declare @dbname sysname
,@BlankSpaceAdded int
,@BasePos int
,@CurrentPos int
,@TextLength int
,@LineId int
,@AddOnLen int
,@LFCR int --回车换行的长度
,@DefinedLength int
,@SyscomText nvarchar(max)
,@Line nvarchar(255)
Select @DefinedLength = 255
SELECT @BlankSpaceAdded = 0 --跟踪行结束的空格。注意Len函数忽略了多余的空格
CREATE TABLE #CommentText
(LineId int
,Text nvarchar(255) collate database_default)
--使用#output代替sys.sysobjvalues
DECLARE ms_crs_syscom CURSOR LOCAL
FOR SELECT real_decrypt from #output
ORDER BY ident
FOR READ ONLY
--获取文本
SELECT @LFCR = 2
SELECT @LineId = 1
OPEN ms_crs_syscom
FETCH NEXT FROM ms_crs_syscom into @SyscomText
WHILE @@fetch_status >= 0
BEGIN
SELECT @BasePos = 1
SELECT @CurrentPos = 1
SELECT @TextLength = LEN(@SyscomText)
WHILE @CurrentPos != 0
BEGIN
--通过回车查找行的结束
SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,
@BasePos)
--如果找到回车
IF @CurrentPos != 0
BEGIN
--如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@CurrentPos-@BasePos + @LFCR) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) +
@BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + @LFCR), N'')
SELECT @BasePos = @CurrentPos+2
INSERT #CommentText VALUES( @LineId, @Line )
SELECT @LineId = @LineId + 1
SELECT @Line = NULL
END
ELSE
--如果回车没找到
BEGIN
IF @BasePos <= @TextLength
BEGIN
--如果@Lines长度的新值大于定义的长度
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@TextLength-@BasePos+1 ) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength -
(isnull(LEN(@Line),0) + @BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded =
0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N'')
if LEN(@Line) < @DefinedLength and charindex(' ',
@SyscomText, @TextLength+1 ) > 0
BEGIN
SELECT @Line = @Line + ' ', @BlankSpaceAdded = 1
END
END
END
END
FETCH NEXT FROM ms_crs_syscom into @SyscomText
END
IF @Line is NOT NULL
INSERT #CommentText VALUES( @LineId, @Line )
select Text from #CommentText order by LineId
CLOSE ms_crs_syscom
DEALLOCATE ms_crs_syscom
DROP TABLE #CommentText
-- -------------------------------------
--结束从sp_helptext提取
-- -------------------------------------
--删除用短横线创建的存储过程并重建原始的存储过程
ROLLBACK TRAN
DROP TABLE #output
go

TFS2013升级Update 2错误 - TFS255440

TF255440: The following account has a SQL Server login, but the login was denied access: lsw\lishewen. The server selected to host the databases for Team Foundation Server is: lswserver. The SQL Server login associated with the user account must be granted access to the SQL Server instance on that server.

解决方法:

首先将你的账号加入sqlserver管理员组(如果是,则不用加)

如security\logins下添加账号   赋予systemadmin,serveradmin权限

利用旧版Android漏洞的E-Z-2-Use攻击代码发布

  利用 Android 操作系统 WebView 编程接口漏洞的攻击代码已作为一个模块加入到开源漏洞利用框架 Metasploit 中。漏洞影响 Android 4.2 之前的版本,Google 在 Android 4.2 中修正了这个漏洞,但根据官方统计,超过五成用户仍然使用存在漏洞的旧版本。

  WebView 的漏洞允许攻击者在 Android 浏览器和其它应用中注入恶意 JavaScript 代码,获得与目标程序相同的访问权限,攻击者可以开启一个 shell 窗口访问受害者的文件系统、照相机,地理位置数据、SD 卡数据和地址簿。漏洞还可通过不安全网络的中间人攻击触发。漏洞存在于 Android 系统中,而不是私有的 GMS 应用平台,只有更新系统才能修正漏洞。安全研究人员 Tod Beardsley 希望,攻击代码的披露能迫使供应商尽快升级系统。

ECShop实现立刻购买与添加到购物车并存的方法

在后台开启“一步购物则”可以不用到购物车“直接结算” 。从而实现立刻购买。然而购物车的功能又没有了。有没有像淘宝那样即可以立刻购买。又有购物车功能呢?

    1、首先我们先将“添加购物车”的跳转链接复制替换“收藏商品”的按钮上然后设一个bool值为1 。

<a href="javascript:bool =1;addToCart({$goods.goods_id})">。

    2、然后打开JS处理文件“common.js” ,在这个脚本的第��行代码之上加一个全局变量var bool =0; 查找点击购物车之后的那条链接即:flow.php?step=cart  ,找到这个(在第88行
那块)之后,在下面加这句话(bool == 1) && (cart_url = 'flow.php?step=consignee');

    意思是 当bool = 1 条件满足时 则cart_url链接到  'flow.php?step=consignee' 直接购买的页面

    这样就实现了“立刻购买”与“添加到购物车”并存的方法

如何在Windows Store应用闪退的时候自动生成dump

    当开发者在测试或者用户使用Windows store 应用的时候,我们可能希望Windows store程序能够在发生异常的时候自动生成dump文件以便于以后分析。在写桌面应用的时候,我们可以通过调用API MiniDumpWriteDump来实现。但是这个API在Windows store应用中是不被支持的。那么有没有其他办法来生成dump了呢? 其实以前的Windows Error Reporting机制针对Windows store应用还是有效的,所以你可以通过改写注册表的办法让应用程序自动生成dump,具体步骤如下:

1) 运行REGEDIT.EXE 找到 “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps”. 如果该键不存在的话则新建LocalDumps 键,。

2) 创建一个与你的Windows store应用进程同名的子键,比如说MyApp.exe。

3) 在子键中创建一个名为DumpFolder,类型为REG_EXPAND_SZ的值,设置它的值为你需要生成dump的目录(保证要存在),比如说C:\Dumps。

4) 在同一个子键中创建一个名为DumpCount,类型为REG_DWORD的值,设置他的值为5 (生成dump的最大数目)。

5) 在同一个子键中创建一个名为DumpType,类型为REG_DWORD的值,设置他的值为2 (full dump)。

其结果如图所示:

这样在你的Windows store应用闪退的时候就可以自动得到full dump了。你可以将上述注册表键值放在一个注册表文件中,当用户有闪退的情况是,让用户倒入该注册表文件,然后将生成的dump文件上传。

别错把需求当市场

  创业团队经常弄混了「需求」与「市场」的差别,从根本上说,需求是需求,但市场的构成除了有需求存在,还得有供给,同时透过共识的价格交集而成交,方能形成市场。简单说,有需求未必能形成市场,那得看供给与价格;反过来说,只有供给而不存在需求,或者供给与需求具备但价格没有共识,市场也不存在。

  虽然是很简单的道理,但我还是经常发现多数团队并没有把重心摆在谈论「市场」,而是谈论「需求」,甚至连需求也没碰触到,只谈自己做了什么、想做什么,仿佛产品、服务做出来就卖得掉,这当然是比较不成熟的创业观点,但事实上多数团队就是如此。

  当局者迷是很正常的事,即便我自己创业过几次,每每听到不错的点子还是会瞬间陷入「过度放大」的迷思里,一下子以为可以接触的市场很大,可以满足的需求很多,但实际上根本就只有很少数的消费者才可能采用这个产品或服务,这当中最大的问题还不在于消费者少,而在于你根本不知道这群消费者在哪里。

  等到奋不顾身执行下去才恍然大悟,原来要搜寻出这群人得花非常多钱,然而业绩成长速度跟不上你的烧钱速度,自己都开始怀疑当初的想法是否真的有这么好,追本溯源来说还是老话那一句,只想到自己想做的,以为点子很好,但这都是供给端、制造端的思维,完全忽略了「需求」,更别提到底有没有存在那个你自以为存在的「市场」。

  举一个最近朋友的案例,一个多月前他偶然知道,原来自己某个远亲是在种苹果的,品质优良又可口,当他了解零售的苹果价格与生产端有不小的差距后,自己兴起了想直接跟远亲批苹果去卖的念头。他认为他有巨大的成本优势,透过网路去卖应该可以有不少的利润,于是跑来跟我聊他的点子可不可行。

  于是我问他是否知道苹果零售市场一年多大产值?市售苹果有几种?消费者多半都在哪里购买?是菜市场、大卖场、便利商店还是其他?分别是哪些人去买?买苹果的理由或需求是什么?不同品种的苹果大约落在什么价位?如果多数消费者在实体通路卖,那虚拟通路是加分还是减分?

  他听完我的问题,顿时愣了一下,不知道该怎么回答。不过他这样的情况还算是好的,因为至少「苹果零售市场」是存在的,也就是说最差的情况下,他就是去菜市场租个小摊位卖苹果,再怎么糟糕应该一天也能有个几百块进帐,划不划算就是另一回事,但很多团队是自己做了一个产品,却不知道最后应该跟谁收钱?哪些人会付钱?这就是因为没弄清楚到底最后该走向什么市场的原因。

  如果是我,我会先把上述的「市场」问题先弄清楚,接着才是思考应该怎么切入「苹果零售市场」。比方说,假设苹果零售市场一年有 50 亿的成交值,其中实体通路与虚拟通路大约是9:1,实体通路中菜市场、大卖场、便利商店各占1/3,网路与电视购物则是各1/2;菜市场购买的族群是婆婆妈妈,平均年龄 40 岁以上;大卖场则是以小家庭为主,便利商店则是 25 岁左右的 OL;以需求来说,妈妈们买苹果可能是给家人吃,或者新手妈妈是打成苹果泥给小 baby 吃;为了健康因素吃的可能占了 50%,为了加入沙拉当作正餐的因素可能占了 20%。

  分析完之后可能你最后卖的未必是苹果本身,而是选择卖苹果泥,切入苹果零售的网路市场,同时针对新手妈妈为销售对象,也因此产生了广告费该买什么关键字,或者该与有许多新手妈妈存在、活跃的网站策略合作,部落客也专找有影响力的新手妈妈撰写专文推荐。

  这里我想说的重点是「顺序」,就是你得先有「市场」为基础的分析,于是有了某种商业出发点,接着才去探讨消费者行为背后的需求,进而衍生出你可能可以做什么产品或服务,去满足这个需求,进而切入该市场。这样就能确保你做出来的东西可以对应到某个市场去,而不是做出来了却不知道自己应该怎么走下去。

  这道理不会只用在卖苹果,卖任何东西都一样,必然会指引你走向某个特定的市场--「有供、有需、有共识价格的市场」,而不是你自以为会有的需求。诚如我所说,Google 并不是经营一个「搜索市场」,因为没有人为搜索付费,这是一个只有供给没有付费的「需求」,同理 Facebook 是经营一个「社交网站」而非「社交市场」,但他们两者都从「(网路)广告市场」赚钱,而广告市场老早就存在,至少网路兴起之前,多数广告是买在报纸、杂志跟电视。

  因此,无论你的创业多创新,你的收入来源最终必然指向某个「市场」,而且通常是既有的、存在许久的市场。历史上,只有非常非常少数的发明可以创造「新市场」,你会不会是那个引领潮流的人要看你的本事,但如果你没什么资源,或者创业经验还不够,我会建议你尽可能别去做「创造市场」的创业路,而是去做一个可以从既有市场赚到钱的创业路,应该会比较妥当一些。即便你认为自己的产品很创新,但产品的创新未必能真正创造新市场,因为最终它还是得回归到能解决某些问题,对应某个市场,你才赚得到钱。

  总而言之,别错把需求当市场,需求只是市场的一部份,有人真正愿意为你所做的事情掏钱才是商业的基础,也是你创业的根本之道。胜兵先胜而后求战,败兵往往是先战而后求胜,虽然看起来只是次序不同,但其中风险与经营智慧却是天壤之别。

诺基亚发布“Lumia软件恢复工具”

早在Symbian时代,诺基亚就有过一款名叫“Nokia Software Recovery”的工具软件。有了它,人们就能够轻松地自行擦除内部软件和数据、甚至还可以选择重装软件。遗憾的是,在Lumia系列智能机于市场上冲锋陷阵的这几年里,诺基亚却移除了这款工具。不过今天,Nokia Care已经重新发布了“Software Recovery Tool for Lumia devices”。

该软件与其前辈一样地出色。如果你的Lumia设备遇到了软件问题或故障(如失去响应、卡住、无法启动等),Nokia Software Recovery Tool就能够帮助你恢复手机,同时安装更新。

该工具会自动检测设备并下载相应数据。根据设备的不同,该工具的数据下载量可以多达4GB。当然,有些事情你得注意——请务必在Windows 7或版本更高的系统中运行、并注意保存现有重要数据的备份!(除非设备已彻底变砖)

Nokia Software Recovery Tool传送门:

http://www.nokia.com/us-en/support/software-recovery/