用ADO控件,
表dx,无主键,结构为:
类别  th     内容
语文  1   a  
数学  2      b
语文  3      c
英文  4      d
语文  5      e
数学  6      f我先对“类别”字段排序,生成临时表,再删除原表,将临时表复制成原表,类别  th     内容
语文  1   a  
语文  3      c
语文  5      e
数学  2      b
数学  6      f
英文  4      d结果“th”(题号)的顺序就乱了,想重新排序Adodc1.RecordSource = "dx"
Adodc1.Refresh
i = 1
Do While Not Adodc1.Recordset.EOF
Adodc1.Recordset.Fields("th") = i
Adodc1.Recordset.Update
i = i + 1
Adodc1.Refresh
Adodc1.Recordset.MoveNext
Loop
Adodc1.Refresh我如果用调试-->程序运行到,将光标点到 .update,那行,然后按f8,直到循环结束(能不能有别的方法,比如我点到最后一行,按某一个键一次,就可以执行到最后一行,而不是按F8,一次一个语句的走?),则可以将“th”重新排序。但将这段程序放入FORM_LOAD中则数据库无变化,请问:有什么办法可以解决?原因是什么?是否是主键的问题?

解决方案 »

  1.   

    补充一下,我只需要得到如下结果
    类别  th     内容
    语文  1   a  
    语文  2      c
    语文  3      e
    数学  4      b
    数学  5      f
    英文  6      d
      

  2.   

    重新order by th [ASC]
      

  3.   

    Dim acn As New ADODB.Connection, Sql$
    acn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=tk.mdb;Persist Security Info=False;Jet OLEDB:Database Password=''"
    acn.Open
    For j = 1 To 5
    Sql = "drop table ls"
    acn.Execute Sql
    Sql = "select * into ls from  dx order by 类别(th)"<<----是这个重新排序吗?
    acn.Execute Sql
    Sql = "drop table dx"
    acn.Execute Sql
    Sql = "select * into dx from  ls order by 类别(th)"<<----是这个重新排序吗?
    acn.Execute Sql
    next我是先用上面这段代码对类别排序,删除原表,将临时表复制成原表,然后再对th排序,删除原表,将临时表复制成原表,但都不行啊,出现的情况和我上面列出来的是一模一样的!谁有更好的办法啊?
    这样做也不行啊
      

  4.   

    应该是这样:
    Dim acn As New ADODB.Connection, Sql$
    acn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=tk.mdb;Persist Security Info=False;Jet OLEDB:Database Password=''"
    acn.OpenSql = "drop table ls"
    acn.Execute Sql
    Sql = "select * into ls from  dx order by 类别(th)"<<----是这个重新排序吗?
    acn.Execute Sql
    Sql = "drop table dx"
    acn.Execute Sql
    Sql = "select * into dx from  ls order by 类别(th)"<<----是这个重新排序吗?
    acn.Execute Sql我是先用上面这段代码对类别排序,删除原表,将临时表复制成原表,然后再对th排序,删除原表,将临时表复制成原表,但都不行啊,出现的情况和我上面列出来的是一模一样的!谁有更好的办法啊?
    这样做也不行啊
      

  5.   

    表中的次序无关紧要,用相关的SQL语句就可以达到你的查询要求:
    Adodc1.RecordSource = "select * from dx order by th"
      

  6.   

    表中的次序无关紧要,用相关的SQL语句就可以达到你的查询要求:
    Adodc1.RecordSource = "select * from dx order by th"哪有豆腐,给块给我撞死算啦!!!
    5555555555555,要是能这么用,我还排序做什么啊?
    苍天,,,,,
    我就是要重新做一个有序的新表,还有别的用途的啊!!!!
      

  7.   

    对数据库的操作都是通过SQL语句
    表中数据的排列有其一定规则,如果程序中的操作要取决于表中数据的排列,你觉得科学吗?
    好好看看相关基础书吧
      

  8.   

    vbman2003(家人)回答得没有错,表中的数据是没有顺序的,无论做什么用都可以通过SQL语句做源,你可以讲讲你要干什么用,大家再告诉你方法
      

  9.   

    上面那段程序没有什么错
    Sql = "drop table ls"
    acn.Execute Sql
    Sql = "select * into ls from  dx order by 类别(th)"<<-生成已经排好序的临时表,
    acn.Execute Sql
    'Z注意在这里你可以用ACCESS打开数据库看一下是否已经排好了
    Sql = "drop table dx"
    acn.Execute Sql
    Sql = "select * into dx from  ls order by 类别(th)"<<----这是重新建立表
    acn.Execute Sql
    '实际上,排好序的recordset是直接可以用的,你就不需要一个物理的排序表了
      

  10.   

    如果你的表一定要按你的方式排序,一个可行的方法就是设置主键。
    最简单的方法就是将 th 字段作为主键,当然前提是数据不能重复。
    否则,你可以用:select * into new_tb from tb where 1=2 创建一个空白的同结构新表,然后添加一个自动编号字段作为你的主键。你用insert into new_tb select * from tb order by th 语句按th排序插入,应该就可以了
    不知你的具体情况,以上两点仅供参考
      

  11.   

    上面那段程序没有什么错
    Sql = "drop table ls"
    acn.Execute Sql
    Sql = "select * into ls from  dx order by 类别(th)"<<-生成已经排好序的临时表,
    acn.Execute Sql
    'Z注意在这里你可以用ACCESS打开数据库看一下是否已经排好了
    Sql = "drop table dx"
    acn.Execute Sql
    Sql = "select * into dx from  ls order by 类别(th)"<<----这是重新建立表
    acn.Execute Sql
    '实际上,排好序的recordset是直接可以用的,你就不需要一个物理的排序表了从开始我就说了,[如果用 调试-->程序运行到,将光标点到 .update,那行,然后按f8,直到循环结束(能不能有别的方法,比如我点到最后一行,按某一个键一次,就可以执行到最后一行,而不是按F8,一次一个语句的走?),则可以将“th”重新排序。]就是可以排序的,我打开ACCEss数据库,就是可以看到TH在重新排序,反正,我用调试状态,数据就可以成功排序;放到FORM_LOAD里面,直接不用手工干涉,就得不到我要的结果,仍然还是原来的数据库状态!
    另外,关于增加字段的问题,我以前做个一个表,对它进行连续删除、增加字段好像到某个上限是无法做增加字段的操作的!
    所以,我想以我的思路做,就差这一点更新结构的区别了,看看各位大侠还有什么高招!会不会有个什么暂停啊之类的工具来延缓一下就可以了??
      

  12.   

    表中的数据顺序的确是存在的,我前面说过其有一定的规则,因为本人几乎从来就没关心过这个问题,所以不是很清楚,但相信绝不是按添加记录的顺序排列的,你的实践就是最好的证明。一般情况下,ACCESS创建了一个主键就会为这个主键创建一个索引。索引不是用来排序的,索引好比一本书的目录,可以提高搜索数据的效率。没有研究过表中数据的排列,给你参考的只是经验之谈,你也可以试试其它方法,比如,给th 创建一个索引:CREATE INDEX iKey ON tb(th)
      

  13.   

    因为它已经有了一个顺序了,在这个顺序之上,无论是UPDATE还是其他的都不会重排,因为本身已经有序了。你的操作都是在一个集合上作的,集合的写入顺序呢?任何索引,如果你不用它呢?
    还不如告诉我们你在哪里调用它,看看那里怎么解决吧,并且你在ACCESS直接用SQL做实验,你会发现楼上的句子肯定可以得到你要的结果
      

  14.   

    adodc1.comandtype=2   'text
    adodc1.recordsouce="select * from dx order by th"
    i = 1
    Do While Not Adodc1.Recordset.EOF
    Adodc1.Recordset.Fields("th") = i
    Adodc1.Recordset.Update
    i = i + 1
    Adodc1.Recordset.MoveNext
    Loop
    Adodc1.Refresh
      

  15.   

    我想很多人都要疯了,你这不是排序,是重新写入编号。
     CPLiu(老了) 的="select * from dx order by th"应该是order by 类别
    其他都对
      

  16.   

    我要疯掉了,CPLiu(老了)+ lightwu的做法,也可以得到我想要的答案,问题是,我如果用调试-->程序运行到,将光标点到 .update,那行,然后按f8,直到循环结束,则可以将“th”重新排序。但将这段程序放入FORM_LOAD中则数据库无变化。这又给绕到我的问题上去了!!
    lightwu,我就是要重写编号,并按编号重新排序
      

  17.   

    这简单,先重新写编号,然后运行上面兄弟的排序,就得到你要的了。adodc1.comandtype=2   'text
    adodc1.recordsouce="select * from dx order by th"
    i = 1
    Do While Not Adodc1.Recordset.EOF
    Adodc1.Recordset.Fields("th") = i
    Adodc1.Recordset.Update
    i = i + 1
    Adodc1.Recordset.MoveNext
    Loop
    Adodc1.RefreshDim acn As New ADODB.Connection, Sql$
    acn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=tk.mdb;Persist Security Info=False;Jet OLEDB:Database Password=''"
    acn.OpenSql = "drop table ls"
    acn.Execute Sql
    Sql = "select * into ls from  dx order by 类别(th)"<<----是这个重新排序吗?
    acn.Execute Sql
    Sql = "drop table dx"
    acn.Execute Sql
    Sql = "select * into dx from  ls order by 类别(th)"<<----是这个重新排序吗?
    acn.Execute Sql
      

  18.   

    5555555,终于搞定了,lightwu,能够告诉我原因是什么回事?lightwu查这个主题:想做一个考题系统,给个思路!!,送分给你 谢谢帮助我的每一位好同志!!
      

  19.   

    你对sql太不了解,先分类排序,然后改号,但是要知道顺序还是没有改变的,只不过是一个(视图),然后将查询结果写到一个新表中,这时候顺序就对了
      

  20.   

    Dim ls$
    Adodc1.CommandType = 1 
    ls = "select * from dx order by 类别"
    Adodc1.RecordSource = ls
    Adodc1.Refresh
    i = 1
    Do While Not Adodc1.Recordset.EOF
    Adodc1.Recordset.Fields("th") = i
    Adodc1.Recordset.Update
    i = i + 1
    Adodc1.Recordset.MoveNext
    Loop
    Adodc1.RefreshDim acn As New ADODB.Connection, Sql$
    acn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data_Source=tk.mdb;Persist Security Info=False;Jet OLEDB:Database Password="";"
    acn.OpenSql = "drop table ls"
    acn.Execute Sql
    Sql = "select * into ls from  dx order by th" 
    acn.Execute Sql
    Sql = "drop table dx"
    acn.Execute Sql
    Sql = "select * into dx from  ls order by th" 
    acn.Execute Sql好了,这就是解决的代码.
    结帖。