Maxer 's Blog
态度决定一切,理想成就未来!
posts - 43,  comments - 18,  trackbacks - 2

 前几天去申请免费QQ号码,突然发现申请表单中的验证码内容换成了中文,这叫真叫我大跌眼镜感到好笑,Moper上的猫儿们都大骂腾讯采用中文验证码。^_^
    我不得不佩服腾讯为了防止目前网络上横行的QQ号码自动注册机而采取中文验证码的手段。仔细想了想感觉用程序生成随机的中文验证码并不是很难,下面就来介绍一下使用C#生成随机的中文汉字的原理。
  1、汉字编码原理
  到底怎么办到随机生成汉字的呢?汉字从哪里来的呢?是不是有个后台数据表,其中存放了所需要的所有汉字,使用程序随机取出几个汉字组合就行了呢?使用后台数据库先将所有汉字存起来使用时随机取出,这也是一种办法,但是中文汉字有这么多,怎么来制作呢?其实可以不使用任何后台数据库,使用程序就能做到这一切。要知道如何生成汉字,就得先了解中文汉字的编码原理。
  1980年,为了使每一个汉字有一个全国统一的代码,我国颁布了第一个汉字编码的国家标准: GB2312-80《信息交换用汉字编码字符集》基本集,简称GB2312,这个字符集是我国中文信息处理技术的发展基础,也是国内所有汉字系统的统一标准。到了后来又公布了国家标准GB18030-2000《信息交换用汉字编码字符集基本集的扩充》,简称GB18030,编程时如果涉及到编码和本地化的朋友应该对GB18030很熟悉。这是是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,同时也是未来我国计算机系统必须遵循的基础性标准之一。
  目前在中文WINDOWS操作系统中,.NET编程中默认的的代码页就是GB18030简体中文。但是事实上如果生成中文汉字验证码只须要使用GB2312字符集就已经足够了。字符集中除了我们平时大家都认识的汉字外,也包含了很多我们不认识平时也很少见到的汉字。如果生成中文汉字验证码中有很多我们不认识的汉字让我们输入,对于使用拼音输入法的朋友来说可不是好事,五笔使用者还能勉强根据汉字的长相打出来,呵呵!所以对于GB2312字符集中的汉字我们也不是全都要用。
  中文汉字字符可以使用区位码来表示,见
  汉字区位码表 http://navicy2005.home4u.china.com/resource/gb2312tbl.htm
  汉字区位码代码表 http://navicy2005.home4u.china.com/resource/gb2312tbm.htm
  其实这两个表是同一回事,只不过一个使用十六进制分区表示,一个使用区位所在的数字位置表示。 例如“好”字的十六进制区位码是ba c3,前两位是区域,后两位代表位置,ba处在第26区,“好”处在此区汉字的第35位也就是c3位置,所以数字代码就是2635。这就是GB2312汉字区位原理。根据《汉字区位码表 》我们可以发现第15区也就是AF区以前都没有汉字,只有少量符号,汉字都从第16区B0开始,这就是为什么GB2312字符集都是从16区开始的。
  2、.Net程序处理汉字编码原理分析
  在.Net中可以使用System.Text来处理所有语言的编码。在System.Text命名空间中包含众多编码的类,可供进行操作及转换。其中的Encoding类就是重点处理汉字编码的类。通过在.NET文档中查询Encoding类的方法我们可以发现所有和文字编码有关的都是字节数组,其中有两个很好用的方法:
  Encoding.GetBytes ()方法将指定的 String 或字符数组的全部或部分内容编码为字节数组
  Encoding.GetString ()方法将指定字节数组解码为字符串。   
  没错我们可以通过这两个方法将汉字字符编码为字节数组,同样知道了汉字GB2312的字节数组编码也就可以将字节数组解码为汉字字符。通过对“好”字进行编码为字节数组后
  Encoding gb=System.Text.Encoding.GetEncoding("gb2312");
  object[] bytes=gb.Encoding.GetBytes ("好");  
  发现得到了一个长度为2的字节数组bytes,使用
  string lowCode = System.Convert.ToString(bytes[0], 16); //取出元素1编码内容(两位16进制)
  string hightCode = System.Convert.ToString(bytes[1], 16);//取出元素2编码内容(两位16进制)  
  之后发现字节数组bytes16进制变码后内容竟然是{ba,c3},刚好是“好”字的十六进制区位码(见区位码表)。
  因此我们就可以随机生成一个长度为2的十六进制字节数组,使用GetString ()方法对其进行解码就可以得到汉字字符了。不过对于生成中文汉字验证码来说,因为第15区也就是AF区以前都没有汉字,只有少量符号,汉字都从第16区B0开始,并且从区位D7开始以后的汉字都是和很难见到的繁杂汉字,所以这些都要排出掉。所以随机生成的汉字十六进制区位码第1位范围在B、C、D之间,如果第1位是D的话,第2位区位码就不能是7以后的十六进制数。在来看看区位码表发现每区的第一个位置和最后一个位置都是空的,没有汉字,因此随机生成的区位码第3位如果是A的话,第4位就不能是0;第3位如果是F的话,第4位就不能是F。
  好了,知道了原理,随机生成中文汉字的程序也就出来了,以下就是生成4个随机汉字的C#控制台代码:  
  3、程序代码:   
  using System;
  using System.Text;   
  namespace ConsoleApplication
  {
      class ChineseCode
    {
    public static void Main()
    {
     //获取GB2312编码页(表)
     Encoding gb=Encoding.GetEncoding("gb2312");
    
     //调用函数产生4个随机中文汉字编码
     object[] bytes=CreateRegionCode(4);
    
     //根据汉字编码的字节数组解码出中文汉字
     string str1=gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
     string str2=gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
     string str3=gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));
     string str4=gb.GetString((byte[])Convert.ChangeType(bytes[3], typeof(byte[])));
    
     //输出的控制台
     Console.WriteLine(str1 + str2 +str3 +str4);
      }   
    /*
    此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将
    四个字节数组存储在object数组中。
    参数:strlength,代表需要产生的汉字个数
    */
    public static object[] CreateRegionCode(int strlength)
    {
     //定义一个字符串数组储存汉字编码的组成元素
     string[] rBase=new String [16]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};
    
     Random rnd=new Random();
    
     //定义一个object数组用来
     object[] bytes=new object[strlength];
    
     /**//*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中
     每个汉字有四个区位码组成
     区位码第1位和区位码第2位作为字节数组第一个元素
     区位码第3位和区位码第4位作为字节数组第二个元素
     */
     for(int i=0;i<strlength;i++)
     {
      //区位码第1位
      int r1=rnd.Next(11,14);
      string str_r1=rBase[r1].Trim();
     
      //区位码第2位
      rnd=new Random(r1*unchecked((int)DateTime.Now.Ticks)+i);//更换随机数发生器的
     
     种子避免产生重复值
      int r2;
      if (r1==13)
      {
       r2=rnd.Next(0,7);
      }
      else
      {
       r2=rnd.Next(0,16);
      }
      string str_r2=rBase[r2].Trim();
     
      //区位码第3位
      rnd=new Random(r2*unchecked((int)DateTime.Now.Ticks)+i);
      int r3=rnd.Next(10,16);
      string str_r3=rBase[r3].Trim();
   
      //区位码第4位
      rnd=new Random(r3*unchecked((int)DateTime.Now.Ticks)+i);
      int r4;
      if (r3==10)
      {
       r4=rnd.Next(1,16);
      }
      else if (r3==15)
      {
       r4=rnd.Next(0,15);
      }
      else
      {
       r4=rnd.Next(0,16);
      }
      string str_r4=rBase[r4].Trim();
   
      //定义两个字节变量存储产生的随机汉字区位码
      byte byte1=Convert.ToByte(str_r1 + str_r2,16);
      byte byte2=Convert.ToByte(str_r3 + str_r4,16);
      //将两个字节变量存储在字节数组中
      byte[] str_r=new byte[]{byte1,byte2};
     
      //将产生的一个汉字的字节数组放入object数组中
      bytes.SetValue(str_r,i);      
   }   
        return bytes;   
        }
 }   
  }    
  实现了随机生成汉字后,就可以使用.NET GDI来绘制自己需要的验证码图形了。具体的怎样生成验证码图片,以及改变其中字符的长和宽等效果网上已经有很多相关的文章,这里由于篇幅就不再介绍了。不过有一点要说明的是以上代码在中文版的Windows下才能运行,因为它带有GB的字符集,如果你是其他语言的操作系统,就需要安装GB字符集了。

