64位系统 VS2010 各种问题 及 提示“ORA-06413: 连接未打开”

今天在把asp.net系统改为oracle数据连接时,确实出了N多问题,到最后也一一解决了,

连接符:Data Source=SHServer;User ID=lcdtjk;Password=lcdtjk;Provider=MSDAORA

 

ORA-06413: 连接未打开

连接数据库的程序所在的路径是不允许有怪字符的。

2010在windows 2008 64位版本下安装时,默认有个program files ( x86 ) ,就是这个“()”引起的;

修改2010的安装目录,则在form程序中新建数据源,测试通过了;

但是新建web程序,手写连接数据库,运行,仍然提示“ORA-06413: 连接未打开”;

原来在项目中运行web程序,默认是使用vs内置web服务器(develop server),而这个内置服务器的程序被安装在了c:/program files(x86)/common files/ 下面,这里也用到了”(“,因此造成了错误。

但是目前也没有找到在安装时能够修改这个内置server的安装路径的地方。

所以这里只用了一个方法绕开内置server。那就是使用本机IIS来调试程序。在解决方案中,选中web项目点右键选属性,在web标签下可以把调试服务器该为本机iis。这是再调试web程序,连接数据库成功了。

 

把程序放在windows 2008 R2 64bit的服务器上,处理Excel时出现上面的错误。

解决方法,是到服务器的打开IIS管理器。go to Application Pool,找到对应站点的池。右击Advanced setting… 参考下图,把Enable 32-Bit Application 设为由False 为True。

android插入大批量数据缓慢的问题

在公司负责的android项目,初始化从服务端同步数据时,需要向sqlite中插入大约8000条数据,导致应用启动过慢,大约需要10-20分钟时间。

android使用的是sqlite数据库,sqlite是比较轻量级的数据库,性能不及mssql、oracle等,在Google了之后发现,sqlite事务处理的问题,在sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始8000条记录也就是要8000次读写磁盘操作。

解决方法:

添加事务处理,把8000条插入作为一个事务

aspx最小化html 压缩html 去空字符

对网站的代码、资源的压缩,可以提高网站打开速度,减少请求次数,节省流量,提高用户体验等,好处肯定多了 最重要的是不用花一分钱。

我一直觉得一个优秀的站长,一定不能是开发者。我个人就是身有所处,开发者总希望把自己的程序优化到极致,无止尽的折腾,不断的最求完美。虽然说是细节可以决定成败,其实更多时候任何优化都不是关键,时机才是最重要的。说了这么多,又跑题了。。。

压缩包括web服务器的压缩,比如iis6,7就有动态压缩 静态压缩gzip,其实那些都是web服务器和解析的浏览器之间的压缩方式,如果你是个coder,当然还可以进一步的压缩。

之前应该介绍过使用AjaxMin,YUICompressor.NET等工具压缩css和js等文件(不记得是否真写过了)。至于html的压缩,在C#方向的资源比较少见,大家可以看ikanman.com,右键查看源代码,里面的html代码是没有任何空字符比如换行、空格和注释文字的,其实源码里面当然有 不然怎么看得懂呢。

原来我是用的是用正则的方式来去除空字符,代码如下:

如果希望压缩aspx自动输出的html代码,可以覆盖Render方法来实现,代码如下:

注意#if !DEBUG的功能是在web.config里的debug=false的时候才去空格,这样可以在开发环境看到正常的代码。

但是处理的页面多了以后发现正则不那么好处理,因为html中代码注释的情况很多有的如下

这些格式的代码也会被错误的过滤掉。于是发现了google code上有一个叫htmlcompressor开源项目,非常好用项目地址:https://code.google.com/p/htmlcompressor/,遗憾的是没有c#版本,只支持php和java,只好自己改了一个。用法如下:

是不是很方便呀,还有很多高级选项可以设定呢。详细用法请在官网查看吧!

使用vs2012的web deploy发布文件写权限丢失的问题

最近用美国虚拟主机试了一下vs2012的新功能web deploy。其实和vs2010的ftp发布类似更先进,更适合发布web应用类型的项目。但是随即发现一个问题,每次用web deploy发布之后,会丢失web目录的“写”权限。

于是我就不淡定了,首先找主机商arvixe发邮件,技术支持给我回了个:

Hello,

If the permissions are getting altered after deployment then I would request you to please refer :
http://blog.arvixe.com/when-publishing-an-application-using-visual-studio-2012-file-permissions-are-altered/

 

这是他们的博客,有很多技术解答,可是我怎么翻通过各国代理都无法打开这个文章。。。看关键词我想应该不是他们控制面板的问题,于是在网上查了下类似的情况,终于在微软的官网修改pubxml教程上找到了原因。

http://msdn.microsoft.com/en-us/library/ff398069.aspx

For example, suppose that you want to disable the default setACL behavior of Visual Studio deployment. By default, Visual Studio sets read permissions on the root folder of the destination site and write permissions on the App_Data folder. If you know that the default permissions on folders are correct and don’t need to be set, you can disable this behavior for a specific publish profile by adding the following XML to the publish profile file:

修改pubxml的情况,例如,如果你想禁用的Visual Studio部署时的默认SETACL行为。默认情况下,Visual Studio发布的ACL设定是将目标站点的根目录设置为只读权限,对App_Data文件夹设置克写权限。如果你需要这样的文件权限就不需要修改设置,不然,请修改pubxml:您可以在发布配置文件里加入这段代码禁用此ACL设定:

SqlServer2012新函数TRY_CONVERT不存在的问题解决

今天开发中在select列中使用convert把字符串转换成日期格式,有些字符串转换会报错,造成翻页翻着翻着就会500错误,由于需要生日字符串转换年龄还要排序,所以又无法在c#李转换.

我想c#里有tryparse,sql里搞不好也有。好在发现了有TRY_CONVERT 函数的存在,运行语句测试报错:

问题描述.
我们在SQL Server Management Studio中对数据库在SQL Server2012实例,试图运行下面的SELECT语句时:

SELECT TRY_CONVERT(date, ‘birthday’)

接收到服务端报错:(我是英文数据库服务器,中文可能是该函数没有定义)

Msg 195, Level 15, State 10, Line 1
‘TRY_CONVERT’ is not a recognized built-in function name.

 

造成原因.

这个sql语句不能够运行在 SQL Server 2005 (90)或SQL Server 2008 (100)的兼容级别.

 

解决办法.

数据库上右键, 选择属性, 然后切换到选项页, 修改数据库的兼容级别为sql2012( 110).

修改兼容级别到110后, 查询就可以成功了.

 

另外,如果没有权限进入数据库属性设置页的话,也可以通过sql命令修改:

htc one/m7 最新固件Firmware 3.57.401.500修改版(开机无红字)

htc one/m7开发者版发布了sense5.5,   ARHD 30就是基于这个RUU,为了配合这个RUU稳定使用,强烈建议把固件刷到3.57.401.500版。

最新HBOOT修改版固件 ( 3.57.401.500 没有红色警告文字 )

https://www.dropbox.com/sh/6y7ax3jru…b/firmware.zip

需要注意的是,modelid和cidnum必须对应你的机器,我的modelid是:PN0711000也就是大家常说的台版,如果你需要刷的机器不同请在固件包中android-info.txt文件修改这两个值.

不同的牛丸版本所对应的modelid和cidnum可以在以下链接中找

http://forum.xda-developers.com/showthread.php?t=2182823

刷固件必须: S-OFF

去掉了开机时如下的红字警告

This build is for
development purposes only
Do not distribute outside of HTC
without HTC’s written permission.
Failure to comply may
lead to legal action.

这不是什么创新,每个人都可以自己改,只是为了方便大家!!!

刷新的步骤:

—–

-需要用到adb和fastboot命令
—–

首先将手机连接USB,在命令行下输入

—– 手机重启—

再输入:

接着再输入:


 

注意:执行此命令后手机会进入黑屏中间一个银色HTC标志,和刷新官方RUU时一样。
注意:如果这个命令执行失败死机了,只要拔下USB接口,同时按住音量减和电源直到手机重启。然后,再次重复上述步骤。

最后:

命令行执行如下:

 

上面居然“FAILED”,不要急~重复相同的命令:

 

执行结果如下:

 

注意:这时手机屏幕的绿色进度条就算没有到100%,也不用去管它…一切都OK。

最后一步:

手机成功重启进入系统,然后再重启到到bootloader模式:

检查你的固件升级是不是成功:

开启sense5.5 归属地 IP拨号 国内天气源 等等国行功能

sense5.5将系统框架定义做到了system\customize\ACC\default.xml里,大家打开这个xml;

搜索:
<item type=”integer” name=”region”>3</item>
这个地区设定即可设定rom的框架属性,是国行就为3,国际版为6、0等等其他的数字,具体还没研究,但国行肯定是3,这样国内天气源、IP拨号、通话录音等一些功能就都打开了,当然2G也能更新天气了~

<item type=”integer” name=”sku_id”>29</item>
我曾在微博上咨询过HTC技术,到了sense5以后,HTC用sku_id定义替代了原来的project定义,意味着修改这个可以转换网络模式了,比如你要打开H+等仅对中国联通开启的符号,联通的代号是1d(16进制),转换成10进制就是29;
很多人问我发的那个全是代码的微博是什么意思,就是这个意思,那是不同运营商的sku_id代码;国外的兄弟们可以根据这个自己来改网络模式

<item type=”boolean” name=”support_minor_quicksettings”>true</item>
这是打开下拉菜单顶部那个一行快速设置,会显示全部快速设置的前5个;而全项快速设置可以自己设定~~

<item type=”integer” name=”cityidinfo_support_type”>1</item>
一看就知道是归属地支持啦~~~这个设置为1就打开归属地支持了,很方便了吧,但还需要手动添加system\app\CallerLocation.apk那个归属地数据库,国际版的rom里是没有这个数据库的,很多民间rom这个数据库叫googlelocation.apk,因为我最早做出归属地时为了防止用户误删这个apk就改成了google开头的文件,结果很多来搬运归属地的romer直接就搬运过去了,导致后来这个名字也快普及了~~

还有,如果你按照我上面的修改后,会发现国行的一些特点,如E下面的小对勾,左上角的apn状态信息(小箭头)也都出来了,没办法,国行就这样子,需要单独修改apk进行关闭,相信有一定基础的人应该知道怎么关闭了,原理和之前发的教程一样,但具体修改可能有所变化~~~

很遗憾短信归属地不再这里控制,需要手动打开,从代码中看到短信归属地只对电信版rom打开,这应该是老代码一贯的设定,到了sense5.5并没对短信归属地进行修改就延留下来了,短信归属地的修改可参考我的rom里apk的修改。。。相信简单对比就明白了。。不难~~~

转至机锋版主:机锋★大款小总

 

 

Oracle中存储过程传入按逗号分割的数值参数时报错的问题

前两天写存储过程,需要用到多参数传入,传入的参数是给一个select语句的where条件使用的。
但是写的时候遇到一个麻烦的问题,这个where条件的参数必须是number型的,而且使用的是in,也就是多个参数,比如select * from table_name_1 where id in (1,2,3,4,5),其中的1,2,3,4,5即是通过存储过程的参数传入的。
这里有个问题,如果在sql中,where id in (1,2,3,4,5)这条语句会认为1,2,3,4,5是五个单独的number型,而不会将其作为一个字符串。但是如果在存储过程中作为一个整体的参数进行传入时,即会将1,2,3,4,5判定为‘1,2,3,4,5’,而’1,2,3,4,5’是一个字符串,这时候sql执行的实际上是select * from table_name_1 where id in (‘1,2,3,4,5’),而id是一个number型的,这时候就会报错。
原存储过程大致如下:

如上述的存储过程,由于传入的参数an_id是一个number型的,如果是一个单独的数字,过程执行没有问题,但如果是一个字符串,如’1,2,3,4,5’,这样就会报错,因为’1,2,3,4,5’是一个varchar。
如果将传入的参数an_id 改为varchar型的,如create or replace procedure test_prc(an_id in varchar),这时候虽然在传入的时候类型一致了,但是在执行select语句时——where id in (an_id),由于表table_name_1的id列是number型的, 传入的实际上是’1,2,3,4,5’,这时候,也会报错。
这种情况据我所知可以有两种方法来解决,第一种是使用动态sql;第二种是使用instr函数来解决。有的朋友使用的是动态sql,我没使用这种方法,第一是自己不太会写,第二是觉得太繁琐。这里重点说的是使用instr函数。以后可能也会尝试使用动态sql来试试看,到时候再来更新吧。
其实使用instr函数也没有什么多说的,仔细看懂了理解了就行了,先贴出结果吧。

INSTR函数是个字符串搜索函数,默认情况下有两个参数:instr(string,set),用于在string中寻找set的位置,如果找到,返回set子串的第一个字符的位置,如果没有找到,则返回0。
之所以在开始和结束都加上’,’,是为去掉当查询11的时候,会将1和11都取出来。
至此,问题解决。

HTC one m7 android4.3本地化刷机包

一直以为目前为止牛丸的4.3都是android原生界面的版本。今天逛xda时发现mike1986大侠发布了[ROM] Android Revolution HD 22.1 ,原来的官方4.2.2的下载链接都去掉了,仔细看了看他的帖子,原来这个22.1版是基于牛丸开发者版sense4.3定制而来的,既然是官方推出的果断升级,毕竟ARHD系列非常的稳定,几乎从来不会拿非官方的版本改。

刷了之后觉得速度明显快了,唯一美中不足的是拨号归属地没有了。于是乎跟往常一样去机锋找,找了半天没有找到本地化的包,只有rom,xiaolu大侠也没有发布4.3的本地化包:)

