首页 / 浏览问题 / 组件GIS / 问题详情
遍历记录集取值并存储
58EXP 2019年08月22日

使用产品:iobject.net 9D(2019) 操作系统:WIN10X64  

您好,我现在有一个点数据集和相应的九条记录,我要遍历这个记录集,循环给服务器发送每一行记录对应的“trasID”字段,现在我调用超图的记录集移动到首尾,然后利用

recordset.movefirst()

for(int i;i<=recordset.readcount)

{

...........

   message = Convert.ToString(recordset.GetFieldValue("trasID"));//获取当前行的字段值,并发送给服务器

.....

recordset.movenext();

}

这种遍历并定位记录的方法,我现在能遍历前两行的记录,并把服务器返回来的值存储在属性表,但是永远卡在第二行,遍历不到第三行了。就是我上面的message只能获取第二行记录的相应字段值,转不到第三行。请问是出了什么问题呢。我遍历后的结果如下

属性表说明

遍历后结果:预期结果是3-9行的数据不是初始的1,像前两行那样是接受的返回值。我断点调试过,每次遍历完第二行后,记录集移动不到下一行了,一直只能返回第二行的相应字段值。


          详细遍历存储部分代码如下      

Recordset recordset = ((DatasetVector)mapControl2.Map.Workspace.Datasources[1].Datasets["point"]).GetRecordset(false, CursorType.Dynamic);//获取工作空间对应的点数据集的记录
                Int32 count = recordset.RecordCount;//我这个记录集有九条点记录
                recordset.MoveFirst();//移动到记录集的首位
                string message;
                byte[] byteArray;
                int length;
                string receieveMessage;
                for (int i=1; i <= count; i++)
                {
                    #region 发送给服务器数值
                    message = Convert.ToString(recordset.GetFieldValue("trasID"));
                    //MessageBox.Show("发送:“" + message + "”--" + DateTime.Now.ToShortTimeString());
                    NetworkStream stream = tcpClient.GetStream();
                    byteArray = Encoding.Unicode.GetBytes(message);
                    stream.Write(byteArray, 0, byteArray.Length);       //发送字节数组
                    //接收服务器返回的数值
                    stream = tcpClient.GetStream();
                    byteArray = new byte[1024];
                    length = stream.Read(byteArray, 0, 1024);
                    receieveMessage = Encoding.Unicode.GetString(byteArray, 0, length);
                    string[] ss = receieveMessage.Split();//把返回值存储为字符串数组
                    //把范围值分别存储在对应的字段中
                    bool b1=recordset.SetFieldValue("dryNum", Convert.ToInt32(ss[0]));
                    bool b2 = recordset.SetFieldValue("wetNum", Convert.ToInt32(ss[1]));
                    bool b3 = recordset.SetFieldValue("cirNum", Convert.ToInt32(ss[2]));
                    bool b4 = recordset.SetFieldValue("harNum", Convert.ToInt32(ss[3]));
                    recordset.Update();//提交记录更新
                    recordset.Refresh();
                    bool b5 = recordset.MoveNext();//移动到下一行记录
                    bool b6=recordset.Edit();
                    //MessageBox.Show("收到:“" + receieveMessage + "”--" + DateTime.Now.ToShortTimeString());

1个回答

您好,首先第一个问题,我们记录是从0开始索引,当然这个不是造成您问题的原因,您问题原因在于最后调用了recordset.edit(),关于edit文档注释如下:

“用 Edit 编辑后,一定要用 Update 方法更新 Recordset,而且在 Update 之前不能移动当前记录的位置,否则编辑失败,Recordset也可能被损坏。”

所以建议您采用下面任意一种方法:

1.更新属性前调用edit,更新属性后Update

2.使用批量更新,不用edit照样能编辑更新属性
胡林
1
5,985EXP 2019年08月22日
哦哦,谢谢,问题现在解决了,能够一直往下遍历,但是我还是不清楚,为什么开始能从第一条记录遍历到第二条记录,但是从第二行到不了第三行?
因为你在edit之前先movenext,已经移动到第二条了
哦哦,谢谢
...