private DataSet ds = new DataSet();
private DataTable dt;
private void Form1_Load(object sender, System.EventArgs e)
{
 client.Connect("127.0.0.1",1008);
 DataColumn dc = new DataColumn("long",typeof(double));
 dt.Columns.Add(dc);
 dc = new DataColumn("lati",typeof(double));
 dt.Columns.Add(dc);
 client.ReceivedDatagram+=new NetEvent(client_ReceivedDatagram);
 Thread thread=new Thread(new ThreadStart(SaveDB));
}
private void client_ReceivedDatagram(object send,TcpAsynTrans.NetEventArgs e)
{
 if(m_Flag)
 {
  double longitude,latitude;                
  string data = e.Client.Datagram;
  int sp = data.IndexOf(",");
  int sp2 = data.IndexOf(",",sp+1);
  
  if(sp>0)
  {
   longitude = Convert.ToDouble(e.Client.Datagram.Substring(0,sp));
   latitude = Convert.ToDouble(e.Client.Datagram.Substring(sp+1,sp2-sp-1));
   DataRow dr = dt.NewRow();
   dr["long"] = longitude;
   dr["lati"] = latitude;
   dt.Rows.Add(dr);
  }
}
private void SaveDB()
{
 while(true)
 {
  string strConn = "Provider=OraOLEDB.Oracle;Data Source=source;User Id=id;Password=adsf"; 
  OleDbConnection conn = null;
  OleDbDataAdapter adapter = null;
  OleDbCommandBuilder commBuilder = null;
  string strSql = "select * from table";
  try 
  {
   // 创建数据库连接
   conn = new OleDbConnection(strConn);
   // 创建DataAdapter和CommandBuilder
   adapter = new OleDbDataAdapter(strSql, conn);
   commBuilder = new OleDbCommandBuilder(adapter);
   adapter.InsertCommand = commBuilder.GetInsertCommand();
   adapter.DeleteCommand = commBuilder.GetDeleteCommand();
   adapter.UpdateCommand = commBuilder.GetUpdateCommand();
   conn.Open();
   // 更新数据库
   adapter.Update(ds);
   // 更新完毕
   ds.AcceptChanges();
   conn.Close();
   }
   Thread.Sleep(600000);
   }
 }服务器每秒钟罚一次数据,接受后存入dataset,每10分钟一次存入oracle数据库。
大家帮忙看一下,错误出在哪了???

解决方案 »

  1.   

    由于“ORACLE_XYTZ1”表的数据量非常大,所以不能把“ORACLE_XYTZ1”中的数据fill到ds中再更改写回。帮忙 代码应改如何写。
      

  2.   

    to:由于“ORACLE_XYTZ1”表的数据量非常大,所以不能把“ORACLE_XYTZ1”中的数据fill到ds中再更改写回。这个表更新应该没问题的,用如下语句:
     adapter.Update(ds.GetChanges());
      

  3.   

    To: panjf(Troj)数据已经写入了dataset,但是不能向数据库更新,
    帮忙写下代码, 是哪里出问题了?
      

  4.   

    Update这个方法只会更新Row.RowState=Insert和Update的,你查看一下你的行状态。
      

  5.   

    RowState 为 Added 。
    为什么更新不了数据库,是哪里有错误?
      

  6.   

    dataset 每秒钟都有新数据放入dataset ,应该都是added状态,
    这种情况应该如何 用dataset更新数据库???
      

  7.   

    try
    http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
      

  8.   

    DataTable的名称、Column的名称要和数据库里的表完全对应才行。
      

  9.   

    DataTable 的名字和数据库中表的名字完全对应,
    DataTable中列名和数据库中表的列名也是完全对应。插入数据库的语句如下:
    string strConn = "……";
    OleDbConnection conn = new OleDbConnection(strConn);
    OleDbDataAdapter da = new OleDbDataAdapter("select * from ORACLE_XYTZ1",conn);
    conn.open();
    OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
    a.InsertCommand = cb.GetInsertCommand();
    da.Update(ds,"ORACLE_XYTZ1");
    ds.GetChanges();
    conn.close();但还是报错:
    “对于不返回任何基表信息的SelectCommand不支持动态SQL生成”可是数据库表里已经设置主键了。问题在哪里?
    请指点
      

  10.   

    不是主键的问题,
    a.InsertCommand = cb.GetInsertCommand();
    da.Update(ds,"ORACLE_XYTZ1");
    ds.GetChanges();
    conn.close();
    这几句应这样写:
    a.InsertCommand = cb.GetInsertCommand();
    da.Update(ds.GetChanges(),"ORACLE_XYTZ1");
    conn.close();你跟一下看看ds.GetChanges()的返回值里ORACLE_XYTZ1表里有没有记录。
      

  11.   

    a.InsertCommand = cb.GetInsertCommand();
    da.Update(ds.GetChanges(),"ORACLE_XYTZ1");
    conn.close();我改成这样了,可还是同样报错“对于不返回任何基表信息的SelectCommand不支持动态SQL生成”,在调试的时候就报错。
    panjf(Troj)大哥在帮忙指导一下吧,我给你发了个短信
      

  12.   

    adapter = new OleDbDataAdapter(strSql, conn);
       commBuilder = new OleDbCommandBuilder(adapter);
       adapter.InsertCommand = commBuilder.GetInsertCommand();
       adapter.DeleteCommand = commBuilder.GetDeleteCommand();
       adapter.UpdateCommand = commBuilder.GetUpdateCommand();这个写法没什么错误。
    你可以把adapter做成全局的试试?
    你的ORACLE_XYTZ1真是个表吗?还是视图?
      

  13.   

    conn.Open();要在adapter.InsertCommand = commBuilder.GetInsertCommand();之前。
    也有可能你连接数据库的用户名根本没有修改ORACLE_XYTZ1的权限。
      

  14.   

    ORACLE_XYTZ1是个表,
    创建的语句:
    DROP TABLE ORACLE_XYTZ1;
    CREATE TABLE FFXYTJ.ORACLE_XYTZ1
    (LONGITUDE NUMBER(15, 13) NOT NULL, 
    LATITUDE NUMBER(15, 12), 
    CONSTRAINT ORACLE_XYTZ1P_1_1 PRIMARY KEY(LONGITUDE) 还是找不出问题出在哪里???
      

  15.   

    用户是有权限的,可以创建表手动添加数据。现在的报错是
    “对于不返回任何基表信息的SelectCommand不支持动态SQL生成”多谢eterblue(云流)指点
      

  16.   

    手动设一下DataTable的PrimaryKey属性试试