posted @ 2006-09-06 16:33 Maxer`s Blog 阅读(209) 评论(2) 编辑
//测试代码
            FtpConfig config=new FtpConfig();
            config.FtpAddress="111.111.111.111";
            config.FtpMode="PASV";
            config.FtpPort="21";
            config.UserName="abc";
            config.PassWord="abcd";
            XmlSerializer xmlSer=new XmlSerializer(typeof(FtpConfig));
            FileStream stream = new FileStream("test.xml", FileMode.OpenOrCreate);
            xmlSer.Serialize( stream, config );    
            stream.Flush();
            stream.Close();

            FileStream stream2 = new FileStream("test.xml", FileMode.Open,FileAccess.Read);
            FtpConfig config2=(FtpConfig)xmlSer.Deserialize(stream2);
            stream2.Close();      

// FtpConfig 类


using System;
using System.Xml.Serialization;

namespace upfile
{
    /// <summary>
    /// FtpConfig 的摘要说明。
    /// </summary>
    [Serializable]
    public class FtpConfig
    {
        public FtpConfig()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }
        #region 字段
        private string _ftpAddress;
        private string _ftpPort;
        private string _ftpMode;
        private string _userName;
        private string _passWord;
        #endregion
        
        #region 属性    
   
        public string FtpAddress
        {
            get
            {
                return _ftpAddress;
            }
            set
            {
                _ftpAddress=value;
            }
        }
   
        public string FtpPort{
            get
            {
                return _ftpPort;
            }
            set
            {
                _ftpPort=value;
            }
        }
            
        public string FtpMode
        {
            get
            {
                return _ftpMode;
            }
            set
            {
                _ftpMode=value;
            }
        }
        public string UserName
        {
            get
            {
                return _userName;
            }
            set
            {
                _userName=value;
            }
        }
        public string PassWord
        {
            get
            {
                return _passWord;
            }
            set
            {
                _passWord=value;
            }
        }


        #endregion

    }
}
    

posted @ 2006-09-05 10:44 Maxer`s Blog 阅读(134) 评论(0) 编辑

