我用C/S做了一个form,这个程序需要要每隔n分钟访问数据库是否有了新的数据,如果有了新的数据弹出MessageBox来告诉用户有了新的数据,这个东西怎么做啊?刚学c#的winform编程第二天,老板让做的,晕死我了,希望各位达人帮帮我现在我做到了form最小化到了任务栏,现在不会做上面说的东西,请各位高手帮帮吧~~~~

解决方案 »

  1.   

    我用Timer控件做了一个,但是一个项目经理说还需要什么线程、sleep等东西,我一直做B/S开发,这个东西实在不懂,如果能给我提供一个简单的实例更是感激不尽阿!
    不论timer控件还是什么其他的,只要能实现同时给个小例子最好了!
      

  2.   

    多线程,while循环,sleep控制间隔时间
      

  3.   

    正好想休息一下,替楼上的动动手using System.Threading;while(true)
    {
        //访问数据库
        ...
        ...    //操作数据库完成后程序休息5分钟
        Thread.Sleep(5*1000);
    }
      

  4.   

    四星级上将都来回答问题了,好兴奋阿呵呵
    miqier(米琪儿) 你好,我刚学c#下的winform编程第二天,你的程序我还是看不懂啊,
    能否讲的详细些呢?谢谢谢谢~~~~~
      

  5.   

    搞个timer控件来做就行了,我10秒内就取服务器时间一次,累死了,为了保持和服务器时间相同
      

  6.   

    我用timer做了个小程序,以下是主要的代码段,但是有个问题:
    比如数据库中有两条数据是符合条件的,第一次MessageBox弹出的窗口提示是正确的:找到2条数据;但是第二次弹出的时候就变成了“找到4条数据”,第三次弹出就成了“找到6条数据”,依次类推,这是为什么啊~~???private void timer1_Tick(object sender, System.EventArgs e)
    {
    SqlDataAdapter da=new SqlDataAdapter("select * from z_user where userpower=1",conn);
    da.Fill(ds,"ds1");
    if (ds.Tables["ds1"].Rows.Count==0)
    {
    MessageBox.Show("没有数据");
    }
    else
    {
    MessageBox.Show("找到"+ds.Tables["ds1"].Rows.Count+"条数据");
    }
    }
      

  7.   

    using System.Threading;while(true)
    {
       SqlDataAdapter da=new SqlDataAdapter("select * from z_user where userpower=1",conn);
    da.Fill(ds,"ds1");
    if (ds.Tables["ds1"].Rows.Count==0)
    {
    MessageBox.Show("没有数据");
    }
    else
    {
    MessageBox.Show("找到"+ds.Tables["ds1"].Rows.Count+"条数据");
    }    //操作数据库完成后程序休息5分钟
        Thread.Sleep(5*1000);
    }
      

  8.   

    to 豆豆:还是不对,出来的提示和我用timer出来的提示一样,都是递增的
      

  9.   

    你们经理是不是sb?
    一个Timer就行了,如果访问数据库量大要执行很久再用thread
    没事整那么复杂干什么
      

  10.   

    你在调用多线程的方法中定义个int rowCount来记录上次访问数据库时有多少行,然后现在查出有多少行相减,0则没有新数据,>0则显示相减的结果,但是你要考虑如果对表进行删除了出现<0的情况
      

  11.   

    to 当你手淫你会想起谁:我们经理精通一套二次开发的软件,很NB,不NB人家当不了经理。让用线程做,就是想让客户觉得东西NB;to 豆豆:你是高手阿,写的东西偶都看不懂~~~~开发B/S好好的突然给了我一个这个任务,晕死我了~~~~谢谢大家,我再调试一下,一会儿结贴给分 ^_^
      

  12.   

    关键是fill的问题...你每次填充的都是ds1这个TABLE...
    da.Fill(ds,"ds1");而且填充完后又没有把ds清空...最好是这样吧...using System.Threading;while(true)
    {
       SqlDataAdapter da=new SqlDataAdapter("select * from z_user where userpower=1",conn);
    da.Fill(ds,"ds1");
    if (ds.Tables["ds1"].Rows.Count==0)
    {
    MessageBox.Show("没有数据");
    }
    else
    {
    MessageBox.Show("找到"+ds.Tables["ds1"].Rows.Count+"条数据");
    }    //操作数据库完成后程序休息5分钟
        Thread.Sleep(5*1000);
        ds.Clear();
    }而且,如果做winform,最好是做一个独立的线程来运行你的代码,以免窗体无响应...
      

  13.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    using System.Threading;namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                Thread dosql = new Thread(new ThreadStart(doDataBase));
                dosql.IsBackground = true;
                dosql.Start();
            }
            private void doDataBase()
            {
                string connstr = "";
                SqlConnection conn = new SqlConnection(connstr);
                DataSet ds = new DataSet();
                while (true)
                {
                    SqlDataAdapter da = new SqlDataAdapter("select * from z_user where userpower=1", conn);
                    da.Fill(ds, "ds1");
                    if (ds.Tables["ds1"].Rows.Count == 0)
                    {
                        MessageBox.Show("没有数据");
                    }
                    else
                    {
                        MessageBox.Show("找到" + ds.Tables["ds1"].Rows.Count + "条数据");
                    }                //操作数据库完成后程序休息5分钟
                    Thread.Sleep(5 * 1000);
                    ds.Clear();            }
            }
        }
    }
      

  14.   

    我真晕啊,这方法你都能想出来的阿, select * from你用SELECT COUNT(*) 直接找到你需要的条数不就玩了吗?你内存很大是吧?
    int cnt = (int)cmd.ExecuteScalar();
    你觉得这个是不是能满足一下?
      

  15.   

    还有那个线程的问题,其实timer就是包装好的一个线程,只不过效率上可能稍微逊色一点,如果你程序不大,用这个timer已经完全够了,你们项目经理那个白吃。如果线程处理要求高一点,再自己写线程也不晚,线程我就不说了,上边都说了,虽然我没怎么看,但是我觉得还是值得相信的
      

  16.   

    Thread.Sleep();.NET真方便啊~~~学习中
      

  17.   

    Timer本身就是线程.个人觉得,楼主的经理是想让你那个提示的框框用另一个线程提示.
      

  18.   

    用Timer就可以了,还用什么卵自己写线程,简直是脱裤子放屁。Timer本来也是多线程的。
      

  19.   

    ...messagebox还用多线程处理?有点太无聊了吧?
      

  20.   

    我们经理精通一套二次开发的软件,很NB,不NB人家当不了经理。让用线程做,就是想让客户觉得东西NB;
    -----------------------------------
    你现在对.Net了解不深可能会觉得他很NB,等你到了一定水平后可能就不那么认为了让客户认为NB,这个我是最无奈了,艾.客户懂什么叫线程么...
      

  21.   

    用Timer就可以了,还用什么卵自己写线程,简直是脱裤子放屁。Timer本来也是多线程的。-----------------
    同意一个
      

  22.   

    收到,Mark。回头仔细看下~
      

  23.   

    下面是我的主要处理代码:
    private void timer1_Tick(object sender, System.EventArgs e)
    {
    string sql="select count(id) from z_user where userpower=1";
    SqlCommand cmd=new SqlCommand(sql,conn);
    cmd.Connection.Close();//打开数据连结前先关掉连结,否则运行程序时老是提示“数据库联接已经打开”,这个是我想的歪点子,不知道是否好
    cmd.Connection.Open();
    int cnt = (int)cmd.ExecuteScalar();
    if (cnt==0)
    {
    MessageBox.Show("没有数据");
    }
    else
    {
    MessageBox.Show(cnt.ToString());
    }
    }