somecold

Playing by heart,never too late

常用链接

统计

最新评论

2006年2月21日 #

使用SDE的一点体会

        问题首先因SDE和Oracle不在同一机器上引起,安装SDE时创建SDE服务总是失败,没办法心想干脆直连算了。但是以前也试过直连的方法,总是不成功,现在难道就能成功吗。为了保险起见,到ESRI支持网站上下载了全套的sp3,装上,然后重新创建SDE库,这次为了以后的兼容性和开发的灵活性,选择使用Oracle Spatial而不是blob。创建授权都很顺利,然后再在Catalog里创建直连,Hoho,居然成功了。
        然后就是导数据,以前的数据都存在PersonalGeodatabase,也就是个mdb文件里,心想既然都是ESRI的空间数据库,不管是个人的,还是其它什么的,直接导入应该没问题。为什么不直接复制呢,因为数据需要再整理一下,用导入可以保证数据的一致性。结果这一导入毛病来了,点的图层都没什么问题。但以前从mapinfo转换来的线图层和面图层都报错,比如说面图层就报图元自相交之类。于是就找解决办法,在arctoolbox中发现一个repair geometry的工具,运行,改正,再导。这次真有好转了,大部分都导入成功。
        不过还是有几个死活导不进去,oracle老是报错误的列名,真是大伤脑筋,最后心想不会是中文问题吧,于是在导的时候把目标名称改为英文,居然成功了。在Arccatalog里再改为中文,调用,没问题。毕竟现在数据库是在真正的服务器上,比本地的个人空间数据库快多了。
        还有一点,导入的过程中,遇到了创建表不成功的情况,一查,发现是表空间已经满了,而表空间居然不是自动增长的,真是郁闷。把空间扩大,改成自动增长,一切又OK了。
        体会:有时候系统报告的错误和实际情况不一定一致。要尝试不同的途径,不要轻易放弃。

posted @ 2006-02-21 10:50 老家伙来挨踢 阅读(181) 评论(0) 编辑

2006年2月13日 #

用Java编写的简单SOAP客户机调用.Net开发的Web Service

