Rs.recordcount=-1的解决办法

本文详细介绍了在使用ADO连接数据库时,如何通过设置rs.CursorLocation参数来解决RecordCount属性总是返回-1的问题。解释了客户端游标和服务端游标的区别,并探讨了不同设置下对RecordCount的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来自(xifeijian) : http://blog.youkuaiyun.com/xifeijian/article/details/8618593

利用ADO连接数据库时,Rs.recordcount总是返回-1,可能的解决办法如下:在记录集打开前加上rs.cursorlocation=3 

rs.CursorLocation=3 是什么意思   

3 代表rs.CursorLocation = adUseClient  
就是代表使用客户端光标,和他对应的是 rs.CursorLocation = adUseServer 服务端光标  
---------------------------  
CursorLocation 属性  

设置或返回游标服务的位置。  

设置和返回值  

设置或返回可设置为以下某个常量的长整型值。  

常量 说明  
adUseNone 没有使用游标服务。(该常量已过时并且只为了向后兼容才出现)。  
adUseClient 使用由本地游标库提供的客户端游标。本地游标服务通常允许使用的许多功能可能是驱动程序提供的游标无法使用的,因此使用该设置对于那些将要启用的功能是有好处的。AdUseClient 具有向后兼容性,也支持同义的 adUseClientBatch。 
adUseServer 默认值。使用数据提供者的或驱动程序提供的游标。这些游标有时非常灵活,对于其他用户对数据源所作的更改具有额外的敏感性。但是,Microsoft Client Cursor Provider(如已断开关联的记录集)的某些功能无法由服务器端游标模拟,通过该设置将无法使用这些功能。 

说明  

该属性允许在可用于提供者的各种游标库中进行选择。通常,可以选择使用客户端游标库或位于服务器上的某个游标库。  

该属性设置仅对属性已经设置后才建立的连接有影响。更改 CursorLocation 属性不会影响现有的连接。  

对于 Connection 或关闭的 Recordset 该属性为读/写,而对打开的 Recordset 该属性为只读。  

由 Execute 方法返回的游标继承该设置。Recordset 将自动从与之关联的连接中继承该设置。  

远程数据服务用法 当用于客户端 (ADOR) Recordset 或 Connection 对像时,只能将 CursorLocation 属性设置为 adUseClient。  

注:

使用RecordCount属性可确定Recordset对像中记录的数目。ADO无法确定记录数时,或者如果提供者或游标类型不支持RecordCount,则该属性返回–1。读已关闭的Recordset上的RecordCount属性将产生错误。 
如果Recordset对像支持近似定位或书签(即Supports(adApproxPosition)或Supports(adBookmark)各自返回True),不管是否完全填充该值,该值将为Recordset中记录的精确数目。如果Recordset对像不支持近似定位,该属性可能由于必须对所有记录进行检索和计数以返回精确RecordCount值而严重消耗资源。 
Recordset对象的游标类型会影响是否能够确定记录的数目。对仅向前游标,RecordCount属性将返回-1,对静态或键集游标返回实际计数,对动态游标取决于数据源返回-1或实际计数。