只要恢复存储过程和表结构。
各位论坛的达人。十万火急的紧急问题求助!
最近这两周,我们部门正在做一个项目的重要升级。(主要是存储过程方面的,当然也加了一些表和修改了一部分程序的源代码)
昨天下午左右,项目经理让我更改一些表的数据库字段属性,把Description字段类型从NTEXT改为VARCHAR,由于表比较多,结构都是一样的(就是一年中每天一张表,记详单数据的,查了一下,大约有200左右个表的类型不是VARCHAR),当时不知道怎么的脑子没转,心想只要更新用户库的SYSCOLUMNS,改变这些字段的类型值不就可以做到了吗。(后面出了事故才醒悟过来,当时怎么不用ALTER TABLE来更改呢?)。
然后我就开始晕头晕脑的更新系统表SYSCOLUMNS,结果以不小心把SQL写错。写成

UPDATE MYDB..SYSCOLUMNS
     SET XTYPE=167,TYPESTAT=2,XUSERTYPE=167,LENGTH=256,XOFFSET=-11
    FROM
        (
   SELECT *
     FROM MYDB..SYSCOLUMNS
    WHERE [ID] IN
           (
    SELECT [ID]
      FROM MYDB..SYSOBJECTS
     WHERE [NAME] LIKE 'CORPBIL _%'
             )
           AND [NAME]='description' AND XTYPE=99
         ) AAA