只好找了个rom提取他的拨号归属地apk自己签名打包,需要的拿走。

适用于htc one m7 android4.3显示来去电归属,ip拨号,拨号面板去网格等等

m7 4.3归属地刷机包

 

感谢这个rom的作者【10.8-N-team-溜达ROM】HTC-One Android4.3 ARHD22本地化 带工具箱LD15

谈谈C#验证码识别的方法集合

前段一直没有时间维护博客,还是因为太懒了只当它是一个wordpress的文具,其实工作生活记录一下没有什么不好。

个人项目中需要验证码识别,所以研究了一阵子,图像识别是c#的弱项。到互联网飞速发展的今天,验证码识别已经没当初那么简单了。

使用c#有以下几种识别方式:

tesseract-ocr

这是一个开源项目,项目地址:https://code.google.com/p/tesseract-ocr/。现在已经被google接手。当前最新的是3.02版,支持多个平台。需要注意的是安装了之后还需要下载与版本对应的语言包放到安装目录,默认设置下的识别能力一般,但是可以通过学习训练来得到最优的配置,具体设置方法请参阅wiki

windows平台下面可以通过cmd调用

执行识别图像的命令格式为:
tesseract .exe [-l lang]
Imagename: 需要识别的图片文件名
outputname: 输出结果txt文件名,用来存放识别出来的文字结果
lang: 使用的文字字库,根据要识别的文字类型来选择。
例如:输入命令:tesseract.exe 6.jpg 6 –l chi_sim

