项目看起来像什么?

project

这副图准确来说是我在5年前,我学习编程的时候在程序员杂志上看到。
当时那篇文章主要指项目中可能会出现各种问题,就像图中说描述的内容一样。

提案客户讲解如天马行空, 项目主管理解成断砖片瓦, 分析人员设计为似牛似马, 编码人员开发出奇形怪状, 销售人员描述得天花乱坠. 这样的项目, 没有文档, 没有有效的功能提交, 经费挂在每个里程碑上如玩命过山车的拐点, 没有支持和维护… 最后发现, 原来客户想要的并不是我们做的, 也不是他们所说的.

去年的时候,参加一个培训课程,微软的培训人员又一次拿出了这幅图。
现在想想,这些图中所描述的问题,依然出现在各种不同的项目中。

在我目前所在的公司,在各个不同部门和不同环节中间也有出现类似的场景,我之前有想过如何改善这些问题,但是后来终究因为一人之力过于单薄而放弃了当时的想法,或许未来某一天我又重新继续这些工作的推进。

希望这一天能早点来到。

如何成为一个合格的程序员

经过一个多月的培训期,对你们也有一定的认识和了解了。
你们现在正在写工程实习的课题代码,趁现在我有空的时候,我想跟你们说一些自己的想法。

以前我实习的时候,是去高中代课。那时候的我也是不认真的,现在回忆起来,略有遗憾。
我希望你们能认真的使用实习资源,现在公司提供给你们的资源也挺丰富的。实习终究和你们在学校上课是有区别的,并不是一味的讲课,更多的是希望通过实习,让你们认识自己的能力,重新准确定位自身,同时也是希望你们能适应走上工作之后的变化。但是这一个月以来,更多的仍然像是老师带领学生在学习,而不是组长或经理在带队工作。这是你们都需要改变的地方。

我不确定你们是否都想从事软件行业,或者你们是否都能从事软件行业。但是我仍然希望能将我入行以来的一些想法分享给你们。
成为一个合格的程序员,需要具备以下几点:
1,首先要学会做人。改变自己的性格,学会容纳别人的建议。学会谦虚的态度,遇到问题不是被问题打败,而是去寻找解决问题的方法。学会跟你的团队合作,我一直认为软件开发和管理,首先跟人交往,再来是跟机器沟通的,团队合作的重要性是显而易见的。
2,养成良好的编码习惯。上面有说过,代码首先是给人看,再是给机器执行的。那么良好的编码是必须的。因为你的代码编码风格很好,并且注释完整的话。会给带来以下好处:
     a,容易定位错误,并且容易进行调整与修改。比如,你在很多地方都用到一个读文件方法,后来发现在某一个语句块内存在问题,如果你没有将这些相同的代码抽象成一个方法,那么你有可能要修改很多地方才能修复这个问题。
     b,方便代码维护,在上面也提到了维护的重要性,只有保证你的核心代码能有单一职责性,这样更方便维护。目前大多数的软件都不是由一个完成的,软件英雄的时代已经结束。良好的维护性,也能让你博得他人的欣赏。
     其实良好的编码的好处不仅限于以上两点。
     现在我们需要做的就是养成编码的好习惯。我们可以选择采用以下的方法进行锻炼:
     ①,掌握你使用的IDE的基本快捷键
     ②,参考良好的代码版式设计,手头最好有代码格式检查的工具,例如Checkstyle和PMD等
     ③,对你的变量命名尽量小心,尽量使其富有语义。但是由于编程是老外发明的关系,所以建议尽量使用英文缩写。
     ④,慎重对待你的循环,尽量不要使用过多的循环嵌套,这样可能导致你都不明白变量变化的关系了。
     ⑤,注释,注释。类,方法,变量,属性等注释的完整性,更有助于第三者了解和阅读代码。
     关于这方面的资料可以参考 《代码大全》或其他的一些检查表。
3,资料,资料,资料。学会查阅资料,收藏资料,分享资料。学校教授的内容大都是基础理论,并且对很多问题的深入性不够。因此我们在实际工作中会有大部分的信息需要从外界获取。查询资料也是一种学问,我记得当时甚至有人出了一本书,专门讲授如何使用google搜索引擎的。
     目前的资料来源应主要包括:图书,网络,视频等三种载体,因为我们需要学会从各种载体中获取相应的信息。我相信很多人只是为了当时的某种需要去收集信息,但是我建议,当你碰到一个问题,并且你最终解决了它,那么你应该将其记录下来,因为谁也无法担保下次不会出现同样的问题,并且也无法确保下次出现问题的时候你还记得它。
    分享资料,我一直推崇。因为你从别人那里获得的知识,那么你就应该同样再将其传递出去。你要永远相信,你的这些东西会帮助更多的人解决更多的问题。
4,定位准确,扩展知识面。
   说实话,做软件这一行,变化是很快的。我两年前使用的Struts技术现在已经被淘汰了,所以我也在学习struts2.
   定位准确,我以前并不是学计算机的,所以我面试的时候就跟面试官说过,我知道我自己对计算机的基础知识很缺乏,比如计算机组成原理,编译原理,算法与数据结构等计算机专业基础知识。
   为了保证自己不会被淘汰,所以我们需要不停的反省自己。

从学生转变到工作状态其实是很辛苦的一个过程,因为你并确定你未来的同事会以何种态度来对待你。
关于职业规划的问题,我建议各位能有明确的目标。尽量一直为这个目标而努力。
===============================
转载请注明出处.

windows平台下Ruby on Rails环境搭建

本文原址 :http://wanweiqun.blog.163.com/blog/static/209155920076933224500/
1 安装ruby,

win环境下有Ruby One-Click Installer包, 下载地址为

http://www.ruby-lang.org/en/downloads/

下完后,点击安装,一直点next, i agree,选择安装路径,(我的安装目录是d:
uby)

然后一路next  最后finish,安装完成。

运行cmd, 输入ruby -v  ,如果安装成功会返回版本号

(我的输出是:ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32])

至此,ruby安装完成。

2 安装rails

