问题: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;
}
...全文
132 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
pepsl6686022 2012-08-12
  • 打赏
  • 举报
回复
问题已经解决了,submitsql方法应该是直接将sql语句提交给远程sqlserver数据库执行,但是sql语句是只限于没有返回值的语句,也就是insert,update,delete。而select 带有返回值的则会出错。
push()方法有点让人郁闷,它是指定表的跟踪到得更改信息,按照批量或者单一的方式提交给数据库执行。但有点让人想不到的是 sqlce数据库不支持 索引的自动增长 而是在pull到的表中有新数据添加则从新按照1的顺序从新排列,如果在pull表的时候加入跟踪,拉入表的主键以及索引之后,在想sqlserver数据库push的时候就会把新序号的数据提交给sqlserver。这样再次pull这个表向这个表中添加数据 就会有主键冲突。

110,534

社区成员

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

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

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