using MESHelper.Models; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using MESHelper.IBusiness; using Tools.DB; using AMES.NormalTool; using Models; using SqlSugar; using DevExpress.Utils.About; using DevComponents.DotNetBar.Controls; namespace AMES.HandInput { public partial class GetOrderForm : Form { private GetOrderForm() { InitializeComponent(); } private static GetOrderForm _instance; //首页 public static int pageStart = 1; //当前页数 public int pageIndex = ((pageStart - 1) * pageSize); //每页显示的记录数 private static int pageSize = 10; //总记录数 private static int recordCount; //总页数 private static int pageCount = 0; public static GetOrderForm GetInstance() { if (_instance == null) { _instance = new GetOrderForm(); } return _instance; } private void GetOrder_button_Click(object sender, EventArgs e) { var allData = GetOrder.GetOrderMethod(); foreach (var item in allData.Data) { DbContext.P_WorkOrder_DB.Insert(new Models.P_WorkOrder { FactoryName = item.FactoryName, MfgLineName = item.MfgLineName, WorkOrderName = item.WorkOrderName, WorkOrderNo = item.ProductName, ProductionNo = item.ProductItemNo, ProductFamily = item.ProductFamily, PlanNumber = item.Qty, OrderName = item.OrderName, PlannedcompletionDate = item.PlannedcompletionDate, PlannedstartDate = item.PlannedstartDate, DoneNumber = "1", WorkOrderRuleID = 0, WorkOrderType = "N", WorkOrderStatus = 1, }); } DbContext.Db.Ado.ExecuteCommand("DELETE FROM P_WorkOrder WHERE ID NOT IN (SELECT MIN(ID) FROM P_WorkOrder GROUP BY WorkOrderName)"); MessageBox.Show("获取工单成功"); } private void Select_button_Click(object sender, EventArgs e) { DateTime yesterday = DateTime.Today.AddDays(-1); DateTime tomorrow = DateTime.Today.AddDays(1); recordCount = DbContext.Db.Ado.GetInt("SELECT COUNT(*) FROM P_WorkOrder"); //recordCount = 0; pageCount = (int)Math.Ceiling((double)recordCount / pageSize); dataGridView1.DataSource = DbContext.Db.Queryable<P_WorkOrder>().Select(x => new { x.FactoryName, x.MfgLineName, x.WorkOrderName, x.WorkOrderNo, x.ProductionNo, x.ProductFamily, x.PlanNumber, x.OrderName, x.PlannedcompletionDate, x.PlannedstartDate, x.DoneNumber, x.WorkOrderRuleID, x.WorkOrderType, x.WorkOrderStatus, }).OrderBy(x => x.PlannedstartDate, OrderByType.Desc).ToPageList(pageStart, pageSize, ref recordCount).ToList(); //设置表头 dataGridView1.Columns["FactoryName"].HeaderText = "工厂名称"; dataGridView1.Columns["MfgLineName"].HeaderText = "产线名称"; dataGridView1.Columns["WorkOrderName"].HeaderText = "工单名称"; dataGridView1.Columns["WorkOrderNo"].HeaderText = "产品型号"; dataGridView1.Columns["ProductionNo"].HeaderText = "产品料号"; dataGridView1.Columns["ProductFamily"].HeaderText = "产品系列"; dataGridView1.Columns["PlanNumber"].HeaderText = "计划产量"; dataGridView1.Columns["OrderName"].HeaderText = "订单"; dataGridView1.Columns["PlannedcompletionDate"].HeaderText = "计划结束时间"; dataGridView1.Columns["PlannedstartDate"].HeaderText = "计划开始时间"; dataGridView1.Columns["DoneNumber"].HeaderText = "实际产量"; dataGridView1.Columns["WorkOrderRuleID"].HeaderText = "工单规则编号"; dataGridView1.Columns["WorkOrderType"].HeaderText = "工单类型"; dataGridView1.Columns["WorkOrderStatus"].HeaderText = "工单状态"; //禁止自动选中第一行 dataGridView1.Rows[0].Selected = false; All_textBox.Text = recordCount.ToString(); PageAll_textBox.Text = pageCount.ToString(); Page_textBox.Text = (pageIndex + 1).ToString(); } private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { FactoryName_textBox.Text = dataGridView1.CurrentRow.Cells["FactoryName"].Value.ToString(); MfgLineName_textBox.Text = dataGridView1.CurrentRow.Cells["MfgLineName"].Value.ToString(); WorkOrderName_textBox.Text = dataGridView1.CurrentRow.Cells["WorkOrderName"].Value.ToString(); WorkOrderNo_textBox.Text = dataGridView1.CurrentRow.Cells["WorkOrderNo"].Value.ToString(); ProductionNo_textBox.Text = dataGridView1.CurrentRow.Cells["ProductionNo"].Value.ToString(); ProductFamily_textBox.Text = dataGridView1.CurrentRow.Cells["ProductFamily"].Value.ToString(); PlanNumber_textBox.Text = dataGridView1.CurrentRow.Cells["PlanNumber"].Value.ToString(); OrderName_textBox.Text = dataGridView1.CurrentRow.Cells["OrderName"].Value.ToString(); PlannedcompletionDate_textBox.Text = dataGridView1.CurrentRow.Cells["PlannedcompletionDate"].Value.ToString(); PlannedstartDate_textBox.Text = dataGridView1.CurrentRow.Cells["PlannedstartDate"].Value.ToString(); DoneNumber_textBox.Text = dataGridView1.CurrentRow.Cells["DoneNumber"].Value.ToString(); WorkOrderRuleID_textBox.Text = dataGridView1.CurrentRow.Cells["WorkOrderRuleID"].Value.ToString(); WorkOrderType_textBox.Text = dataGridView1.CurrentRow.Cells["WorkOrderType"].Value.ToString(); WorkOrderStatus_textBox.Text = dataGridView1.CurrentRow.Cells["WorkOrderStatus"].Value.ToString(); UseOrder_textBox.Text = dataGridView1.CurrentRow.Cells["WorkOrderName"].Value.ToString(); } private void SetOrder_button_Click(object sender, EventArgs e) { DbContext.Db.Ado.ExecuteCommand("UPDATE P_WorkOrder SET WorkOrderType = 'P' WHERE WorkOrderName = '" + WorkOrderName_textBox.Text.Trim() + "'"); Select_button_Click(sender, e); SetOrder_button.Enabled = false; UseOrder_textBox.Text = WorkOrderName_textBox.Text; MessageBox.Show("设置成功"); } private void Pre_button_Click(object sender, EventArgs e) { if (pageStart == 1) { Page_textBox.Text = pageStart.ToString(); } else if (pageStart > 1 || pageStart <= pageCount) { pageStart--; pageIndex = (pageStart - 1); Page_textBox.Text = pageStart.ToString(); Select_button_Click(sender, e); } } private void Next_button_Click(object sender, EventArgs e) { if (pageStart == pageCount) { Page_textBox.Text = pageStart.ToString(); } else if (pageStart >= 1 || pageStart <= pageCount) { pageStart++; pageIndex = pageStart - 1; Page_textBox.Text = pageStart.ToString(); Select_button_Click(sender, e); } } private void dgv_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dataGridView1.RowHeadersWidth - 4, e.RowBounds.Height); TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), dataGridView1.RowHeadersDefaultCellStyle.Font, rectangle, dataGridView1.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right); } private void GetOrderForm_FormClosing(object sender, FormClosingEventArgs e) { _instance = null; } private void UpdateOrder_button_Click(object sender, EventArgs e) { DbContext.Db.Ado.ExecuteCommand("UPDATE P_WorkOrder SET WorkOrderType = 'N' WHERE WorkOrderType = 'P'"); DbContext.Db.Ado.ExecuteCommand("UPDATE P_WorkOrder SET WorkOrderType = 'P' WHERE WorkOrderName = '" + WorkOrderName_textBox.Text.Trim() + "'"); Select_button_Click(sender, e); UseOrder_textBox.Text = WorkOrderName_textBox.Text; MessageBox.Show("切换成功"); } private void GetOrderForm_Load(object sender, EventArgs e) { var info = DbContext.P_WorkOrder_DB.GetList(x => x.WorkOrderType == "P").ToList(); foreach (var item in info) { FactoryName_textBox.Text = item.FactoryName; MfgLineName_textBox.Text = item.MfgLineName; WorkOrderName_textBox.Text = item.WorkOrderName; WorkOrderNo_textBox.Text = item.WorkOrderNo; ProductionNo_textBox.Text = item.ProductionNo; ProductFamily_textBox.Text = item.ProductFamily; PlanNumber_textBox.Text = item.PlanNumber; OrderName_textBox.Text = item.OrderName; PlannedcompletionDate_textBox.Text = item.PlannedcompletionDate; PlannedstartDate_textBox.Text = item.PlannedstartDate; DoneNumber_textBox.Text = item.DoneNumber; WorkOrderRuleID_textBox.Text = item.WorkOrderRuleID.ToString(); WorkOrderType_textBox.Text = item.WorkOrderType; WorkOrderStatus_textBox.Text = item.WorkOrderStatus.ToString(); UseOrder_textBox.Text = item.WorkOrderName; } } } }
最新发布
08-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值