【问题标题】:Can not correct to display data from ms sql tables in datagridview无法更正以在 datagridview 中显示 ms sql 表中的数据
【发布时间】:2019-02-26 21:28:36
【问题描述】:

不知道如何解决。 所以我有一个来自 MS SQL Server 的导入表(屏幕截图)Patient(#1)和Diagnoz(诊断)(#2)。第一个表包含患者数据的完整列表和 id_diagnoz 的外键,其中指示 Stage 和 Name_diagnoz。 表(#3)是一个现成的选项,用于输出数据而没有不必要的列,但这不是问题。"select Pacient.id_patient, Pacient.Name, Pacient.Surname, Pacient.Middle_name, Pacient.Age, Pacient.Legal_address_Clinic, Diagnoz.Name_diagnoz, Diagnoz.Stage FROM Pacient JOIN Diagnoz ON Diagnoz.id_diagnoz = Pacient.id_diagnoz";这很好用。


问题是,当从文本框和组合框填写数据时,我需要首先从表中生成一个 id_diagnoz (# 2),然后将其他信息添加到患者表中(#1)。但是,我无法做到这几个小时,因为即使是错误也没有导致。因此,我决定将 id_diagnoz 单独添加到空表(# 4)中,以确保我的查询正常工作。 请帮我处理这个 id_diagnoz 和其他放入患者表的数据。

  private void button5_Click(object sender, EventArgs e)
        {

            using (SqlConnection conn = new SqlConnection("Data Source=DESKTOP-R551818\\SQLEXPRESS;Initial Catalog=Fond;Integrated Security=True"))
            {



                SqlDataAdapter comm = new SqlDataAdapter("SELECT id_diagnoz FROM Diagnoz WHERE Name_diagnoz = '" + comboBox2.Text + "' and Stage = '" + comboBox3.Text + "'" +
                    "INSERT INTO Pacient (Name, Surname, Middle_name, Column__Passport, Legal_address_Clinic, Age)" +
                    " VALUES (@Name, @Surname, @Middle, @Passport, @AddresClinic, @Age) ", conn);

                comm.SelectCommand.Parameters.AddWithValue("@Name", textBox3.Text);
                comm.SelectCommand.Parameters.AddWithValue("@Surname", textBox4.Text);
                comm.SelectCommand.Parameters.AddWithValue("@Middle", textBox5.Text);
                comm.SelectCommand.Parameters.AddWithValue("@Passport", maskedTextBox1.Text);
                comm.SelectCommand.Parameters.AddWithValue("@AddresClinic", comboBox1.Text);
                comm.SelectCommand.Parameters.AddWithValue("@Age", textBox7.Text);
                DataSet ds = new DataSet();
                comm.Fill(ds);
                //da.Fill(ds, "Pacient");

                dataGridView2.DataSource = ds.Tables[0];
                conn.Close();

                conn.Open();

            }}

Screenshot for understanding

【问题讨论】:

  • 您应该与我们分享您遇到的错误,但快速检查让我发现您在查询中的 INSERT 关键字之前缺少一个空格:" INSERT INTO Pacient
  • 您应该参数化所有谓词。当您像这样将文本框值插入字符串的中间时,您破坏了 sql 注入保护。您还应该避免使用 AddWithValue,因为它有时会导致数据类型错误。 blogs.msmvps.com/jcoehoorn/blog/2014/05/12/… 最后但同样重要的是,给你的控件起一个名字,告诉你它是什么。 TextBox1 没用。当屏幕上有 20 个文本框并且需要获取 LastName 时,您必须查看设计器。

标签: c# sql-server winforms


【解决方案1】:

您不应该在插入查询中指定 id_diagnoz 并使用您在那里的子查询提供该字段的值吗? 比如:

INSERT INTO Pacient (Name, id_diagnoz, Surname, Middle_name, Column__Passport, Legal_address_Clinic, Age)
VALUES (@Name, 
SELECT id_diagnoz FROM Diagnoz WHERE Name_diagnoz = '" + comboBox2.Text + "' and Stage = '" + comboBox3.Text + "'",
@Surname, @Middle, @Passport, @AddresClinic, @Age)

【讨论】:

  • 你不应该提供这样危险的代码作为答案。这是延续允许 sql 注入的连接字符串的坏习惯。
  • @SeanLange 只是试图解决所提出的问题。您绝对正确,查询的构造方式也存在问题。不想进一步引起混乱。一次一个问题。
  • 谢谢大家:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多