C# winform中如何从数据库取数据绘制实时曲线图

kudincha 2011-09-05 03:58:07
如题,一般画实时曲线图,都是将数据放在Point[] ptlist数组中,我的数据是每隔1S存放在sql server中,用什么方法可以将数据库中的数据实时取出,然后作为实时显示曲线的数据呢?曲线的横坐标是时间,纵坐标就是数据库中的数值
...全文
1954 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
luqinfeng 2013-01-28
  • 打赏
  • 举报
回复
说到底还是定时刷新
zhu071011 2012-03-29
  • 打赏
  • 举报
回复
10L,请问你代码中的Exc();是什么?
灰阶 2011-09-06
  • 打赏
  • 举报
回复
建议把1s调大点吧
要不然数据库的高并发数会搞垮你的
sjfbtnmcn 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hen_ai_hen_ai_ni 的回复:]
实时去搞数据库?这是个令人崩溃的问题,尤其是1s……最好将这个实时需要读取的放到另外一个和应用分离的存储器中,然后读取完后将之删除(我也崩溃,如果不需要读以前数据的情况下啊),尽量的和你的应用分开,另外对这种实时性很高的要求,除非是桌面系统自己用,否则在web上,一般数据库也支持不了这么高的实时性,目前有实时数据库支持这样的操作,比如pi数据库(好像是,反正叫pi派)。我的想法是能否通过MQ的方式……
[/Quote]
同感啊,我也觉得这样实时读取数据库是不可思议的事情啊,数据库每秒钟都在变动么?受得了么?有点崩溃啊。
jhdxhj 2011-09-06
  • 打赏
  • 举报
回复
1s取一次数据,然后画在图板上。
就这样,再把画板上面的数据往左移就OK了!
小哥哥 2011-09-06
  • 打赏
  • 举报
回复
1s取一次数据,然后画在图板上。
就这样,再把画板上面的数据往左移就OK了!
xiongxyt2 2011-09-06
  • 打赏
  • 举报
回复

/// <summary>
/// 动起来
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
zedGraphControl1.GraphPane.XAxis.Scale.MaxAuto = true;

double x = (double)new XDate(DateTime.Now);

double y = ran.NextDouble();

list.Add(x, y);//改成你数据库的数据就可以了
list.RemoveAt(0);

this.zedGraphControl1.AxisChange();

this.zedGraphControl1.Refresh();

}
xiongxyt2 2011-09-06
  • 打赏
  • 举报
回复
引用ZedGraph.dll
using ZedGraph;

GraphPane myPan = new GraphPane();
PointPairList list = new PointPairList();
Random ran = new Random();
LineItem myCurve;


DataSet ds = new DataSet();
SqlConnection myConnection = null;
SqlCommand myCommand = null;
SqlDataAdapter adapt = null;
SqlDataReader reader = null;
public Form1()
{
InitializeComponent();
}


public string GetConnectString(string server, string database, string username, string password)
{
return "Server=" + server + ";Database=" + database + ";UID=" + username + ";PWD=" + password;
}

public void Exc()
{
double x, y;
myConnection = new SqlConnection();
myConnection.ConnectionString = GetConnectString("192.168.0.101", "AMR", "sa", "123");
myCommand = new SqlCommand("select MSID,UpdateTime from Tab_BS_Dailyfile", myConnection);
myCommand.CommandType = CommandType.Text;
myConnection.Open();

adapt = new SqlDataAdapter();

try
{
//myCommand.ExecuteNonQuery();

reader = myCommand.ExecuteReader();
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; )
{
y = double.Parse(reader[i++].ToString());
x = (double)new XDate(DateTime.Parse(reader[i++].ToString()));
list.Add(x, y);
}
}

}
catch (SqlException ex)
{
MessageBox.Show("插入错误!" + ex.Message.ToString());
}
myCommand.Clone();
myConnection.Close();
}