Windows CMD 中运行”gem install rails –include-dependencies”, 如果你想看看都装那些包了, 就输入”gem install rails”,程序自动下载, 然后就剩下等待了。可以去google下更多的关于gem的内容,我这里就不介绍它了。
完成之后,也可以用 rails -v 查看版本信息。

至此ror安装完毕。

3创建空的rails网页框架

在命令行下运行:

rails cookbook

你可以看到rails为你生成了完整的cookbook项目目录.(我的目录是d:
ubycookbook)

你可以先熟悉下目录的结构。

在命令行下转到你的项目目录

运行:ruby scriptserver (这条命令是运行script下的server命令来启动webrick服务器)

Webrick 简介:
    Ruby 默认已经包含了丰富的软件,其中 webrick http 服务器就是其中之一。 这个程序包被用作 rubygem 的默认文档服务器。这是一个非常简单的纯 ruby 编写的服务器。感兴趣的朋友可以去google下更多的内容。

打开浏览器输入

http://127.0.0.1:3000

就可以看到初始化页面了。

Windows下使用Apache2.2和Mongrel运行Ruby on Rails

一、环境
1)安装ruby 、rails
上面有,这里不说了。
2)安装apache,
去www.apache.org下载你apache的最新版本,一路next安装完毕。
3)安装mongrel
运行命令:
gem install mongrel –y
gem install mongrel_service -y
命令完成就安装好了mongrel

二、把Mongrel作为Services启动
mongrel_rails service::install -N cookbook -c d:
ubycookbook -p 3000 –e production
参数说明:
-N指明服务名称,
-d指明rails应用的目录,
-p是mongrel监听的tcp端口,
-e是启动模式为生产模式
打开控制面版|管理工具|服务,就可以发现增加了一项名为“cookbook ”的服务,就可以通过控制面版来管理服务了。
也可以通过命令行启动、关闭和注销该服务:
启动:mongrel_rails service::start -N cookbook
关闭:mongrel_rails service::stop -N cookbook
注销:mongrel_rails service::remove -N cookbook
如果需要安装多个mongrel实例,那么可以这样:
mongrel_rails service::install -N [进程名] -c [ruby项目路径] -p 3000 –e production

三、配置Apache
用编辑工具打开Apache目录下面的conf/httpd.conf,需要家在取消如下模块的注释:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
如果你希望对页面输出使用压缩,也需要取消如下模块的注释:
LoadModule deflate_module modules/mod_deflate.so

然后按如下内容配置基于HTTP代理的负载均衡:
ProxyRequests Off  
##myCluster定义了群集中的每个mongrel应用服务器节点
<Proxy balancer://myCluster>
   BalancerMember http://localhost:3000  
   BalancerMember http://localhost:3001  
</Proxy>
<VirtualHost *:80>
   ServerName 127.0.0.1  
   DocumentRoot d:/ruby/cookbook/public  
   ProxyPass /images !   ##指明该URL开始的请求不代理给Mongrel群集,而由Apache自己处理
   ProxyPass /stylesheets !  
   ProxyPass /javascripts !  
   ProxyPass / balancer://myCluster/  
   ProxyPassReverse / balancer://myCluster/  
   ProxyPreserveHost on  
</VirtualHost>
重起Apache,然后打开浏览器访问127.0.0.1,如果配置正确,将出现项目初始化界面。

用Editplus搭建ruby编程环境

一.让Editplus支持ruby语法

1.从Editplus官方网站下载支持Ruby的扩展包

http://www.editplus.com/others.html

   ruby2.zip (2006-01-24)

   Ruby stx, acp – Jonghee Park

2.下载的包中有两个文件是语法文件(stx)与自动完成文件(acp)将这两个文件放到Editplus的安装目录

3.打开菜单中 工具->参数选择->文件(设置与语法)项,增加Ruby这种类型

4.设置一下文件扩展名,关联一下刚才下载的语法文件与自动完成文件

二.在editplus中搭建ruby运行环境

1.打开菜单中 工具->用户工具->增加工具(程序)

  菜单名(menu text)填:ruby

   命令(commend):C:
ubyin
uby.exe(你的ruby.exe路径)

   参数(argument):$(FileName)

   初始目录(initial directory):$(FileDir)

   选中 捕获输出

当然了,你如果想在命令行中运行,就不要选

好了,写个ruby程序,然后在工具菜单下点击ruby,或用快捷键,结果就直接在下面的窗口出现了

参考:

http://www.javaeye.com/blog/post/326091

http://www.cnblogs.com/jessezhao/archive/2007/05/31/765766.html

http://blog.othree.net/log/2006/11/02/ruby_on_rails_on_windows/

http://www.onlamp.com/lpt/a/5546

http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html

基于Web的可视化图表推荐

这篇文章转摘自http://www.javaeye.com/news/2592,目的很简单,就是怕自己忘记了这些东西。
之前我们公司也用过类似的图表库的。

推荐下面10个免费的图表生成代码。

  • Flot – Flot 为 jQuery 提供的javascript代码库. 容易使用,有特色的图表,提供交互功能(能够放大缩小数据区域等)。
  • Open Flash Chart – Open Flash Chart 是一个 Flash 图表组件,很容易安装,提供以下语言的API: PHP, Perl, Python, Java, Ruby on Rails, and .Net 来控制图表。?
    ?
  • AmCharts – AmCharts 是一个动画交互Flash图表。支持: Pie Charts, Line Charts, Scatter/Bubble Charts, Bar/Column Charts, 甚至股票图表。
    ?
  • Emprise JavaScript Charts – Emprise 是一个100% 纯 JavaScript 图表解决方案,并不需要任何 JavaScript 框架.?
    ?
  • PlotKit – PlotKit 是一个 图表和图像的Javascript 库. PlotKit 和 MochiKit javascript 库一起工作,支持HTML Canvas 和? Adobe SVG 显示 以及本地浏览器支持。尤其文档非常全。
    ?
  • Flotr – Flotr 是Prototype 1.6.0.2框架的javascript插件库。 Flotr帮助你在浏览器中创建图表,支持鼠标事件响应,放大缩小,CSS类型支持等。
    ?
  • PHP/SWF Charts – PHP/SWF 是一个简单支持web图表的强大工具,你能使用 PHP 来收集数据,并发送给flash,支持很多图表类型: Line, Column, Stacked column, Floating column, 3D column, Stacked 3D column, Parallel 3D column, Pie, 3D Pie, Bar, Stacked bar, Floating bar, Area, Stacked area, Candlestick, Scatter, Polar, Mixed.
    ?
  • Visifire – Visifire 是用 Silverlight 做的,是一个开源可视化数据组件,使用Visifire你能创建动画 Silverlight 图表,支持? ASP, ASP.Net, PHP, JSP, ColdFusion, Ruby on Rails 或者 简单 HTML调用.
    ?
  • FusionCharts – FusionCharts 是一个跨浏览器和跨平台的flash图表组件,能够被 ASP.NET, ASP, PHP, JSP, ColdFusion, Ruby on Rails, 简单 HTML 页面 甚至PPT调用. 几乎所有你知道的语言它都支持。
    ?
  • JFreeChart – JFreeChart 是一个开源java图表库,让开发者能够很容易在程序里面显示高质量的图表。 JFreeChart 项目从7年前便开始了,起始于 2000 年1月, 已经有四五万开发者已经使用了JFreeChart。JFreeChart 支持很多种图形文件格式: JPEG, GIF, PDF, EPS and SVG. 这对于java开发者是一个很好的资源。
    ?

