问题:rda.submit() 和 rad.push() 的区别和各个的运行机制

pepsl6686022 2012-08-04 12:18:33
程序的描述:

运行环境:SQLCE3.5 + .net Framework3.5
运行系统:Windows Mobile 5.0
运行载体: Pocket PC 2003
程序功能: 数据提交
问题: 在程序中我用submitsql 方法提交数据的时候 向远程数据库更新的时间是正确的,可是我在改成用push()的方法在提交一次就会更改
例如: 当前在PDA中 用Datetime.Now 获取到的当前时间是 "2012-08-03 21:59:00" 把这个时间更新到JX_OPER_FWBILL的OPER_TIME字段
此时,经过测试本地SQLCE数据库中的数据更新正确,然后用submitsql()方法向远程数据库提交数据,经测试,远程数据库改字段数据更新正确
可是,在改用push()方法向远程数据库提交数据,发现JX_OPER_FWBILL的OPER_TIME字段的数据变为"2002-12-08 21:59:00" 这个值到底是从哪里来的
一直没找到。
个人分析: 我们知道rda.submitsql(string sqlstr,string rdaOleDbConnectString)方法 这个方法实际是把参数1 sqlstr 的sql语句提交到
远程数据库中进行更新数据,个人认为的大致运行机制是把整个sql语句作为字符串传给远程数据库,并在远程数据库中运行该语句。
而rda.push(string tablename,string rdaOleDbConnectString,RdaBatchOption.BatchingOn)方法, 这个方法其实是把参数1 表名在本地
SQLCE数据库检索到该表,然后把该表的表结构,连同数据一起提交到远程数据库中,但是具体在远程数据库中如何执行并不是很清楚,也就是说对
push()方法的的运行机制不是很清楚。 求高手帮忙解决。

//SQL字符串
private string sqlstr = "";
private void button5_Click(object sender, EventArgs e)
{
//获取作业的ID
strId = button9.Tag.ToString();
if (strId != null && strId != "")
{
//根据作业ID查询是否存在已经有开始的作业
DataSet ds6 = new DataSet();
ds6 = DB.SQLCE.DBDatasSet(conn, "select OPER_TIME,OPER_ENDTIME from JX_OPER_FWBILL where sortid='" + strId + "'");
if (ds6.Tables[0].Rows[0][0].ToString() != "" && ds6.Tables[0].Rows[0][0].ToString() != null)
{
MessageBox.Show("该活项已开始作业或作业结束");
}
else
{
sqlstr = "update JX_OPER_FWBILL set SELECTED='1',OPER_NAME='" + DB.SQLCE.getRealName(conn, Oper.userid) + "(" + Oper.userid + ")" + "', OPER_TIME='" + DateTime.Now + "',WORKGROUP='" + strBanzu + "' where SORTID='" + strId + "'"
//没有开始的作业就更新作业表的开始时间和作业人姓名工号,所在班组,将数据更新到本地SQLCE数据库
DB.SQLCE.DBExecute(conn, sqlstr);
//启用线程提交更新过的SQLCE数据
ThreadMethod();

//从本地SQLCE获取数据,获取没有开始的作业步骤数
ds2 = DB.SQLCE.DBDatasSet(conn, "select count(*) from JX_OPER_FWBILL where LOCNO='" + strFwJch + "' and LOCTYPE='" + strFwJclx + "' and OPER_TIME is null");
//从本地SQLCE获取数据,获取没有开始的作业活项数
DataSet ds4 = new DataSet();
ds4 = DB.SQLCE.DBDatasSet(conn, "select count(*) from JX_OPER_JTBILL where LOCNO='" + strFwJch + "' and LOCTYPE='" + strFwJclx + "' and OPER_TIME is null");
//通过对作业步骤数和活项数的判断更新 机车的当前状态 更新的是本地SQLCE数据库
int i = Convert.ToInt32(ds2.Tables[0].Rows[0][0].ToString());
int j = Convert.ToInt32(ds4.Tables[0].Rows[0][0].ToString());
if (i == 0 && j == 0)
{
DB.SQLCE.DBExecute(conn, "update JX_SHOW_LOCSTATUS set LOCSTATUS='正在作业' where LOCNO='" + strFwJch + "' and LOCTYPE='" + strFwJclx + "'");
}
MessageBox.Show("活项作业开始!", "信息提示");
//查询出作业的开始时间和结束时间 之前更新过的开始时间
ds4 = DB.SQLCE.DBDatasSet(conn, "select OPER_TIME,OPER_ENDTIME from JX_OPER_FWBILL where sortid='" + strId + "'");
if (ds4.Tables[0].Rows.Count > 0)
{
//显示开始时间到Label中
label10.Text = ds4.Tables[0].Rows[0][0].ToString().Substring(5, 9);
}
//清空作业ID
strId = null;
//记录开始作业的数量
begin++;
}
}
}
private void ThreadMethod()
{
ThreadStart tstart = new ThreadStart(method);
Thread thread = new Thread(tstart);

//开启线程
thread.Start();
//线程等待
thread.Join();
}
private void method()
{
try
{
//用rda.submitsql()方法提交数据
DB.SQLCE.Submit_TB(sqlstr, DB.SQLCE.CreatRDA(COMMON.Sys.g_InternetUrl, COMMON.Sys.g_DBconn), COMMON.Sys.g_rdaOleDbConnectString);
//用rda.Push_TB()方法提交数据
//DB.SQLCE.Push_TB("JX_OPER_FWBILL",DB.SQLCE.CreatRDA(COMMON.Sys.g_InternetUrl, COMMON.Sys.g_DBconn), COMMON.Sys.g_rdaOleDbConnectString);
}
catch(Exception ex)
{
//线程终止
thread.Abort();
}

}
//共有类DB.SQLCE中的submit方法
public static void Submit_TB(string s, Rda r, string rdc)
{
try
{
//向远程提交SQL语句
r.SubmitSql(s, rdc);

}
catch (Exp e)
{
MessageBox.Show(e.Message + "-----发生在" + e.Source);

}
}
//共有类中DB.SQLCE中的push方法
public static Boolean Push_TB(string tb_name, Rda rda, string rdaOleDbConnectString)
{
Boolean flag = false;
try
{
//推入表
rda.Push(tb_name, rdaOleDbConnectString, RdaBatchOption.BatchingOn);//推入数据方式为一次性批量推入
flag = true;
}
catch (Exp e)
{
flag = false;
MessageBox.Show(e.Message + "-----发生在" + e.Source);
}
return flag;
}
...全文
190 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
pepsl6686022 2012-08-12
  • 打赏
  • 举报
