**
数据增加
**
一、原理
数据库ITable通过Insert()方法取得插入记录的游标,同时检查锁状态,为插入记录做准备。游标通过InsertRow,实现数据插入,并通过Flush()强制写入数据库。
二、实现代码
1. .net
//存数据库,增加记录
private void InsertRow(){
if (_currentFc != null && _currentRowbuf!=null)
{
IRowBuffer rbuffer = _currentFc.CreateRowBuffer();//创建一条新的记录
for (int i = 0; i < _currentFc.GetFields().Count; ++i)
{
if (_currentFc.GetFields().Get(i).Name != "oid")//非主键“oid”的字段
{
int npos =_currentRowbuf.FieldIndex(_currentFc.GetFields().Get(i).Name);
rbuffer.SetValue(npos, _currentRowbuf.GetValue(npos)); //设置记录除主键"oid"外字段值
}
int npos0 = rbuffer.FieldIndex("Geometry");
IModelPoint mpnew=geoEditing as IModelPoint;//geoEditing为几何编辑模式下创建的ModelPoint
rbuffer.SetValue(npos0, mpnew); //设置空间几何字段的值
}
IFdeCursor cursor= _currentFc.Insert();//获取insert游标
if(rbuffer!=null){
cursor.InsertRow(rbuffer);//插入记录
cursor.Flush();//写入数据库
}
}
if (cursor != null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(cursor);
cursor = null;
}
}
2. JS
var cursorinsert=fc.insert();//获取insert游标
cursorinsert.insertRow(insertRowBuffer);//插入记录,insertRowBuffer的创建可以参考.NET部分的rbuffer对象
cursorinsert.flush(); //写入数据库
三、注意事项
1、在执行Insert()方法时数据库会对ObjectClass加锁,需在执行完插入操作后调用ObjectClass::Close释放锁提交数据。否则易出现可视化时拿不到数据的问题。
2、当数据源类型是Firbird/SQLite的时候,如果文件大小超过500MB,将会抛出“拒绝访问”的异常。