Web Service也不是什么新技术了,尽管了解的时间很长,但一直没用过。现在的一个项目可能要用.Net开发WebService而客户端可能是Java应用,也可能是.Net应用。由于时间要求紧,所以第一位的技术要求就是简单,同时也要具有一定的灵活性。用.Net开发WebService非常简单,就不说了,但怎么用Java调用最容易呢?
在网上搜了一下,找到了一篇文章,原文见http://tech.ccidnet.com/art/295/20030120/37087_1.html
源代码贴在这,供以后参考:
 1import java.io.*;
 2import java.net.*;
 3public class SOAPClient4XG {
 4    public static void main(String[] args) throws Exception {
 5        if (args.length  < 2{
 6            System.err.println("Usage:  java SOAPClient4XG " +
 7                               "http://soapURL soapEnvelopefile.xml" +
 8                               " [SOAPAction]");
 9                System.err.println("SOAPAction is optional.");
10            System.exit(1);
11        }

12        String SOAPUrl      = args[0];
13        String xmlFile2Send = args[1];
14          String SOAPAction = "";
15        if (args.length  > 2
16                SOAPAction = args[2];
17        // Create the connection where we're going to send the file.
18        URL url = new URL(SOAPUrl);
19        URLConnection connection = url.openConnection();
20        HttpURLConnection httpConn = (HttpURLConnection) connection;
21        // Open the input file. After we copy it to a byte array, we can see
22        // how big it is so that we can set the HTTP Cotent-Length
23        // property. (See complete e-mail below for more on this.)
24        FileInputStream fin = new FileInputStream(xmlFile2Send);
25        ByteArrayOutputStream bout = new ByteArrayOutputStream();    
26        // Copy the SOAP file to the open connection.
27        copy(fin,bout);
28        fin.close();
29        byte[] b = bout.toByteArray();
30        // Set the appropriate HTTP parameters.
31        httpConn.setRequestProperty( "Content-Length",
32                                     String.valueOf( b.length ) );
33        httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
34          httpConn.setRequestProperty("SOAPAction",SOAPAction);
35        httpConn.setRequestMethod( "POST" );
36        httpConn.setDoOutput(true);
37        httpConn.setDoInput(true);
38        // Everything's set up; send the XML that was read in to b.
39        OutputStream out = httpConn.getOutputStream();
40        out.write( b );    
41        out.close();
42        // Read the response and write it to standard out.
43        InputStreamReader isr =
44            new InputStreamReader(httpConn.getInputStream());
45        BufferedReader in = new BufferedReader(isr);
46        String inputLine;
47        while ((inputLine = in.readLine()) != null)
48            System.out.println(inputLine);
49        in.close();
50    }

51  // copy method from From E.R. Harold's book "Java I/O"
52  public static void copy(InputStream in, OutputStream out) 
53   throws IOException {
54    // do not allow other threads to read from the
55    // input or write to the output while copying is
56    // taking place
57    synchronized (in) {
58      synchronized (out) {
59        byte[] buffer = new byte[256];
60        while (true{
61          int bytesRead = in.read(buffer);
62          if (bytesRead == -1break;
63          out.write(buffer, 0, bytesRead);
64        }

65      }

66    }

67  }
 
68}


试了一下,成功。只用两个标准的包就完成了任务,真够简单了。只需把这个程序改成一个过程,就可以在自己的应用中使用了。
该程序在使用的时候要有几个参数:WebService的URL,请求的Soap头部(存在xml文件中),SoapAction(指定要调用的方法)。假设我用.Net开发的WebServiceURL是http://localhost/ws1/service.asmx ,要调用的方法名是GetWeekDay,Soap请求放在getweekday.xml文件中,具体如下:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  
<soap:Body>
    
<GetWeekDay xmlns="http://tempuri.org/">
      
<i>2</i>
    
</GetWeekDay>
  
</soap:Body>
</soap:Envelope>

注意:原文是调用用Java写的WebService,文件中没有第一行。

运行:

 

java SOAPClient4XG http://localhost/ws1/service.asmx getweekday.xml http://tempuri.org/GetWeekDay



返回结果中文会有点乱码,需要处理一下。

posted @ 2006-02-13 15:17 老家伙来挨踢 阅读(1766) 评论(1) 编辑

2006年1月13日 #

也谈“不重新提交信息,则无法刷新页面”的简单解决方法

    前两天遇到这个问题,到处找答案,结果没找到一个简便易行的。干脆自己想了想,发现一个非常简单的方法,不知道别人怎么想的那么复杂,也许他们考虑的因素多一些。反正偶没考虑那么多,偶的目的只有一个:就是让要刷新的页面老老实实悄悄地刷新,同时保留以前提交数据后的模样,同时不要出现这个提示。
用location.reload()是不行了,直接给location赋值的话有时会不刷新,该提交的数据没提交。所以最简单的方法就是直接让该提交的表单提交:
    parent.frameMain.document.form1.submit();
如果只是要刷新,不用提交数据,就搞个没用的form,让它提交或者还是给location赋值,但在地址后面加个?id=随机数,这样浏览器会认为地址和以前不同,会去重新读取页面,也就是刷新了。
    在偶的系统中,是需要提交数据的,否则页面会丢失历史状态数据,所以用了直接提交的方法,代码一行都不用增加就解决了。

posted @ 2006-01-13 18:16 老家伙来挨踢 阅读(579) 评论(0) 编辑

ArcGis Server还是ArcIMS

试了这两种技术,发现果真如arcgis的文档所言,IMS速度奇快,Arcgis Server编程很方便,真是不好取舍。由于时间要求紧,只好先采用Arcgis Server做出来再说了。真的没时间去研究ArcXML。也许等直接支持.net的ims9.2出来就好办了。

posted @ 2006-01-13 17:24 老家伙来挨踢 阅读(362) 评论(0) 编辑

2005年8月29日 #

初学者专用超轻量级数据库访问类

用.net时间不是太久,感觉直接用.net提供的数据库访问对象不方便,老是要不停的new,然后还要close,很多重复代码,于是动手写了一个简单的数据访问类,尤其适合于小型的net应用程序。此类主要适于使用sql语句进行数据操作,没有封装DataSet。代码如下(使用oledb数据访问对象):
 public class DB
 {
  System.Data.OleDb.OleDbCommand command=null;
  System.Data.OleDb.OleDbConnection connection=null;
  System.Data.OleDb.OleDbDataAdapter dataadapter=null;
  System.Data.OleDb.OleDbCommandBuilder commandbuilder=null;
  System.Data.OleDb.OleDbDataReader reader=null;
  System.Data.OleDb.OleDbTransaction transaction=null;

  public string ErrorInfo="";
  public bool hasError=false;

  public System.Data.OleDb.OleDbConnection Connection
  {
       get
       {
            if(connection==null)
            {
                 try
                 {
                      connection=new System.Data.OleDb.OleDbConnection(System.Configuration.ConfigurationSettings.AppSettings["dbconnstring"]);
                      connection.Open();
                 }
                 catch(Exception ee)
                 {
                      ErrorInfo=ee.Message;
                      hasError=true;
                 }
            }
            else
            {
                 try
                 {
                      connection.Open();
                 }
                 catch(Exception ee)
                 {
                      ErrorInfo=ee.Message;
                      hasError=true;
                 }
            }
            return connection;
       }
  }
  public System.Data.OleDb.OleDbCommand Command
  {
       get
       {
            if(command==null)
            {
                 try
                 {
                      command=new System.Data.OleDb.OleDbCommand("",this.Connection);
                 }
                 catch(Exception ee)
                 {
                      ErrorInfo=ee.Message;
                      hasError=true;
                 }
            }

            return command;
       }
  }
  
  public System.Data.OleDb.OleDbDataAdapter DataAdapter
  {
       get
       {
            if(dataadapter==null)
            {
                 try
                 {
                      dataadapter=new System.Data.OleDb.OleDbDataAdapter(this.Command);
                      commandbuilder=new System.Data.OleDb.OleDbCommandBuilder(dataadapter);
                 }
                 catch(Exception ee)
                 {
                      ErrorInfo=ee.Message;
                      hasError=true;
                 }
            }

            return dataadapter;
       }
  }

  public System.Data.OleDb.OleDbCommandBuilder CommandBuilder
  {
           get
           {
                return commandbuilder;
           }
  }

  public System.Data.OleDb.OleDbDataReader Reader
  {
       get
       {
            try
            {
                 if(reader==null)
                      reader=this.Command.ExecuteReader();
                 if(reader.IsClosed)
                      reader=this.Command.ExecuteReader();
            }
            catch(Exception ee)
            {
                 ErrorInfo=ee.Message;
                 hasError=true;
            }
            return reader;
       }
  }

  public System.Data.OleDb.OleDbTransaction Transaction
  {
       get
       {
            try
            {
                 if(transaction==null)
                  transaction=this.Connection.BeginTransaction();
            }
            catch(Exception ee)
            {
                 ErrorInfo=ee.Message;
                 hasError=true;
            }

            return transaction;
       }
  }

  public DB()
  {
  }

  public DB(string connstr)
  {
       try
       {
            connection=new System.Data.OleDb.OleDbConnection(connstr);
       }
       catch(Exception ee)
       {
            ErrorInfo=ee.Message;
            hasError=true;
       }
  }

  ~DB()
  {
       try
       {
            connection.Close();
       }
       catch
       {
       }
  }

  public void CloseConnection()
  {
       try
       {
            connection.Close();
       }
       catch
       {
       }
    }
 }

如果是在asp.ne中使用,则可以在web.config中加一个appsettings项:dbconnstring,直接DB db=new DB()创建就可使用,不是则使用带参数的构造函数传递连接字符串。
实际查询例子:
DB db=new DB();
db.Command.CommandText="select title,content from news where id=1";
if(db.Reader.())
{
    string title=db.Reader.getString(0);
.............
}

或者使用table或dataset:
    db.DataAdapter.fill(ds);

若要使用事务这样:
try
{
    db.Command.Transaction=db.Transaction;
    ......    数据更新操作
    db.Transaction.Commit();
}
catch
{
    db.Transaction.Rollback();
}

posted @ 2005-08-29 12:00 老家伙来挨踢 阅读(495) 评论(1) 编辑

2005年8月25日 #

老家伙就不能挨踢吗?

很多想当然的东西未必合理,我想

posted @ 2005-08-25 11:17 老家伙来挨踢 阅读(123) 评论(1) 编辑