回复
问题已经解决了,submitsql方法应该是直接将sql语句提交给远程sqlserver数据库执行,但是sql语句是只限于没有返回值的语句,也就是insert,update,delete。而select 带有返回值的则会出错。
push()方法有点让人郁闷,它是指定表的跟踪到得更改信息,按照批量或者单一的方式提交给数据库执行。但有点让人想不到的是 sqlce数据库不支持 索引的自动增长 而是在pull到的表中有新数据添加则从新按照1的顺序从新排列,如果在pull表的时候加入跟踪,拉入表的主键以及索引之后,在想sqlserver数据库push的时候就会把新序号的数据提交给sqlserver。这样再次pull这个表向这个表中添加数据 就会有主键冲突。
软件概述 UG(Unigraphics NX)是一款由西门子(Siemens PLM Software)开发的交互式CAD/CAM/CAE系统。作为全球领先的产品工程解决方案,它集成了产品设计、工程仿真与制造加工于一体。其功能强大且应用广泛,能够轻松实现各种复杂实体和造型的构造,为模具、汽车、航空航天及通用机械等行业提供了高性能的机械设计与制图灵活性。 软件基础信息 • 支持系统: 64位 Windows 10、Windows 11 核心功能模块 一、创新设计:高效、灵活、无缝协同 全链路产品设计 涵盖从2D布局、3D建模、装配设计到图纸文档记录的各个环节,大幅提升设计吞吐量,缩短交付周期超35%。 强大的同步建模技术 打破数据壁垒,可无缝导入并直接修改来自其他CAD系统的几何模型,是跨平台协同设计的理想选择。 复杂装配管理 专为大型复杂产品打造,即使面对成千上万的零件也能从容应对,快速识别并解决数字样机中的干涉等问题。 集成设计验证 内置自动验证功能,实时监控设计是否符合公司及行业标准;结合PLM数据可视化合成,辅助工程师做出更明智的决策。 二、综合仿真(Simcenter 3D):精准预测,降低试错成本 极速前后处理 依托先进的几何引擎,将强大的分析命令与几何编辑紧密集成,相比传统有限元工具,可缩短高达70%的仿真建模时间。 全方位结构分析 在同一环境中集成线性静力学、动态、疲劳及非线性分析,底层由业界顶尖的NX Nastran解算器提供支持,确保计算的高精度与可靠性。 声学与热管理分析 提供内外声学仿真以优化音质、降低噪音;具备一流的热传导仿真能力,帮助电子产品和工业机械实现最佳热管理方案。 多物理场耦合 简化了结构动力学、热传导、流体流动等复杂物理现象的模拟过程,消除外部数据传输错误,真实还原产品运行工况。 三、智能制造(CAM):打通从计划到车间的数字主线 全面的制造解决方案 提供从工装设计、CAM编程到机床控制器(如Sinumerik)的一体化支持,助力制定更科学的生产决策。 深度集成的PLM环境 借助Teamcenter实现数据和流程的统一管理,避免多数据库冲突,支持重用验证过的加工工艺与刀具库。 车间级互联 通过DNC系统与车间无缝对接,直接将加工数据和刀具清单下发至CNC机床,实现计划与生产的紧密结合。 提质增效 优化NC编程与刀具路径,提升表面精加工水平与零件精度;减少人为错误,显著提高新机床部署成功率及制造资源利用率。 总结 UG NX 2023作为一款集成化的产品工程解决方案,通过其强大的设计、仿真和制造功能,为现代制造业提供了完整的数字化产品开发平台。无论是复杂产品的设计验证,还是精密制造的流程优化,UG NX 2023都能为工程师团队提供高效、可靠的解决方案,助力企业提升产品创新能力和市场竞争力。 适用领域 模具设计、汽车制造、航空航天、通用机械、消费电子等

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