1.使用浏览器支持的图形引擎,比如ie下的vml,firefox,opera,safari支持的svg或者canvas。
2.http://www.walterzorn.com/jsgraphics/jsgraphics_e.htm,这是一个相当纯正的js图形库,它特立独行的地方就是:“完全使用div来画图。”
3.http://excanvas.sourceforge.net/,google提供的工具库,可以在ie下使用vml模拟其他浏览器上canvas的api。
4.http://dojotoolkit.org/,宣传火暴的dojo提供一套2d和3d的图形api,会自动根据浏览器在vml,svg,canvas之间进行切换。
5.http://prototype-graphic.xilinus.com/这也是一套根据浏览器自动切换实现方式的图形api。
6.http://www.lutanho.net/svgvml3d/index.html还有这个,是专门用svg和vml实现3d效果的。

管理电子文档 – Adobe Digital Editions 1.0 发布

Adobe Systems 刚刚发布了新产品Adobe Digital Editions 1.0,一款管理电子文档,例如eBooks,数字报纸和其他电子出版物的软件,目前针对Microsoft Windows和Mac系统用户免费发行, Adobe Digital Editions的发布意在为阅读者和出版商提供创新体验.
下载:Adobe Digital Editions 1.0

官方截图:

我是一个很喜欢跟新的人,所以马上下载下来使用了一下,总体感觉良好,不过还是存在缺陷的,有些通过word转换成pdf的文件在显示上有些问题,同时目前的版本对汉语的支持度明显不是很够,但是总体说来基本可以取代adobe reader。但是应该还是需要安装了adobe reader 的lib才可以使用该工具进行文档查看。
flash的功能越来越强大了。

本人使用的截图:



JAVA中正则表达式使用介绍

一、什么是正则表达式

    正则表达式是一种可以用于模式匹配和替换的强有力的工具。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,PerlPHP脚本语言,以及awksed shell程序等。此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。

正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,进行信息的验证。

此外,它还能够高效地创建、比较和修改字符串,以及迅速地分析大量文本和数据以搜索、移除和替换文本。

例如:

二、基础知识

1.1     开始、结束符号(它们同时也属于定位符)

我们先从简单的开始。假设你要写一个正则表达式规则,你会用到 ^ $ 符号,他们分别是行首符、行尾符。

例如:/^d+[0-9]?d+$/

 

1.2 句点符号

 

假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。这样,完整的表达式就是“t.n”,它匹配“tan”“ten”“tin”“ton”,还匹配“t#n”“tpn”甚至“t n”,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:

 

 

1.3 方括号符号

 

为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“t[aeio]n”只匹配“tan”“Ten”“tin”“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:

 

 

1.4 “符号

 

如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意义就是运算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”

 

 

1.5 表示匹配次数的符号

 

表一:显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:

 

代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

 

表二:常用符号

 

代码/语法 相当于
w [0-9A-Za-z_]
W [^0-9A-Za-z_]
s [

f]

S [^

f]

d [0-9]
D [^0-9]

表二中的符号意义:

·         w

包括下划线的字母和数字。等同于[0-9A-Za-z_]

若为匹配多字节字符的正则表达式时,则也会匹配日语的全角字符。

·         W

非字母和数字。w以外的单个字符。

·         s

空字符。相当于[

f]

·         S

非空字符。[

f] 以外的单个字符。

·         d

数字。即[0-9]

·         D

非数字。d以外的单个字符

