c#存储数据至数据库中问题

现在运行程序就会出现这段语句

img

并且之前能存储至数据库的部分数据也是有误的,比如说控制点在文件中只有两行,却录入了4行值,其他表则是完全未录入
请问如何修改呢?

//部分数据文本如下
2,2,2//验前精度
CG1-01,500,500//控制点名,x,y坐标
CG1-02,499,499

CG1-01//测站名
CG1-02,L,0.00000//前视点名,L代表左角,观测角
CG1-02,S,212.681//前视点名,S代表平距,平距
CG1-15,L,277.4323//后视点名,L代表左角,观测角
CG1-15,S,273.565//后视点名,S代表平距,平距

CG1-02
CG1-03,L,0.00000
CG1-03,S,213.198
CG1-01,L,214.3425
CG1-01,S,212.679

CG1-03
CG1-04,L,0.00000
CG1-04,S,166.330
CG1-02,L,238.5624
CG1-02,S,213.197


代码如下


public partial class Mainform : Form
    {
        private string connectionString = "Data Source=MSI;Initial Catalog=TA_Data;Integrated Security=True";//与数据库连接


        public Mainform()
        {
            InitializeComponent();

        }

        public class Observation
        {
            public string PointName { get; set; }
            public double X { get; set; }
            public double Y { get; set; }
            public string TargetName { get; set; }
            public string ObservationType { get; set; }
            public double Angle { get; set; }
            public double Distance { get; set; }

            public Observation(string pointName, double x, double y)
            {
                PointName = pointName;
                X = x;
                Y = y;
            }

            public Observation(string pointName, string targetName, string observationType, double angle, double distance)
            {
                PointName = pointName;
                TargetName = targetName;
                ObservationType = observationType;
                Angle = angle;
                Distance = distance;
            }

            public Observation(string pointName, string targetName, string observationType, double value)
            {
                PointName = pointName;
                TargetName = targetName;
                ObservationType = observationType;

                if (observationType == "L")
                {
                    Angle = value;
                }
                else if (observationType == "S")
                {
                    Distance = value;
                }
            }
        }





        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Multiselect = false; //同时仅能选择一项文件
            dialog.Title = "请选择文件";
            dialog.Filter = "in2格式(*.in2)|*.in2|所有格式|*.*";



            if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string file = dialog.FileName; //读取文件内容
                System.IO.StreamReader sr = new System.IO.StreamReader(file,System.Text.Encoding.Default);
                String fileContent = sr.ReadToEnd().TrimStart();
                richTextBox1.AppendText(fileContent + "\n"); //显示文件内容

                List<Observation> observations = ParseObservationData(fileContent); //解析文件内容

                SaveObservationDataToDatabase(observations); // 将观测数据存储到数据库

            }
        }


        private List<Observation> ParseObservationData(string fileContent)
        {
            List<Observation> observations = new List<Observation>();

            string[] lines = fileContent.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

            // 解析观测精度和全站仪固定误差
            string[] accuracyValues = lines[0].Split(',');
            double angleAccuracy = double.Parse(accuracyValues[0]);
            double instrumentError = double.Parse(accuracyValues[1]);
            double scaleError = double.Parse(accuracyValues[2]);

            // 解析控制点
            for (int i = 1; i < lines.Length - 5; i++)
            {
                string[] pointValues = lines[i].Split(',');

                if (pointValues.Length == 3)
                {
                    string pointName = pointValues[0];
                    double x, y;

                    if (double.TryParse(pointValues[1], out x) && double.TryParse(pointValues[2], out y))
                    {
                        observations.Add(new Observation(pointName, x, y));
                    }
                    else
                    {
                        // 处理无效的坐标值
                        // 可以选择忽略或记录错误信息
                    }
                }
            }

            // 解析测站点
            string stationName = lines[lines.Length - 6];

            // 解析观测数据
            for (int i = lines.Length - 5; i < lines.Length; i += 2)
            {
                string[] targetValues = lines[i].Split(',');

                if (targetValues.Length >= 3)
                {
                    string targetName = targetValues[0];
                    string observationType = targetValues[1];
                    double observationValue;

                    if (double.TryParse(targetValues[2], out observationValue))
                    {
                        observations.Add(new Observation(stationName, targetName, observationType, observationValue));
                    }
                    else
                    {
                        // 处理无效的观测值
                        // 可以选择忽略或记录错误信息
                    }
                }
            }

            return observations;
        }


        private bool IsStationName(string line)
        {
            // 根据实际情况判断测站名,这里可以根据需要进行自定义判断条件
            return !string.IsNullOrEmpty(line) && !line.Contains(",");
        }



        private void SaveObservationDataToDatabase(List<Observation> observations)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                // 清空表格中的旧数据
                ClearObservationsTable(connection);

                double angleAccuracy = 0.0; // 从文件中解析观测精度
                double instrumentError = 0.0; // 从文件中解析全站仪固定误差
                double scaleError = 0.0; // 从文件中解析比例尺误差

                // 使用事务将数据存储到数据库
                using (SqlTransaction transaction = connection.BeginTransaction())
                {
                    try
                    {
                        // 插入观测精度和全站仪固定误差
                        string insertAccuracyQuery = "INSERT INTO Accuracy (AngleAccuracy, InstrumentError, ScaleError) VALUES (@AngleAccuracy, @InstrumentError, @ScaleError)";
                        using (SqlCommand command = new SqlCommand(insertAccuracyQuery, connection, transaction))
                        {
                            command.Parameters.AddWithValue("@AngleAccuracy", angleAccuracy);
                            command.Parameters.AddWithValue("@InstrumentError", instrumentError);
                            command.Parameters.AddWithValue("@ScaleError", scaleError);
                            command.ExecuteNonQuery();
                        }

                        // 插入控制点数据
                        foreach (var observation in observations)
                        {
                            string insertQuery = "INSERT INTO ControlPoints (PointName, X, Y) VALUES (@PointName, @X, @Y)";
                            using (SqlCommand command = new SqlCommand(insertQuery, connection, transaction))
                            {
                                command.Parameters.AddWithValue("@PointName", observation.PointName);
                                command.Parameters.AddWithValue("@X", observation.X);
                                command.Parameters.AddWithValue("@Y", observation.Y);
                                command.ExecuteNonQuery();
                            }

                            // 插入观测数据
                            string insertObservationQuery = "INSERT INTO Observations (PointName, TargetName, ObservationType, Angle, Distance) VALUES (@PointName, @TargetName, @ObservationType, @Angle, @Distance)";
                            using (SqlCommand command = new SqlCommand(insertObservationQuery, connection, transaction))
                            {
                                command.Parameters.AddWithValue("@PointName", observation.PointName);
                                command.Parameters.AddWithValue("@TargetName", observation.TargetName);
                                command.Parameters.AddWithValue("@ObservationType", observation.ObservationType);
                                command.Parameters.AddWithValue("@Angle", observation.Angle);
                                command.Parameters.AddWithValue("@Distance", observation.Distance);
                                command.ExecuteNonQuery();
                            }
                        }

                        transaction.Commit();
                        MessageBox.Show("Observation data saved to database successfully.");
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        MessageBox.Show("Error saving observation data to database: " + ex.Message);
                    }
                }
            }
        }

        private void ClearObservationsTable(SqlConnection connection)
        {
            string deleteQuery = "DELETE FROM ControlPoints";
            using (SqlCommand command = new SqlCommand(deleteQuery, connection))
            {
                command.ExecuteNonQuery();
            }

            string deleteAccuracyQuery = "DELETE FROM Accuracy";
            using (SqlCommand command = new SqlCommand(deleteAccuracyQuery, connection))
            {
                command.ExecuteNonQuery();
            }
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

看提示说 缺少字段呀

TechWhizKid参考GPT回答:

以下是对代码的一些修改建议:

  1. 在解析控制点的数据时,只需存储点的坐标,而不是创建Observation对象。

  2. 在解析观测数据时,为每个测站处理所有的测量点。

  3. 当插入数据到数据库时,确保所有的必需参数都已经提供。

根据您提供的信息,以下是一种解决方案。这主要涉及到如何将控制点信息与测站观测信息分别存储并处理:

先要创建一个新类来存储控制点的信息:

public class ControlPoint
{
    public string PointName { get; set; }
    public double X { get; set; }
    public double Y { get; set; }

    public ControlPoint(string pointName, double x, double y)
    {
        PointName = pointName;
        X = x;
        Y = y;
    }
}

然后在 ParseObservationData 方法中,用两个列表分别存储控制点和观测信息:

private void ParseObservationData(string fileContent)
{
    List<ControlPoint> controlPoints = new List<ControlPoint>();
    List<Observation> observations = new List<Observation>();

    // ...其他代码

    // 解析控制点
    string stationName = null;
    for (int i = 1; i < lines.Length; i++)
    {
        string[] values = lines[i].Split(',');
        if (IsStationName(lines[i]))
        {
            stationName = values[0];
        }
        else if (values.Length == 3)
        {
            string pointName = values[0];
            double x, y;
            if (double.TryParse(values[1], out x) && double.TryParse(values[2], out y))
            {
                controlPoints.Add(new ControlPoint(pointName, x, y));
            }
            // 处理无效的坐标值
        }
        else if (stationName != null && values.Length == 3)
        {
            string targetName = values[0];
            string observationType = values[1];
            double observationValue;
            if (double.TryParse(values[2], out observationValue))
            {
                observations.Add(new Observation(stationName, targetName, observationType, observationValue));
            }
            // 处理无效的观测值
        }
    }

    // ...其他代码

    // 保存控制点和观测数据
    SaveControlPointDataToDatabase(controlPoints);
    SaveObservationDataToDatabase(observations);
}

然后创建两个新的方法来保存控制点和观测数据:

private void SaveControlPointDataToDatabase(List<ControlPoint> controlPoints)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        ClearControlPointsTable(connection);
        using (SqlTransaction transaction = connection.BeginTransaction())
        {
            try
            {
                foreach (var point in controlPoints)
                {
                    string insertQuery = "INSERT INTO ControlPoints (PointName, X, Y) VALUES (@PointName, @X, @Y)";
                    using (SqlCommand command = new SqlCommand(insertQuery, connection, transaction))
                    {
                        command.Parameters.AddWithValue("@PointName", point.PointName);
                        command.Parameters.AddWithValue("@X", point.X);
                        command.Parameters.AddWithValue("@Y", point.Y);
                        command.ExecuteNonQuery();
                    }
                }
                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                MessageBox.Show("Error saving control point data to database: " + ex.Message);
            }
        }
    }
}

private void SaveObservationDataToDatabase(List<Observation> observations)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        ClearObservationsTable(connection);
        using (SqlTransaction transaction = connection.BeginTransaction())
        {
            try
            {
                foreach (var observation in observations)
                {
                    string insertQuery = "INSERT INTO Observations (PointName, TargetName, ObservationType, Angle, Distance) VALUES (@PointName, @TargetName, @ObservationType, @Angle, @Distance)";
                    using (SqlCommand command = new SqlCommand(insertQuery, connection, transaction))
                    {
                        command.Parameters.AddWithValue("@PointName", observation.PointName);
                        command.Parameters.AddWithValue("@TargetName", observation.TargetName);
                        command.Parameters.AddWithValue("@ObservationType", observation.ObservationType);
                        command.Parameters.AddWithValue("@Angle", observation.Angle);
                        command.Parameters.AddWithValue("@Distance", observation.Distance);
                        command.ExecuteNonQuery();
                    }
                }
                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                MessageBox.Show("Error saving observation data to database: " + ex.Message);
            }
        }
    }
}

这种方法将控制点和观测数据分别存储并处理。这样在插入数据时就不会出现缺少参数的错误了。