解决 sql数据到图表

米拉德尔

会员
已加入
2020年8月16日
留言内容
8
编程经验
Beginner
大家好,
我在添加带有SQL数据的图表时遇到一些问题。
为了定义问题,我需要从传感器收集数据,将其存储在数据库中,并按时间降序格式将其用作图表和数据网格。
下面的代码是项目的一个简单示例部分,问题是,每当我启动应用程序时,数据就会显示在数据网格视图和图表上,但是图表数据就像之字形线一样。
每条新生产线只是传感器的末端&起始值(请参见所附图片:此处[67,43],[65,43],[63,43],...)
另一个问题是数据库中没有数据存储,并且所有字段都为空。
项目以zip文件形式附加。
感谢您一如既往的帮助。

注释2020-08-18 235008.jpg
注释2020-08-18 235009.jpg

C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Web.UI.DataVisualization.Charting;

namespace p1
{
    public partial class Form1 : Form
    {
        SqlConnection conn = new SqlConnection();
        SqlCommand cmd1 = new SqlCommand();
        SqlDataAdapter da = new SqlDataAdapter();
        DataSet ds = new DataSet();

        int inputData;
        public Form1()
        {
            InitializeComponent();
        }

        private void BtnStart_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }

        private void Timer1_Tick(object sender, EventArgs e)
        {
            serialPort1.Open();
            serialPort1.Write("1");
            txtData.Text = serialPort1.ReadLine();
            serialPort1.Close();
            SqlCommand c1 = new SqlCommand();
            c1.CommandText = "insert into tblCount values (@p1,@p2)";
            inputData = Int32.Parse(txtData.Text);
            c1.Parameters.AddWithValue("p1",DateTime.Now.ToString());
            c1.Parameters.AddWithValue("p2", inputData);
            c1.Connection = conn;
            c1.ExecuteNonQuery();
            fillgrid();
        }

        private void BtnStop_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            conn.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True";
            conn.Open();
            fillgrid();
        }
        void fillgrid(string s="select * from tblCount")
        {
            cmd1.CommandText = s;
            cmd1.Connection = conn;
            da.SelectCommand = cmd1;
            ds.Clear();
            da.Fill(ds, "T1");
            dataGridView1.DataBindings.Clear();
            dataGridView1.DataBindings.Add("datasource", ds, "T1");
            dataGridView1.Sort(dataGridView1.Columns[0], 清单SortDirection.Descending);
            txtData.DataBindings.Clear();

            //===================================================Chart1
            SqlConnection conn2 = new SqlConnection();
            conn2.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True";
            conn2.Open();
            SqlCommand cmd2 = new SqlCommand("select sensorValue from tblCount order by dateTime desc", conn2);
            SqlDataReader reader = cmd2.ExecuteReader();
            Series sr = new Series();
            while (reader.Read())
                chart1.Series[0].Points.AddY(reader.GetInt32(0));
        }
    }
}
 

附件

  • 压缩文件
    739.4 KB · 观看次数: 5

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
您忽略了问一个问题。而且我不是一个做假设的人。

你有什么问题?
您的期望是什么?
您目前的实际结果是什么?

另外,要指出代码中的一些内容。在诸如表单加载事件中打开数据库连接之类的事情时,通常这不是一个好的模型。数据库无法访问等问题将严重破坏表单的加载方式。将连接尝试包装在try catch块中也是一个好主意。 (链接到我的签名中。)您也不应该将UI用作处理业务逻辑的模型。例如数据库交互等。通常,您将使用后台工作程序或至少使用一个新线程,该线程不是您的UI使用的线程。

下一个。这是关于什么的:
C#:
void fillgrid(string s="select * from tblCount")
应该 :
C#:
void fillgrid(string s)
但是,我建议使用比s更合适的参数名称。然后,您可以使用调用该方法:
C#:
fillgrid("select * from tblCount");

将一次性对象包装在using语句中也是一个好主意,因为使用它们时这些一次性对象将被处置。 SqlCommands,SqlConnections,SqlDataReaders都可以使用using语句。最后,获胜形式就是EOL,您可以使用其后继产品来制作更时尚的窗户。 WPF。您还应该检查插入命令的参数名称,并使用适当的名称,而不是与名称空间或任何其他已命名对象匹配的名称。并在您的参数定义没有符号的地方添加@。您可以在我的签名中找到使用参数的链接。

至于其余的,您需要更加具体,如我上面所问。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,501
地点
悉尼,澳大利亚
编程经验
10+
另一个问题是数据库中没有数据存储,并且所有字段都为空。
让我在那里阻止你。图表是关于显示数据的,因此没有数据保存到数据库这一事实是完全不相关的。请将每个主题归为一个主题,将每个主题归为一个主题。如果在显示数据和保存数据时遇到问题,请为两个单独的问题创建两个单独的线程。
 

米拉德尔

会员
已加入
2020年8月16日
留言内容
8
编程经验
Beginner
您忽略了问一个问题。而且我不是一个做假设的人。

你有什么问题?
您的期望是什么?
您目前的实际结果是什么?

另外,要指出代码中的一些内容。在诸如表单加载事件中打开数据库连接之类的事情时,通常这不是一个好的模型。数据库无法访问等问题将严重破坏表单的加载方式。将连接尝试包装在try catch块中也是一个好主意。 (链接到我的签名中。)您也不应该将UI用作处理业务逻辑的模型。例如数据库交互等。通常,您将使用后台工作程序或至少使用一个新线程,该线程不是您的UI使用的线程。

下一个。这是关于什么的:
C#:
void fillgrid(string s="select * from tblCount")
应该 :
C#:
void fillgrid(string s)
但是,我建议使用比s更合适的参数名称。然后,您可以使用调用该方法:
C#:
fillgrid("select * from tblCount");

将一次性对象包装在using语句中也是一个好主意,因为使用它们时这些一次性对象将被处置。 SqlCommands,SqlConnections,SqlDataReaders都可以使用using语句。最后,获胜形式就是EOL,您可以使用其后继产品来制作更时尚的窗户。 WPF。您还应该检查插入命令的参数名称,并使用适当的名称,而不是与名称空间或任何其他已命名对象匹配的名称。并在您的参数定义没有符号的地方添加@。您可以在我的签名中找到使用参数的链接。

至于其余的,您需要更加具体,如我上面所问。


亲爱的史密斯,
多谢您的宝贵意见。
我一直在寻找合适的继任者,因为您确实提到过胜利形式是EOL。我认为UWP比WPF更好。所以现在我正在UWP上学习它。接下来,我将重写我的程序,并希望正确地执行它,而不是像这样。这是一个示例代码,我知道我需要大量修改。
感谢您的回答
问候
 

米拉德尔

会员
已加入
2020年8月16日
留言内容
8
编程经验
Beginner
让我在那里阻止你。图表是关于显示数据的,因此没有数据保存到数据库这一事实是完全不相关的。请将每个主题归为一个主题,将每个主题归为一个主题。如果在显示数据和保存数据时遇到问题,请为两个单独的问题创建两个单独的线程。


尊敬的jmcilhinney,
是的,最好将每个问题都放在一个线程中。我需要更改整个程序。让我们看看它会如何进行。
谢谢
问候
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
很高兴看到您将进行一些修订,并从旧的Winforms移开。 WPF适合您的工作,除非您需要Windows设备的移动版本。在这种情况下,UWP将是更好的选择。但是,如果您只需要台式机版本,那么我个人会喜欢WPF。

如果您遇到困难,如果有任何疑问,就知道我们在哪里。
 
最佳 底部