1.6 定位符介绍(用于规定匹配模式在目标对象中的出现位置

较为常用的定位符包括: “^”, “$”, “” 以及 “B”。其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一,而“B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”“$”以及“”“B”看作是互为逆运算的两组定位符。举例来说:
  
/^hell/
  因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello” “hellhound”开头的字符串相匹配。

  
/ar$/
  因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar” “ar” 结尾的字符串相匹配。

  
/bom/
  因为上述正则表达式模式以“”定位符开头,所以可以与目标对象中以 “bomb”, “bom”开头的字符串相匹配。

  
/man/
  因为上述正则表达式模式以“”定位符结尾,所以可以与目标对象中以 “human”, “woman” “man”结尾的字符串相匹配。

  为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:

  
/[A-Z]/
  上述正则表达式将会与从AZ范围内任何一个大写字母相匹配。

  
/[a-z]/
  上述正则表达式将会与从az范围内任何一个小写字母相匹配。

  
/[0-9]/
  上述正则表达式将会与从09范围内任何一个数字相匹配。

  
/([a-z][A-Z][0-9])+/
  上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。

  如果我们希望在正则表达式中实现类似编程逻辑中的运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如:

  
/to|too|2/
  上述正则表达式将会与目标对象中的 “to”, “too”, “2” 相匹配。

  正则表达式中还有一个较为常用的运算符,即否定符 “[^]”。与我们前文所介绍的定位符 “^” 不同,否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如:

  
/[^A-C]/
  上述字符串将会与目标对象中除AB,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。

  最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“”。例如:

  
/Th*/
  上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。

三、正则表达式规则的例子

/^(d{3}-|d{4}-)?(d{8}|d{7})?$/    //国内电话
/^[1-9]*[1-9][0-9]*$/    //
腾讯
QQ
/^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$/
    //email地址

/^[a-zA-Z]+://(w+(-w+)*)(.(w+(-w+)*))*(?s*)?$/
  
//url
/^d+$/
   //非负整数

/^[0-9]*[1-9][0-9]*$/
  //正整数

/^((-d+)|(0+))$/
  //非正整数
/^-[0-9]*[1-9][0-9]*$/
  //负整数

/^-?d+$/
     //整数

/^d+(.d+)?$/
  //非负浮点数

/^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$/
  //正浮点数

/^((-d+(.d+)?)|(0+(.0+)?))$/
  //非正浮点数

/^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$/
 //负浮点数

/^(-?d+)(.d+)?$/
  //浮点数

/^[a-zA-Z]+$/
  //26个英文字母组成的字符串

/^[a-z]+$/
  //26个英文字母的大写组成的字符串

/^[a-z]+$/
  //26个英文字母的小写组成的字符串

/^[a-za-z0-9]+$/
  //由数字和26个英文字母组成的字符串

/^w+$/
  //由数字、26个英文字母或者下划线组成的字符串

/^d+[.]?d+$/    //可以有小数点的任意多数字(全部为数字)

/(?=^[0-9a-zA-Z]{4,20}$)w*[a-zA-Z]+w*/   //同时满足下面三个条件

(1)       数字和字母(24-20位(3)不能全部是数字

 

四、应用

1.应用于JavaScript (用来验证)

function doCheck(){

 var patrn = /^d+[.]?d+$/;

 var vf1 = document.queryForm.f2Text.value; //文本框

 var vf2 = document.queryForm.f4Text.value;

 var vf3 = document.queryForm.f6Text.value;

 

 var va1 = document.queryForm.a2.checked;     //单选按钮

 var va2 = document.queryForm.a4.checked;

 var va3 = document.queryForm.a6.checked;

 

 if(va1){

    if(!patrn.exec(vf1)){

      alert("请您输入数字,如:30 5.8");

      return;

    }

 }

 if(va2){

    if(!patrn.exec(vf2)){

      alert("请您输入数字,如:30 5.8");

      return;

    }

 }

 。。。 。。。

}

 

2.在Java中的应用

Javajava.util.regex提供对正则表达式的支持。而且Java.lang.String类中的replaceAllsplit函数也是调用的正则表达式来实现的。

  正则表达式对字符串的操作主要包括:字符串匹配,指定字符串替换,指定字符串查找和字符串分割。下面就用一个例子来说明这些操作是如何实现的:

<%@ page import="java.util.regex.*"%>;

<%

 Pattern p=null; //正则表达式

 Matcher m=null; //操作的字符串

 boolean b;

 String s=null;

 StringBuffer sb=null;

 int i=0;

 //字符串匹配,这是不符合的

  p = Pattern.compile("a*b");

  m = p.matcher("baaaaab");

  b = m.matches();

 out.println(b+"<br>;");

//字符串匹配,这是符合的

  p = Pattern.compile("a*b");

  m = p.matcher("aaaaab");

  b = m.matches();

  out.println(b+"<br>;");

//字符串替换

  p = Pattern.compile("ab");

  m = p.matcher("aaaaab");

  s = m.replaceAll("d");  

  out.println(s+"<br>;");

  p = Pattern.compile("a*b");

  m = p.matcher("aaaaab");

  s = m.replaceAll("d");  

  out.println(s+"<br>;");

  p = Pattern.compile("a*b");

  m = p.matcher("caaaaab");

  s = m.replaceAll("d");  

  out.println(s+"<br>;");

//字符串查找

 p = Pattern.compile("cat");

 m = p.matcher("one cat two cats in the yard");

 sb = new StringBuffer();

 while (m.find()) {

     m.appendReplacement(sb, "dog");

     i++;

 }

 m.appendTail(sb);

 out.println(sb.toString()+"<br>;");

 out.println(i+"<br>;");

 i=0; 

 p = Pattern.compile("cat");

 m = p.matcher("one cat two ca tsi nthe yard");

  sb = new StringBuffer();

 while (m.find()) {

     m.appendReplacement(sb, "dog");

     i++;

 }

 m.appendTail(sb);

 out.println(sb.toString()+"<br>;");

 out.println(i+"<br>;");

 

 

 p = Pattern.compile("cat");

 m = p.matcher("one cat two cats in the yard");

 p=m.pattern();

 m = p.matcher("bacatab");

 b = m.matches();

 out.println(b+"<br>;"); 

 s = m.replaceAll("dog"); 

 out.println(s+"<br>;"); 

 

 i=0;

 p = Pattern.compile("(fds){2,}");

 m = p.matcher("dsa da fdsfds aaafdsafds aaf");

  sb = new StringBuffer();

 while (m.find()) {

     m.appendReplacement(sb, "dog");

     i++;

 }

 m.appendTail(sb);

 out.println(sb.toString()+"<br>;");

 out.println(i+"<br>;");

 

  p = Pattern.compile("cat");

  m = p.matcher("one cat two cats in the yard");

  sb = new StringBuffer();

  while (m.find()) {

     m.appendReplacement(sb, "<font color="red">;cat</font>;");

  }

m.appendTail(sb);

out.println(sb.toString()+"<br>;");

String aa=sb.toString();

out.println(aa+"<br>;");

//字符串分割

  p = Pattern.compile("a+");

  String[] a=p.split("caaaaaat");

  for(i=0;i<a.length;i++)

  {

  out.println(a+"<br>;");

  }

  p = Pattern.compile("a+");

  a=p.split("c aa aaaa t",0);

  for(i=0;i<a.length;i++)

  {

  out.println(a+"<br>;");

  }

  p = Pattern.compile(" +");

  a=p.split("c aa    aaaa t",0);

  for(i=0;i<a.length;i++)

  {

  out.println(a+"<br>;");

  }

  p = Pattern.compile("+");

  a=p.split("dsafasdfdsafsda+dsagfasdfa+sdafds");

  out.println(a.length+"<br>;");

  for(i=0;i<a.length;i++)

  {

  out.println(a+"<br>;");

  }

Struts数据库分页的处理方案

        公司最近的项目需要使用到查询分页方面的应用,本来分页应该是很简单的工作,复杂的是如何减少数据库的压力。

        经过分析大致有几种处理方案:
        1,查询所有结果后返回页面进行分页。这样的做法的好处是只需要访问数据库一次而已,但是对数据缓存的压力过大,如果结果集过大可能导致浏览器假死。
         2,每次查询。这样的做法是没有只获取每页需要显示的数据量而已。坏处是增加对数据库的访问次数。
       
         我采用的是后者。
          我的具体做法是:

          1,第一次查询时保存一下关键内容:
              a,查询的组合条件,
              b,本次查询结果集合中最大的记录编号和最小的编号。
              c,本次结果集的页数,以及最后一页的记录条数.
              d,下一次查询的起始ID。
             

             保存以上内容的目的是:
             a,保留组合条件是方便下次查询。
             b,保留最大编号,主要是为了回到首页记录时配合查询条件获取第一页的数据,这样做可以避免数据增长带来的麻烦。
             c,保留最小ID和最后一页的记录数的目的是为了跳转到尾页时可以根据这两个条件配合查询条件获取最后一页的数据。
             d,保留下一次起始ID,是为了配合查询条件进行上一页和下一页的操作处理。保证每页只获取最近的20条数据.

            分页查询语句

          orACLE:

组合查询条件经过组长后的查询语句用sqlfrom标识.
maxID;最大ID
minId;最小ID
lastnum;最后一页的记录数
pagecount;页数
nextID;下次查询的起始ID;
1,首页
    id= maxid +1; 
    select * from (select * from tableame Where "+ sqlFrom +" and  Id < "+ id+"order by Id desc) where rownum<=15
2,上一页
    id= nextId;
    select * from (select * from tableame Where "+ sqlFrom +" and  Id >= "+ id+"order by Id desc) where rownum<=15
3,下一页
    id= nextId;
    select * from (select * from tableame Where "+ sqlFrom +" and  Id <"+ id+"order by Id desc) where rownum<=15
4,尾页
    id= minID;
    select * from (select * from tableame Where "+ sqlFrom +" and  Id >="+ id+"order by Id desc) where rownum<=lastnum

   MYSQL:

1,首页
    id= maxid +1; 
    select * from tableame where "+ sqlFrom +" and  Id < "+ id +" order by id desc  limit 0,15
2,上一页
    id= nextId;
    select * from tableame where "+ sqlFrom +" and  Id >= "+ id +" order by id desc  limit 0,15
3,下一页
    id= nextId;
   select * from tableame where "+ sqlFrom +" and  Id < "+ id +" order by id desc  limit 0,15
4,尾页
    id= minID;
    select * from tableame where "+ sqlFrom +" and  Id >= "+ id +" order by id desc  limit 0,lastnum

    查询方法可以只写一次,不同的地方在于构造查询数据的细微差别。

SQL Server数据导入导出工具BCP详解

BCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据。BCP可以将数据库的表或视图直接导出,也能通过Select FROM语句对表或视图进行过滤后导出。在导入导出数据时,可以使用默认值或是使用一个格式文件将文件中的数据导入到数据库或将数据库中的数据导出到文件中。

下面将详细讨论如何利用BCP导入导出数据。

1. BCP的主要参数介绍

BCP共有四个动作可以选择。

(1) 导入。

这个动作使用in命令完成,后面跟需要导入的文件名。

(2) 导出。

这个动作使用out命令完成,后面跟需要导出的文件名。

(3) 使用SQL语句导出。

这个动作使用queryout命令完成,它跟out类似,只是数据源不是表或视图名,而是SQL语句。

(4) 导出格式文件。

这个动作使用format命令完成,后而跟格式文件名。

下面介绍一些常用的选项:

-f format_file

format_file表示格式文件名。这个选项依赖于上述的动作,如果使用的是in或out,format_file表示已经存在的格式文件,如果使用的是format则表示是要生成的格式文件。

-x

这个选项要和-f format_file配合使用,以便生成xml格式的格式文件。

-F first_row

指定从被导出表的哪一行导出,或从被导入文件的哪一行导入。

-L last_row

指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束。

-c

使用char类型做为存储类型,没有前缀且以" "做为字段分割符,以"
"做为行分割符。

-w

和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nchar做为存储类型。

-t field_term

指定字符分割符,默认是" "。

-r row_term

指定行分割符,默认是"
"。

-S server_name[ instance_name]

指定要连接的SQL Server服务器的实例,如果未指定此选项,BCP连接本机的SQL Server默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可。

-U login_id

指定连接SQL Sever的用户名。

-P password

指定连接SQL Server的用户名密码。

-T

指定BCP使用信任连接登录SQL Server。如果未指定-T,必须指定-U和-P。

-k

指定空列使用null值插入,而不是这列的默认值。

2. 如何使用BCP导出数据

(1) 使用BCP导出整个表或视图。

BCP AdventureWorks.sales.currency out c:currency1.txt -c -U"sa" -P"password" –使用密码连接

BCP AdventureWorks.sales.currency out c:currency1.txt -c -T –使用信任连接

下面是上述命令执行后的输出结果

Starting copy…

105 rows copied.

Network packet size (bytes): 4096

Clock Time (ms.) Total : 10 Average : (10500.00 rows per sec.)

下面是currency1.txt的部分内容

AED Emirati Dirham 1998-06-01 00:00:00.000

AFA Afghani 1998-06-01 00:00:00.000

… … …

… … …

ZWD Zimbabwe Dollar 1998-06-01 00:00:00.000

在使用密码登录时需要将-U后的用户名和-P后的密码加上双引号。

:BCP除了可以在控制台执行外,还可以通过调用SQL Server的一个系统存储过程xp_cmdshell以SQL语句的方式运行BCP。如上述第一条命令可改写为

EXEC master..xp_cmdshell ‘BCP AdventureWorks.sales.currency out c:currency1.txt -c -U"sa" -P"password"’

执行xp_cmdshell后,返回信息以表的形式输出。为了可以方便地在SQL中执行BCP,下面的命令都使用xp_cmdshell执行BCP命令。

(2) 对要导出的表进行过滤。

BCP不仅可以接受表名或视图名做为参数,也可以接受SQL做为参数。通过SQL语句可以对要导出的表进行过滤,然后导出过滤后的记录。

EXEC master..xp_cmdshell ‘BCP "Select TOP 20 * FROM AdventureWorks.sales.currency" queryout c:currency2.txt -c -U"sa" -P"password"’

BCP还可以通过简单地设置选项对导出的行进行限制。

EXEC master..xp_cmdshell ‘BCP "Select TOP 20 * FROM AdventureWorks.sales.currency" queryout c:currency2.txt -F 10 -L 13 -c -U"sa" -P"password"’

这条命令使用了两个参数-F 10和-L 13,表示从Select TOP 20 * FROM AdventureWorks.sales.currency所查出来的结果中取第10条到13条记录进行导出。

3. 如何使用BCP导出格式文件

BCP不仅可以根据表、视图导入导出数据,还可以配合格式文件对导入导出数据进行限制。格式文件以纯文本文件形式存在,分为一般格式和xml格式。用户可以手工编写格式文件,也可以通过BCP命令根据表、视图自动生成格式文件。

EXEC master..xp_cmdshell ‘BCP AdventureWorks.sales.currency format nul -f c:currency_format1.fmt -c -T’

上述命令将currency表的结构生成了一个格式文件currency_format1.fmt,下面是这个格式文件的内容。

9.0

3

1 SQLCHAR 0 6 " " 1 CurrencyCode SQL_Latin1_General_CP1_CI_AS

2 SQLCHAR 0 100 " " 2 Name SQL_Latin1_General_CP1_CI_AS

3 SQLCHAR 0 24 "
" 3 ModifiedDate

这个格式文件记录了这个表的字段(共3个字段)类型、长度、字符和行分割符和字段名等信息。

BCP还可以通过-x选项生成xml格式的格式文件。

EXEC master..xp_cmdshell ‘BCP AdventureWorks.sales.currency format nul -f c:currency_format2.fmt -x -c -T’

xml格式文件所描述的内容和普通格式文件所描述的内容完全一样,只是格式不同。

4. 如何使用BCP导入数据

BCP可以通过in命令将上面所导出的currency1.txt和currency2.txt再重新导入到数据库中,由于currency有主键,因此我们将复制一个和currency的结构完全一样的表。

Select TOP 0 * INTO AdventureWorks.sales.currency1 FROM AdventureWorks.sales.currency

将数据导入到currency1表中

EXEC master..xp_cmdshell ‘BCP AdventureWorks.sales.currency1 in c:currency1.txt -c -T’

导入数据也同样可以使用-F和-L选项来选择导入数据的记录行。

EXEC master..xp_cmdshell ‘BCP AdventureWorks.sales.currency1 in c:currency1.txt -c -F 10 -L 13 -T’

在导入数据时可以根据已经存在的格式文件将满足条件的记录导入到数据库中,不满足则不导入。如上述的格式文件中的第三个字段的字符长度是24,如果某个文本文件中的相应字段的长度超过24,则这条记录将不被导入到数据库中,其它满足条件的记录正常导入。

使用普通的格式文件

EXEC master..xp_cmdshell ‘BCP AdventureWorks.sales.currency1 in c:currency1.txt -F 10 -L 13 -c -f c:currency_format1.fmt -T’

使用xml格式的格式文件

EXEC master..xp_cmdshell ‘BCP AdventureWorks.sales.currency1 in c:currency1.txt -F 10 -L 13 -c -x -f c:currency_format2.fmt -T’

总结

BCP命令是SQL Server提供的一个快捷的数据导入导出工具。使用它不需要启动任何图形管理工具就能以高效的方式导入导出数据。当然,它也可以通过xp_cmdshell在SQL语句中执行,通过这种方式可以将其放到客户端程序中(如delphi、c#等)运行,这也是使客户端程序具有数据导入导出功能的方法之一。

==============================================================

SQL语句导入导出大全

/*******  导出到excel
EXEC master..xp_cmdshell ’bcp SettleDB.dbo.shanghu out c: emp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""’

/***********  导入Excel
Select *
FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’,
  ’Data Source="c: est.xls";User ID=Admin;Password=;Extended properties=Excel 5.0’)…xactions

Select cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+’ ’ 转换后的别名
FROM OpenDataSource( ’Microsoft.Jet.OLEDB.4.0’,
  ’Data Source="c: est.xls";User ID=Admin;Password=;Extended properties=Excel 5.0’)…xactions

/** 导入文本文件
EXEC master..xp_cmdshell ’bcp "dbname..tablename" in c:DT.txt -c -Sservername -Usa -Ppassword’

/** 导出文本文件
EXEC master..xp_cmdshell ’bcp "dbname..tablename" out c:DT.txt -c -Sservername -Usa -Ppassword’

EXEC master..xp_cmdshell ’bcp "Select * from dbname..tablename" queryout c:DT.txt -c -Sservername -Usa -Ppassword’

导出到TXT文本,用逗号分开
exec master..xp_cmdshell ’bcp "库名..表名" out "d: t.txt" -c -t ,-U sa -P password’

BULK Insert 库名..表名
FROM ’c: est.txt’
WITH (
    FIELDTERMINATOR = ’;’,
    ROWTERMINATOR = ’

)

–/* dBase IV文件
select * from
OPENROWSET(’MICROSOFT.JET.OLEDB.4.0’
,’dBase IV;HDR=NO;IMEX=2;DATABASE=C:’,’select * from [客户资料4.dbf]’)
–*/

–/* dBase III文件
select * from
OPENROWSET(’MICROSOFT.JET.OLEDB.4.0’
,’dBase III;HDR=NO;IMEX=2;DATABASE=C:’,’select * from [客户资料3.dbf]’)
–*/

–/* FoxPro 数据库
select * from openrowset(’MSDASQL’,
’Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:’,
’select * from [aa.DBF]’)
–*/

/**************导入DBF文件****************/
select * from openrowset(’MSDASQL’,
’Driver=Microsoft Visual FoxPro Driver;
SourceDB=e:VFP98data;
SourceType=DBF’,
’select * from customer where country != "USA" order by country’)
go
/***************** 导出到DBF ***************/
如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句

insert into openrowset(’MSDASQL’,
’Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:’,
’select * from [aa.DBF]’)
select * from 表

说明:
SourceDB=c:  指定foxpro表所在的文件夹
aa.DBF        指定foxpro表的文件名.

 

/*************导出到Access********************/
insert into openrowset(’Microsoft.Jet.OLEDB.4.0’,
   ’x:A.mdb’;’admin’;’’,A表) select * from 数据库名..B表

/*************导入Access********************/
insert into B表 selet * from openrowset(’Microsoft.Jet.OLEDB.4.0’,
   ’x:A.mdb’;’admin’;’’,A表)

*********************  导入 xml 文件

DECLARE @idoc int
DECLARE @doc varchar(1000)
–sample XML document
SET @doc =’
<root>
  <Customer cid= "C1" name="Janine" city="Issaquah">
      <Order oid="O1" date="1/20/1996" amount="3.5" />
      <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
      </Order>
   </Customer>
   <Customer cid="C2" name="Ursula" city="Oelde" >
      <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
             white red">
            <Urgency>Important</Urgency>
            Happy Customer.
      </Order>
      <Order oid="O4" date="1/20/1996" amount="10000"/>
   </Customer>
</root>

— Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

— Execute a Select statement using OPENXML rowset provider.
Select *
FROM OPENXML (@idoc, ’/root/Customer/Order’, 1)
      WITH (oid     char(5),
            amount  float,
            comment ntext ’text()’)
EXEC sp_xml_removedocument @idoc

/********************导整个数据库*********************************************/

用bcp实现的存储过程

/*
 实现数据导入/导出的存储过程
         根据不同的参数,可以实现导入/导出整个数据库/单个表
 调用示例:
–导出调用示例
—-导出单个表
exec file2table ’zj’,’’,’’,’xzkh_sa..地区资料’,’c:zj.txt’,1
—-导出整个数据库
exec file2table ’zj’,’’,’’,’xzkh_sa’,’C:docman’,1

–导入调用示例
—-导入单个表
exec file2table ’zj’,’’,’’,’xzkh_sa..地区资料’,’c:zj.txt’,0
—-导入整个数据库
exec file2table ’zj’,’’,’’,’xzkh_sa’,’C:docman’,0

*/
if exists(select 1 from sysobjects where name=’File2Table’ and objectproperty(id,’IsProcedure’)=1)
 drop procedure File2Table
go
create procedure File2Table
@servername varchar(200)  –服务器名
,@username varchar(200)   –用户名,如果用NT验证方式,则为空’’
,@password varchar(200)   –密码
,@tbname varchar(500)   –数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表
,@filename varchar(1000)  –导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt
,@isout bit      –1为导出,0为导入
as
declare @sql varchar(8000)

if @tbname like ’%.%.%’ –如果指定了表名,则直接导出单个表
begin
 set @sql=’bcp ’+@tbname
  +case when @isout=1 then ’ out ’ else ’ in ’ end
  +’ "’+@filename+’" /w’
  +’ /S ’+@servername
  +case when isnull(@username,’’)=’’ then ’’ else ’ /U ’+@username end
  +’ /P ’+isnull(@password,’’)
 exec master..xp_cmdshell @sql
end
else
begin –导出整个数据库,定义游标,取出所有的用户表
 declare @m_tbname varchar(250)
 if right(@filename,1)<>’’ set @filename=@filename+’’

 set @m_tbname=’declare #tb cursor for select name from ’+@tbname+’..sysobjects where xtype=’’U’’’
 exec(@m_tbname)
 open #tb
 fetch next from #tb into @m_tbname
 while @@fetch_status=0
 begin
  set @sql=’bcp ’+@tbname+’..’+@m_tbname
   +case when @isout=1 then ’ out ’ else ’ in ’ end
   +’ "’+@filename+@m_tbname+’.txt " /w’
   +’ /S ’+@servername
   +case when isnull(@username,’’)=’’ then ’’ else ’ /U ’+@username end
   +’ /P ’+isnull(@password,’’)
  exec master..xp_cmdshell @sql
  fetch next from #tb into @m_tbname
 end
 close #tb
 deallocate #tb 
end
go

/**********************Excel导到Txt****************************************/
想用
select * into opendatasource(…) from opendatasource(…)
实现将一个Excel文件内容导入到一个文本文件

假设Excel中有两列,第一列为姓名,第二列为很行帐号(16位)
且银行帐号导出到文本文件后分两部分,前8位和后8位分开。

如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2
然后就可以用下面的语句进行插入
注意文件名和目录根据你的实际情况进行修改.

insert into
opendatasource(’MICROSOFT.JET.OLEDB.4.0’
,’Text;HDR=Yes;DATABASE=C:’
)…[aa#txt]
–,aa#txt)
–*/
select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
from
opendatasource(’MICROSOFT.JET.OLEDB.4.0’
,’Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:a.xls’
–,Sheet1$)
)…[Sheet1$]

如果你想直接插入并生成文本文件,就要用bcp

declare @sql varchar(8000),@tbname varchar(50)

–首先将excel表内容导入到一个全局临时表
select @tbname=’[##temp’+cast(newid() as varchar(40))+’]’
 ,@sql=’select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
into ’+@tbname+’ from
opendatasource(’’MICROSOFT.JET.OLEDB.4.0’’
,’’Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:a.xls’’
)…[Sheet1$]’
exec(@sql)

–然后用bcp从全局临时表导出到文本文件
set @sql=’bcp "’+@tbname+’" out "c:aa.txt" /S"(local)" /P"" /c’
exec master..xp_cmdshell @sql

–删除临时表
exec(’drop table ’+@tbname)

用bcp将文件导入导出到数据库的存储过程:

/*–bcp-二进制文件的导入导出

 支持image,text,ntext字段的导入/导出
 image适合于二进制文件;text,ntext适合于文本数据文件

 注意:导入时,将覆盖满足条件的所有行
  导出时,将把所有满足条件的行也出到指定文件中

 此存储过程仅用bcp实现
邹建 2003.08—————–*/

/*–调用示例
–数据导出
 exec p_binaryIO ’zj’,’’,’’,’acc_演示数据..tb’,’img’,’c:zj1.dat’

–数据导出
 exec p_binaryIO ’zj’,’’,’’,’acc_演示数据..tb’,’img’,’c:zj1.dat’,’’,0
–*/
if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[p_binaryIO]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure [dbo].[p_binaryIO]
GO

Create proc p_binaryIO
@servename varchar (30),–服务器名称
@username varchar (30), –用户名
@password varchar (30), –密码
@tbname varchar (500),  –数据库..表名
@fdname varchar (30),  –字段名
@fname varchar (1000), –目录+文件名,处理过程中要使用/覆盖:@filename+.bak
@tj varchar (1000)=’’,  –处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀
@isout bit=1   –1导出((默认),0导入
AS
declare @fname_in varchar(1000) –bcp处理应答文件名
 ,@fsize varchar(20)   –要处理的文件的大小
 ,@m_tbname varchar(50)  –临时表名
 ,@sql varchar(8000)

–则取得导入文件的大小
if @isout=1
 set @fsize=’0’
else
begin
 create table #tb(可选名 varchar(20),大小 int
  ,创建日期 varchar(10),创建时间 varchar(20)
  ,上次写操作日期 varchar(10),上次写操作时间 varchar(20)
  ,上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int)
 insert into #tb
 exec master..xp_getfiledetails @fname
 select @fsize=大小 from #tb
 drop table #tb
 if @fsize is null
 begin
  print ’文件未找到’
  return
 end

end

–生成数据处理应答文件
set @m_tbname=’[##temp’+cast(newid() as varchar(40))+’]’
set @sql=’select * into ’+@m_tbname+’ from(
 select null as 类型
 union all select 0 as 前缀
 union all select ’+@fsize+’ as 长度
 union all select null as 结束
 union all select null as 格式
 ) a’
exec(@sql)
select @fname_in=@fname+’_temp’
 ,@sql=’bcp "’+@m_tbname+’" out "’+@fname_in
 +’" /S"’+@servename
 +case when isnull(@username,’’)=’’ then ’’
  else ’" /U"’+@username end
 +’" /P"’+isnull(@password,’’)+’" /c’
exec master..xp_cmdshell @sql
–删除临时表
set @sql=’drop table ’+@m_tbname
exec(@sql)

if @isout=1
begin
 set @sql=’bcp "select top 1 ’+@fdname+’ from ’
  +@tbname+case isnull(@tj,’’) when ’’ then ’’
   else ’ where ’+@tj end
  +’" queryout "’+@fname
  +’" /S"’+@servename
  +case when isnull(@username,’’)=’’ then ’’
   else ’" /U"’+@username end
  +’" /P"’+isnull(@password,’’)
  +’" /i"’+@fname_in+’"’
 exec master..xp_cmdshell @sql
end
else
begin
 –为数据导入准备临时表
 set @sql=’select top 0 ’+@fdname+’ into ’
  +@m_tbname+’ from ’ +@tbname
 exec(@sql)

 –将数据导入到临时表
 set @sql=’bcp "’+@m_tbname+’" in "’+@fname
  +’" /S"’+@servename
  +case when isnull(@username,’’)=’’ then ’’
   else ’" /U"’+@username end
  +’" /P"’+isnull(@password,’’)
  +’" /i"’+@fname_in+’"’
 exec master..xp_cmdshell @sql
 
 –将数据导入到正式表中
 set @sql=’update ’+@tbname
  +’ set ’+@fdname+’=b.’+@fdname
  +’ from ’+@tbname+’ a,’
  +@m_tbname+’ b’
  +case isnull(@tj,’’) when ’’ then ’’
   else ’ where ’+@tj end
 exec(@sql)

 –删除数据处理临时表
 set @sql=’drop table ’+@m_tbname
end

–删除数据处理应答文件
set @sql=’del ’+@fname_in
exec master..xp_cmdshell @sql

go

/** 导入文本文件
EXEC master..xp_cmdshell ’bcp "dbname..tablename" in c:DT.txt -c -Sservername -U sa -P password’

改为如下,不需引号
EXEC master..xp_cmdshell ’bcp dbname..tablename in c:DT.txt -c -Sservername -U sa -P password’

/** 导出文本文件
EXEC master..xp_cmdshell ’bcp "dbname..tablename" out c:DT.txt -c -Sservername -U sa -P password’
此句需加引号
==================================================================================

如何远程连接SQL Server数据库

如何远程连接SQL Server数据库
一.设置客户端网络实用工具
  • 点击“开始”-“程序”,在“Microsoft SQL Server”菜单中选择“客户端网络实用工具”。
  • 在“别名”选项中点击“添加”。
  • 在“服务器别名”中,填入您网站域名,在“网络库”区域中点击“TCP/IP”,在“连接参数”区域取消“动态决定端口”,指定“端口号”为2433。填写完毕后,点击“确定”按钮保存配置。
二.企业管理器的使用
  • 点击“开始”-“程序”,在“Microsoft SQL Server”菜单中打开“企业管理器”。在企业管理器中,右键单击“SQL Server组”,选择“新建SQL Server注册”。
  • 此时会出现SQL Server属性窗口,在“服务器”中填入您网站的域名,选择“使用SQL Server身份验证”,“登录名”和“密码”分别填入主机开通邮件中的用户名和密码,然后点击“确定”。
  • 连接成功后,你会看到“SQL Server组”中多了一个名称为您网站域名的服务器。此时,您就可以像操作本地SQL数据库一样管理网站数据库了。
 
注意事项
  • 如果连接的时候出现超时错误,更改超时时间即可,方法是点击“工具”-“选项”。
  • 在属性窗口中选择“高级”选项卡,将“登录超时”的数值设置为0。