--本来的意思是这个: 
  UPDATE MYDB..SYSCOLUMNS
     SET XTYPE=167,TYPESTAT=2,XUSERTYPE=167,LENGTH=256,XOFFSET=-11
   WHERE [ID] IN
           (
    SELECT [ID]
      FROM MYDB..SYSOBJECTS
     WHERE [NAME] LIKE 'CORPBIL _%'
             )
           AND [NAME]='description' AND XTYPE=99
结果导致了更新了整个用户库的所有的COLUMNS属性。接下来的结果当然是数据库崩溃。
所有的表,存储过程都没有了。而数据库之前没有得到备份,最早的备份是一个月前了。这就意味着这两周我们 这可是我们部门所有开发部同事做的所有工作都没有了。

两个星期的心血不能这样就百费了啊!!我怎么对得起同事们呢?下个星期就要系统上线了.现在那个急啊!!!!
请叫各位达人,像这种情况有没有办法恢复过来(不需要恢复数据,只要恢复存储过程就可以了。
以下是一些问题截图:
---------------------------------------
 

企业资源管理器中,点击崩溃的数据库,右键,属性。 出错




 

企业资源管理器中,点击崩溃的数据库数据表,出错。


 

在查询分析器里,SELECT * FROM SYSOBJECTS出错


在查询分析器里,SELECT * FROM SYSCOLUMNS出错

 

但是执行这个不报错。但是查询结果全部是空白。如图:

SELECT [name], [id], [xtype], [typestat], [xusertype],

       [length], [xprec], [xscale], [colid], [xoffset],

       [bitpos], [reserved], [colstat], [cdefault],

       [domain], [number], [colorder], [autoval], [offset],

       [collationid],[language]--, --[status],

       --[type],[usertype],[printfmt],[prec],[scale],[iscomputed]

       --[isoutparam], [isnullable], [collation], [tdscollation]  

FROM syscolumns

posted @ 2006-09-02 18:37 Maxer`s Blog 阅读(210) 评论(1) 编辑

下面都是我收集的一些比较常用的正则表达式,因为平常可能在表单验证的时候,用到的比较多。特发出来,让各位朋友共同使用。呵呵。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位

匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下:

只能输入数字:“^[0-9]*$”
只能输入n位的数字:“^\d{n}$”
只能输入至少n位数字:“^\d{n,}$”
只能输入m-n位的数字:“^\d{m,n}$”
只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$”
只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$”
只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$”
只能输入非零的正整数:“^\+?[1-9][0-9]*$”
只能输入非零的负整数:“^\-[1-9][0-9]*$”
只能输入长度为3的字符:“^.{3}$”
只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$”
只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$”
只能输入由26个小写英文字母组成的字符串:“^[a-z]+$”
只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$”
只能输入由数字、26个英文字母或者下划线组成的字符串:“^\w+$”
验证用户密码:“^[a-zA-Z]\w{5,17}$”正确格式为:以字母开头,长度在6-18之间,

只能包含字符、数字和下划线。
验证是否含有^%&',;=?$\"等字符:“[^%&',;=?$\x22]+”
只能输入汉字:“^[\u4e00-\u9fa5],{0,}$”
验证Email地址:“^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$”
验证InternetURL:“^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$”
验证电话号码:“^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$”

正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,

“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。
验证身份证号(15位或18位数字):“^\d{15}|\d{}18$”
验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1”“12”
验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”

正确格式为:“01”“09”和“1”“31”。

posted @ 2006-08-09 13:13 Maxer`s Blog 阅读(199) 评论(0) 编辑
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

(1)应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)         
    String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

