问题首先因SDE和Oracle不在同一机器上引起,安装SDE时创建SDE服务总是失败,没办法心想干脆直连算了。但是以前也试过直连的方法,总是不成功,现在难道就能成功吗。为了保险起见,到ESRI支持网站上下载了全套的sp3,装上,然后重新创建SDE库,这次为了以后的兼容性和开发的灵活性,选择使用Oracle Spatial而不是blob。创建授权都很顺利,然后再在Catalog里创建直连,Hoho,居然成功了。
然后就是导数据,以前的数据都存在PersonalGeodatabase,也就是个mdb文件里,心想既然都是ESRI的空间数据库,不管是个人的,还是其它什么的,直接导入应该没问题。为什么不直接复制呢,因为数据需要再整理一下,用导入可以保证数据的一致性。结果这一导入毛病来了,点的图层都没什么问题。但以前从mapinfo转换来的线图层和面图层都报错,比如说面图层就报图元自相交之类。于是就找解决办法,在arctoolbox中发现一个repair geometry的工具,运行,改正,再导。这次真有好转了,大部分都导入成功。
不过还是有几个死活导不进去,oracle老是报错误的列名,真是大伤脑筋,最后心想不会是中文问题吧,于是在导的时候把目标名称改为英文,居然成功了。在Arccatalog里再改为中文,调用,没问题。毕竟现在数据库是在真正的服务器上,比本地的个人空间数据库快多了。
还有一点,导入的过程中,遇到了创建表不成功的情况,一查,发现是表空间已经满了,而表空间居然不是自动增长的,真是郁闷。把空间扩大,改成自动增长,一切又OK了。
体会:有时候系统报告的错误和实际情况不一定一致。要尝试不同的途径,不要轻易放弃。
前两天遇到这个问题,到处找答案,结果没找到一个简便易行的。干脆自己想了想,发现一个非常简单的方法,不知道别人怎么想的那么复杂,也许他们考虑的因素多一些。反正偶没考虑那么多,偶的目的只有一个:就是让要刷新的页面老老实实悄悄地刷新,同时保留以前提交数据后的模样,同时不要出现这个提示。
用location.reload()是不行了,直接给location赋值的话有时会不刷新,该提交的数据没提交。所以最简单的方法就是直接让该提交的表单提交:
parent.frameMain.document.form1.submit();
如果只是要刷新,不用提交数据,就搞个没用的form,让它提交或者还是给location赋值,但在地址后面加个?id=随机数,这样浏览器会认为地址和以前不同,会去重新读取页面,也就是刷新了。
在偶的系统中,是需要提交数据的,否则页面会丢失历史状态数据,所以用了直接提交的方法,代码一行都不用增加就解决了。
试了这两种技术,发现果真如arcgis的文档所言,IMS速度奇快,Arcgis Server编程很方便,真是不好取舍。由于时间要求紧,只好先采用Arcgis Server做出来再说了。真的没时间去研究ArcXML。也许等直接支持.net的ims9.2出来就好办了。
用.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();
}