测试了一天,终于可以工作了,配置大致如下:

Apache2.2+moj_jk1.2+tomcat5.5.9


在将SQLServer的数据迁移到Oracle时,常常会碰到一个这样的问题,SQLServer的表格名称是小写的,但Oracle默认是大写的,如果未做特别处理的话,SQLServer和tblIpaddr导到Oracle里变成了"tblIpaddr" (有引号,Oracle区别大小写,与TBLIPADDR有区别),所在,需要在迁移前,将SQLServer的所有表格名改为大写:

EXEC sp_configure 'allow updates',1 RECONFIGURE WITH OVERRIDE
go

UPDATE sysobjects SET name=upper(name) WHERE type='U';
go

EXEC sp_configure 'allow updates',0 RECONFIGURE WITH OVERRIDE
go

---------------------
以上方法只适合于SQLServer2000,SQLServer2005不允许直接更改系统表,以下SQL兼容2000和2005:

DECLARE @oldTName varchar(50)
DECLARE @newTName varchar(50)
--Author: ipaddr, 鱼漂

DECLARE tableList CURSOR FOR
SELECT name FROM sysobjects WHERE type='U' ORDER BY name

OPEN tableList
FETCH NEXT FROM tableList INTO @oldTName
WHILE @@FETCH_STATUS=0
BEGIN

SET @newTName=upper(@oldTName)
EXEC sp_rename @oldTName,@newTName

FETCH NEXT FROM tableList INTO @oldTName

END

CLOSE tableList
DEALLOCATE tableList

C#(dotNet 2.0)中读写配置文件

[不指定 2007/08/18 17:21 | by ipaddr ]

C#(dotNet 2.0)中读写配置文件

dotNet已推荐使用新的方法读写配置文件,假设配置文件如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <appSettings>
  <add key="DBPath" value="data.mdb" />
 </appSettings>
</configuration>

首先,加入对System.configuration的引用(在资源管理器中,加入引用)

使用如下的方法读入配置:

using System.Configuration;

private Configuration config;
private AppSettingsSection appConfig;

config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
appConfig = config.AppSettings;
MessageBox.Show(appConfig.Settings["DBPath"].Value);

在Windows下安装CVSNT

[不指定 2007/08/17 10:09 | by ipaddr ]

在Windows下安装CVSNT

1 首先从www.cvsnt.org下载CVS服务器软件,文件名为cvsnt-2.5.01.1976.msi,CVSNT需要使用NTFS的文件格式,所以确保CVSNT和库安装在NTFS上,然后将CVSNT的主目录下的bin目录添见到系统的path路径中。

2 CVSNT的设置。打开CVSNT Control Panel,点击“Server Settings”,这里我们需要设置一下“Run as”和“Default”,分别是运行CVSNT程序的用户和计算机名称,这里可以设置系统的administrator即可。

3 接下来我们需要设置CVS库,只需在设置面板中选择“Repositories”,然后创建相关的库即可。然后我们就可以通过 :pserver:username@localhost:/reposname去引用这个库。

4 设置库的权限。下面我们需要设置访问CVS库的用户信息,这里我们需要添加新的用户。在服务器端,设置一下CVSROOT,这里CVSROOT为库所在的目录,如d:\respository\cvs\respo1,然后执行cvs passwd命令即可,如下:

> cvs passwd –a –r administrator username

这样就添加了一个新的访问特定库的新用户。如果不设置CVSROOT,可以通过cvs –d d:\respository\cvs\respo1 直接访问库。关于cvs的passwd的命令,请参考 cvs passwd –help

5 创建CVS 库的管理员,只需将CVS的用户名称写如CVSROOT/admin文件中即可(一行一个用户名称,最后一个用户后添见一个空白行)。其他设置读取或写入权限,只需设置 readers 和 writers文件即可。

6 其他相关的设置,请参考CVS标准设置。

cd CVSROOT
cvs chown cvsadmin   //更改所有者为cvsadmin
cvs chacl default:n   //默认权限为n
cvs chacl cvsadmin:rwc  //添加cvsadmin

cd CVSROOT
cvs chown cvsadmin
cvs chacl -u default -p n
cvs chacl -u cvsadmin -p rwc

Reflector for .NET 下载地址http://www.aisto.com/roeder/dotnet/

1.下载Reflector.FileDisassembler.zip,
Reflector.FileDisassembler.zip下载地址: 
http://www.denisbauer.com/NETTools/FileDisassembler.aspx 
解压后得到一些文件,其中Reflector.FileDisassembler.dll是已经编译好的,其它是它源码;
2.打开Reflector,在view菜单下的Add-Ins,将Reflector.FileDisassembler.dll添加到里面;
3.open一个dll,exe,或mcl为后缀的文件,当然要支持.net的
4.选择要反编译的dll(会在列表中显示),选择Tools->File Disassembler,在右窗口会出现设置存放源码位置的路径,点击产生就可以了!

唾手可得的宝藏:Mono源码

[不指定 2007/08/15 18:31 | by ipaddr ]
“源码是最好的文档”,有了源码,任何软件系统在开发人员面前就毫无“神秘”可言了...

今天需要做一个上传文件的Web页面,在调用HttpPostedFile.SaveAs(String filename)方法将文件写到服务器磁盘上时,想到如果此文件已经存在于磁盘上,这个方法会如何处理呢?直接覆盖?抛出异常?

翻一下.NET Framework文档,可惜里面没有对这个情况进行说明。于是进入Mono源码目录,定位到HttpPostedFile.cs文件,用记事本打开,找到SaveAs(String filename)方法,第一句就是:

FileStream File = new FileStream(filename, FileMode.Create);

OK,确切答案就是如果已经存在同名文件会直接覆写。

我猜一定有人会想,“万一Mono的实现和.Net Framework不同怎么办?”其实我过后就这么想了,于是用Reflector打开了System.Web.dll,定位这个方法,呵呵,.Net Framework的实现也是“FileMode.Create”。不过.Net Framework使用了一个try...catch来保证关闭这个FileStream,而Mono的实现里面则没有,嗯,这是不是意味着Mono的稳定性仍有不少改进之处呢?

Load Balancing For Tomcat

[不指定 2007/08/13 14:39 | by ipaddr ]

要求支持Sticky Session功能,主要有以下几种方案:

C#使用Pop3接收邮件的类

[不指定 2007/08/13 14:34 | by ipaddr ]

支持SSL,请点击此处下载 [file]attachment/200708/pop3mailclient.rar[/file]

使用C#做MX记录查询

[不指定 2007/08/13 14:30 | by ipaddr ]

using System;
using System.Collections;
using System.ComponentModel;
using System.Runtime.InteropServices;

//How to use
//string[] s= MXSearch.GetMXRecords("eit.name");
//foreach (string st in s)
//Console.WriteLine("Server: {0}",st);

namespace Eit.Name.Bcomcn
{
    class MXSearch
    {
        public MXSearch()
        {
        }

        #region importDll

        [DllImport("dnsapi", EntryPoint = "DnsQuery_W", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
        private static extern int DnsQuery([MarshalAs(UnmanagedType.VBByRefStr)]ref string pszName, QueryTypes wType, QueryOptions options, int aipServers, ref IntPtr ppQueryResults, int pReserved);

        [DllImport("dnsapi", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern void DnsRecordListFree(IntPtr pRecordList, int FreeType);

        #endregion


        public static string[] GetMXRecords(string domain)
        {

            IntPtr ptr1 = IntPtr.Zero;
            IntPtr ptr2 = IntPtr.Zero;
            MXRecord recMx;
            if (Environment.OSVersion.Platform != PlatformID.Win32NT)
            {
                throw new NotSupportedException();
            }
            ArrayList list1 = new ArrayList();
            int num1 = MXSearch.DnsQuery(ref domain, QueryTypes.DNS_TYPE_MX, QueryOptions.DNS_QUERY_BYPASS_CACHE, 0, ref ptr1, 0);
            if (num1 != 0)
            {
                throw new Win32Exception(num1);
            }
            for (ptr2 = ptr1; !ptr2.Equals(IntPtr.Zero); ptr2 = recMx.pNext)
            {
                recMx = (MXRecord)Marshal.PtrToStructure(ptr2, typeof(MXRecord));
                if (recMx.wType == 15)
                {
                    string text1 = Marshal.PtrToStringAuto(recMx.pNameExchange);
                    list1.Add(text1);
                }
            }
            MXSearch.DnsRecordListFree(ptr2, 0);
            return (string[])list1.ToArray(typeof(string));
        }

        private enum QueryOptions
        {
            DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE = 1,
            DNS_QUERY_BYPASS_CACHE = 8,
            DNS_QUERY_DONT_RESET_TTL_VALUES = 0x100000,
            DNS_QUERY_NO_HOSTS_FILE = 0x40,
            DNS_QUERY_NO_LOCAL_NAME = 0x20,
            DNS_QUERY_NO_NETBT = 0x80,
            DNS_QUERY_NO_RECURSION = 4,
            DNS_QUERY_NO_WIRE_QUERY = 0x10,
            DNS_QUERY_RESERVED = -16777216,
            DNS_QUERY_RETURN_MESSAGE = 0x200,
            DNS_QUERY_STANDARD = 0,
            DNS_QUERY_TREAT_AS_FQDN = 0x1000,
            DNS_QUERY_USE_TCP_ONLY = 2,
            DNS_QUERY_WIRE_ONLY = 0x100
        }

        private enum QueryTypes
        {
            DNS_TYPE_MX = 15
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct MXRecord
        {
            public IntPtr pNext;
            public string pName;
            public short wType;
            public short wDataLength;
            public int flags;
            public int dwTtl;
            public int dwReserved;
            public IntPtr pNameExchange;
            public short wPreference;
            public short Pad;
        }


    }
}

Apply Google Apps

[不指定 2007/08/10 23:11 | by ipaddr ]

一直想弄个Google Host来玩玩,以前申请过N次,都被拒绝,Google老是玩这招,不让你那么容易得到,象以前的Gmail.

前几天登录到Gmail,退出后,发现有一个Google Apps的链接,点击去一看,很不错的东东,就是以前的Host服务,现在改名叫Apps了。马上开始申请。

目前还不支持.cn的域名,尝试用eit.name可以通过,但在最3步时,无论选择哪个国家,都提示你不支持,真是郁闷,Google有时还真是无理呢。

后来想想,可能是根据IP来判断的,暂时不对中国用户开放,于是马上登录到美国的服务器,再次申请,一切顺利,哈哈哈哈哈。。。。。。。。。。。。。。。。。。。

解析好eit.name的域名后,会在48小时内生效,可以开通100个用户的使用。真开心。。。。。。。。。。。。

Google真是好东西,最担心就是被封锁。

--------------------------------------------
2009.2更新
--------------------------------------------
目前cn域名仍不能注册,但在注册时,填写域名用xxx.CN (大写CN)也同样可以注册。
分页: 1/2 第一页 1 2 下页 最后页 [ 显示模式: 摘要 | 列表 ]