(2)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现
   String.prototype.trim = function()
   {
      return this.replace(/(^\s*)|(\s*$)/g, "");
   }
(3)应用:利用正则表达式分解和转换IP地址
   function IP2V(ip) //IP地址转换成对应数值
   {
      re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式
      if(re.test(ip))
      {
         return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
      }
      else
      {
         throw new Error("Not a valid IP address!")
      }
   }
(4)应用:从URL地址中提取文件名的javascript程序
   s="http://www.9499.net/page1.htm";
   s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2") ; //Page1.htm
(5)应用:利用正则表达式限制网页表单里的文本框输入内容
    用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
    用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
    用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
    用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'')  "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

posted @ 2006-08-09 13:10 Maxer`s Blog 阅读(351) 评论(1) 编辑

所谓的数据传输,其实是指SQLServer访问Access、Excel间的数据。

为什么要考虑到这个问题呢?

由于历史的原因,客户以前的数据很多都是在存入在文本数据库中,如Acess、Excel、Foxpro。现在系统升级及数据库服务器如 SQLServer、ORACLE后,经常需要访问文本数据库中的数据,所以就会产生这样的需求。前段时间出差的项目,就是面临这样的一个问题: SQLServer和VFP之间的数据交换。

要完成标题的需要,在SQLServer中是一件非常简单的事情。

通常的可以有3种方式:1、DTS工具 2、BCP 3、分布式查询

DTS就不需要说了,因为那是图形化操作界面,很容易上手。

这里主要讲下后面两们,分别以查、增、删、改作为简单的例子:

下面废话就不说了,直接以T-SQL的形式表现出来。


一、SQLServer和Access

1、查询Access中数据的方法:

select * from OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from serv_user')

select * from OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="c:\DB2.mdb";User ID=Admin;Password=')...serv_user

2、从SQLServer向Access写数据:

insert into OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from Accee表')
select * from SQLServer表
或用BCP

master..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" out  "c:\db3.mdb" -c -q -S"." -U"sa" -P"sa"'

上面的区别主要是:OpenRowSet需要mdb和表存在,BCP会在不存在的时候生成该mdb

3、从Access向SQLServer写数据:有了上面的基础,这个就很简单了

insert into SQLServer表 select * from
OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from Accee表')

或用BCP

master..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" in  "c:\db3.mdb" -c -q -S"." -U"sa" -P"sa"'

4、删除Access数据:

delete from OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from serv_user')
where lock=0

5、修改Access数据:

update OpenRowSet('microsoft.jet.oledb.4.0',';database=c:\db2.mdb','select * from serv_user')
set lock=1

SQLServer和Access大致就这么多。


二、SQLServer和Excel


1、向Excel查询

select * from OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;HDR=yes;database=c:\book1.xls;','select * from [Sheet1$]') where c like '%f%'

select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\book1.xls',[sheet1$])

1)hdr=yes时可以把xls的第1行作为字段看待,如第1个中hdr=no的话,where时就会报错
2)[]和美圆$必须要,否则M$可不认这个账

2、修改Execl

update OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;hdr=yes;database=c:\book1.xls;','select * from [Sheet1$]')
set a='erquan' where c like '%f%'

3、导入导出


insert into OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;hdr=yes;database=c:\book1.xls;','select * from [Sheet2$]')(id,name)
select id,name from serv_user

或BCP

master..xp_cmdshell'bcp "serv-htjs.dbo.serv_user" out  "c:\book2.xls" -c -q -S"." -U"sa" -P"sa"'

从Excel向SQLServer导入:

select * into serv_user_bak
from OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0;HDR=yes;database=c:\book1.xls;','select * from [Sheet1$]')

如果表serv_user_bak不存在,则创建

有关BCP和分布式查询的详细解答,就查SQLServer自带的帮助吧。
SQLServer和txt文件、HTML文件、VFP文件的数据交换都显得非常容易了。。。。

其实这些内容在帮助里都有,偶只不过是总结了一下,方便大家参考,呵呵~~

posted @ 2006-08-06 17:18 Maxer`s Blog 阅读(129) 评论(0) 编辑
摘要: 1:普通SQL语句可以用Exec执行eg: Select * from tableName Exec('select * from tableName') sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N2:字段名,表名,数据库名之类作为变量时,必须用动态SQLeg: declare @fname varchar(20) set @f...阅读全文
posted @ 2006-07-24 10:25 Maxer`s Blog 阅读(120) 评论(0) 编辑
摘要: 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementById...阅读全文
posted @ 2006-06-08 09:58 Maxer`s Blog 阅读(254) 评论(0) 编辑
摘要: 问:为什么Session在有些机器上偶尔会丢失?答:可能和机器的环境有关系,比如:防火墙或者杀毒软件等,尝试关闭防火墙。问:为什么当调用Session.Abandon时并没有激发Session_End方法?答:首先Session_End方法只支持InProc(进程内的)类型的Session。其次要激发Session_End方法,必须存在Session(即系统中已经使用Session了),并且至少要...阅读全文
posted @ 2006-05-11 15:53 Maxer`s Blog 阅读(237) 评论(0) 编辑
摘要: 1.下载地址 http://msdn.microsoft.com/downloads/samples/internet/ASP_DOT_NET_ServerControls/WebControls/default.asp 安装后,通过“自定义工具箱”->“.net框架组件”把TreeView添加到工具箱里2.运行时无法显示 一般是TreeView的版本问题,最好下载英文版自动安装版本重新安装...阅读全文
posted @ 2006-04-27 11:04 Maxer`s Blog 阅读(525) 评论(0) 编辑
摘要: Expression Syntax: <%$ ... %> New in 2.0ASP.NET 2.0 adds a new declarative expression syntax for substituting values into a page before the page is parsed. This is useful for substituting connec...阅读全文
posted @ 2006-03-27 17:25 Maxer`s Blog 阅读(98) 评论(1) 编辑
摘要: Object Tag Syntax: <object runat="server" />Object tags enable page developers to declare and create instances of variables using a declarative, tag-based syntax. The following example demonstra...阅读全文
posted @ 2006-03-27 17:20 Maxer`s Blog 阅读(155) 评论(0) 编辑
摘要: 在ASP.NET 2.0中可以同是调用VB,C#中的类.By default, the App_Code directory can only contain files of the same language. However, you may partition the App_Code directory into subdirectories (each containing files...阅读全文
posted @ 2006-03-27 16:49 Maxer`s Blog 阅读(113) 评论(1) 编辑
摘要: 自从上次网站因为空间问题,关毕之后.已经时隔两个多月了.这次在网友Howej的帮助下,才得以恢复正常使用.在此由衷的向Howej说声谢谢!网站的地址还是,http://www.maxer.cn/在此对关注和支持我朋友们说声感谢,欢迎大家继续关注我的小站!阅读全文
posted @ 2006-03-20 15:26 Maxer`s Blog 阅读(91) 评论(0) 编辑
摘要: 软件很好用,基本上可以转所有的PDF,转换汉字也很顺利,没有乱码。主要是我很多的PDF电子书要在PDA(DELL X50 416MHZ, Windows Moblie 2003 2th)上看,而几个PDF阅读软件(如ADOBE READER FOR PPC)对汉字的识别不好,基本上都看不了。所以需要一个转成TXT的PDF转换软件,几经搜索,才发现这个。推荐给大家使用!点击下载: Pdf2TXT.r...阅读全文
posted @ 2006-01-06 13:09 Maxer`s Blog 阅读(9588) 评论(4) 编辑
摘要: dasblog的功能之一,通过这个以后就不必重复发文章了。阅读全文
posted @ 2006-01-06 00:54 Maxer`s Blog 阅读(124) 评论(0) 编辑
仅列出标题  下一页