遗憾的是web用户调用cmd需要特殊权限,对于安全性是不好的

2 Asprise OCR

最新的是Asprise OCR v4.0 for C# [C Sharp] .NET,官网在http://asprise.com/product/ocr/index.php?lang=csharp。这不是一个开源项目,好在伟大的天朝到处都是破解版可以下载。没有繁琐的学习和训练,dll是由c++编译的,c#调用方便。如果是web项目甚至可以不用把dll放在项目里面。数字和字母的识别率挺高的。

调用方式:

需要注意的是代码里虽然只调用了一个AspriseOCR.dll,但是同一目录下还需要放另外2dll个哦。我在win7+vs2012+iisexpress环境测试成功,server上失败,也许是dll版本和系统不匹配

3 Tessnet2

Tessnet2 a .NET 2.0 Open Source OCR assembly using Tesseract engine 项目地址:http://www.pixel-technology.com/freeware/tessnet2/ 。其实就是前面说的tesseract-ocr 旧版本2.0的。net版。可以直接集成到framework2.0的web项目,同样需要下载语言包,语言包也在tesseract-ocr地址里下载,但是版本号一定要对应,也就是说只能使用tesseract-ocr 2的语言包。

4 自己写代码处理验证码图像,这个不详细讲了,通用性不高。也可以把图片简单处理后采用前面的方式来识别,提高成功率。


 

总结:不管使用什么识别工具,都存在一个识别率的问题,一句话没有百分之百的识别。还是要具体情况具体分析:

如果你想做一个qq空间游戏外挂,个人建议还是把验证码request下来给用户输吧,我相信没有人会为了少输一个验证码而容忍连续失败10次的登录(这个可是经常会有);

如果你想做的是自动化暴力的http post,比如自动注册机,不在乎失败反正挂在那循环。。。你应该采用验证码识别技术。

分享经验只为节省大家的时间:)