现在运行程序就会出现这段语句
并且之前能存储至数据库的部分数据也是有误的,比如说控制点在文件中只有两行,却录入了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)
{
}
}
}
看提示说 缺少字段呀
以下是对代码的一些修改建议:
在解析控制点的数据时,只需存储点的坐标,而不是创建Observation对象。
在解析观测数据时,为每个测站处理所有的测量点。
当插入数据到数据库时,确保所有的必需参数都已经提供。
根据您提供的信息,以下是一种解决方案。这主要涉及到如何将控制点信息与测站观测信息分别存储并处理:
先要创建一个新类来存储控制点的信息:
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);
}
}
}
}
这种方法将控制点和观测数据分别存储并处理。这样在插入数据时就不会出现缺少参数的错误了。