private void Form1_Load(object sender, EventArgs e)
{
this.zedGraphControl1.GraphPane.Title.Text = "动态折线图";

this.zedGraphControl1.GraphPane.XAxis.Title.Text = "时间";
this.zedGraphControl1.GraphPane.X2Axis.Scale.FontSpec.Size = 28;



this.zedGraphControl1.GraphPane.YAxis.Title.Text = "数量";
this.zedGraphControl1.GraphPane.YAxis.Scale.FontSpec.Size = 8;


myPan.XAxis.Scale.IsVisible = true;


this.zedGraphControl1.GraphPane.XAxis.Type = ZedGraph.AxisType.DateAsOrdinal;


Exc();

DateTime dt = DateTime.Now;



myCurve = zedGraphControl1.GraphPane.AddCurve("My Curve",

list, Color.DarkGreen, SymbolType.None);



this.zedGraphControl1.AxisChange();

this.zedGraphControl1.Refresh();

}
mjp1234airen4385 2011-09-06
  • 打赏
  • 举报
回复
你不是已经有了思路了吗?
1s取一次数据,然后画在图片上。
你先实现这个,以后再改动,无非就是从数据库取数据的方法改动。
画图的这部分是不用动的吧。
kudincha 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 feixuyue 的回复:]
你不是每隔1s存一次,然后又要取出画图,既然这样,先画图,再存入数据库
[/Quote]
不是,我的意思是要画图的数据已经存入了数据库,现在我要从数据库中取出来画图
kudincha 2011-09-06
  • 打赏
  • 举报
回复
先不管1S了,就是想定期到数据库取数据显示为曲线图,这个操作该如何做。我从数据库中取出21个数字,可以显示曲线了,但是如何让曲线后续的数字显示上去,是重新再读数据库么?怎么读呢?
feixuyue 2011-09-05
  • 打赏
  • 举报
回复
你不是每隔1s存一次,然后又要取出画图,既然这样,先画图,再存入数据库
kudincha 2011-09-05
  • 打赏
  • 举报
回复
我的想法是能否通过MQ的方式来进行这种操作,存数据的应用不操作数据库,仅仅是发送MQ,负责画图的应用通过接受MQ来动态的进行画图
这个如何实现?有相应代码么?
kudincha 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feixuyue 的回复:]
有个思路:
比如你图中最多显示10期数据,那么就建个Queue<T>,内存中只存放10组数据,超过的话,就存入数据库,并且删除该条数据,载入吓一跳,;
如果你是全部显示,那就放在list<t>里面吧;反正都要用到的,
[/Quote]
楼上,对你的方法不是很明白,我是从数据库中取出数据用于实时显示曲线,为什么还要存回到数据库中呢?
hen_ai_hen_ai_ni 2011-09-05
  • 打赏
  • 举报
回复
实时去搞数据库?这是个令人崩溃的问题,尤其是1s……最好将这个实时需要读取的放到另外一个和应用分离的存储器中,然后读取完后将之删除(我也崩溃,如果不需要读以前数据的情况下啊),尽量的和你的应用分开,另外对这种实时性很高的要求,除非是桌面系统自己用,否则在web上,一般数据库也支持不了这么高的实时性,目前有实时数据库支持这样的操作,比如pi数据库(好像是,反正叫pi派)。我的想法是能否通过MQ的方式来进行这种操作,存数据的应用不操作数据库,仅仅是发送MQ,负责画图的应用通过接受MQ来动态的进行画图,这样会比较好些,数据库这么实时实在是蛋疼
feixuyue 2011-09-05
  • 打赏
  • 举报
回复
有个思路:
比如你图中最多显示10期数据,那么就建个Queue<T>,内存中只存放10组数据,超过的话,就存入数据库,并且删除该条数据,载入吓一跳,;
如果你是全部显示,那就放在list<t>里面吧;反正都要用到的,
kudincha 2011-09-05
  • 打赏
  • 举报
回复
有点迷茫的就是,数据库中的数据是每隔1S在更新,我是不是该用线程每隔1S读取数据库,然后将读出的数据存放到动态数组中,但是数组可以存放这么大量的数据么?如何保证数据的实时性呢?

111,093

社区成员

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

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

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