【问题标题】:C# Windows Form Application Update Query for Foreign Keys VS2010C# Windows 窗体应用程序更新查询外键 VS2010
【发布时间】:2015-04-13 20:31:14
【问题描述】:

我需要帮助的人需要更新我的课程名称。
表1:课程
-CurriculumID (PK, Auto_Increment)
-课程名称
表 2:年级
-GradeLevelID(PK,自动增量)
-等级
-CurriculumID(连接到课程表的外键)

结果:

年级 |课程名称
````````````1级````````````K-12`````````
更新到
`````````````2级``````````K-11

问题是每当我按下更新按钮时,它都不会更新,因为我的更新查询不起作用。这是我的代码。请帮忙~

private void btnGLEdit_Click(object sender, EventArgs e)
        {
            try
            {
                //update
                SqlConnection scon = new SqlConnection();
                scon.ConnectionString = "Data Source=.;Initial Catalog=HSPAEnrollmentSytem;Integrated Security=True";
                //scon.ConnectionString = "Data Source=D630 ;Initial Catalog=NLEDB; User ID=approj1; Password=approj1";
                scon.Open();

                SqlCommand cmd = new SqlCommand("UPDATE GradeLevel set GradeLevel = @GradeLevel, CurriculumID = @CurriculumID where GradeLevelID = '" + txtGradeLevelID.Text + "'", scon);



                //cmd.Parameters.Add("@GradeLevel", SqlDbType.Int).Value = txtGradeLevel.Text.Trim();
                //cmd.Parameters.Add("@CurriculumID", SqlDbType.Int).Value = comboBox1.Text.ToString();
                cmd.Parameters.AddWithValue("@GradeLevel", txtGradeLevel.Text);
                cmd.Parameters.AddWithValue("@CurriculumID", comboBox1.Text);

                cmd.ExecuteNonQuery();
                MessageBox.Show("update");
            }
            catch (SqlException ex)
            {

            }
        } 

【问题讨论】:

  • 行不通是什么意思?是否引发异常?您收到什么错误消息?
  • “不起作用”是什么意思?你有例外吗?从外观上看,您忽略了发生的任何 sql 异常,而不是抛出它们或至少执行Debug.Write(ex.StackTrace) - 您是否尝试过调试?
  • 你们知道外键的更新查询吗?我只是无法更新它。因为它应该更新课程名称而不是课程 ID。就像它没有相互连接一样
  • it should update the Curriculum Name not the Curriculum ID 您正在更新课程 ID。您的查询中没有任何内容试图更新课程名称。您想用什么来更新名称?更新后应该有什么?
  • @JoshPart 我尝试在查询中使用 CurriculumID,因为我认为它会自动连接到 Curriculum 名称。嗯示例:1 年级,课程 k-12(幼儿园 - 12 年级)然后更新到 2 年级,课程 K-13

标签: c# sql-server winforms visual-studio-2010 foreign-keys


【解决方案1】:

也许这个答案看起来更像是一个评论,但它需要文本格式并且会很长,所以我决定把它作为一个答案。希望不会造成任何麻烦

让我看看我能不能让你好起来……

你有下一个架构:

Curricuculum
--------------------------------
CurriculumID ( PK, Auto_Increment )
CurriculumName

GradeLevel
--------------------------------
GradeLevelID( PK, Auto_Increment )
GradeLevel
CurriculumID( Foreign Key )

还有这个数据:

Curriculum
----------------------------------------
CurriculumId | CurriculumName
----------------------------------------
1            | K-12
2            | K-13

GradeLevel
----------------------------------------
GradeLevelId | GradeLevel | CurriculumId
----------------------------------------
1            | Grade 1    | 1

执行此查询:

SELECT g.GradeLevelId, g.GradeLevel, c.CurriculumName
FROM GradeLevel g
INNER JOIN Curriculum c
ON g.CurriculumId = c.CurriculumId

返回这个结果:

------------------------------------------
GradeLevelId | GradeLevel | CurriculumName
------------------------------------------
1            | Grade 1    | K-12

现在您的代码中有此更新:

UPDATE GradeLevel set GradeLevel = @GradeLevel, CurriculumID = @CurriculumID where GradeLevelID = ' txtGradeLevelID.Text '

你想更新GradeLevel,这样你就会得到这样的数据:

GradeLevel
----------------------------------------
GradeLevelId | GradeLevel | CurriculumId
----------------------------------------
1            | Grade 2    | 2

再次运行我之前输入的相同查询现在会返回这个结果:

------------------------------------------
GradeLevelId | GradeLevel | CurriculumName
------------------------------------------
1            | Grade 2    | K-13

现在... 这是您真正想要的吗?您在问题中说过您想更新 CurriculumName,但您从未更新该字段,您的 cmets 和答案告诉我您只想引用Curriculum 中具有CurriculumID = 2 的记录。如果我说的是正确的,那么到目前为止,您的代码看起来应该并且应该这样做。所以我可以告诉你的几件事是:

  • 在为查询参数赋值时放置一个断点,并确保它们具有您想要的值(txtGradeLevelID.text = "1"txtGradeLevel.text = "Grade 2"ComboBox1.Text = "2"
  • 不要将catch 留空;至少放一个消息框告诉你出了什么问题。也许有一个错误,你永远不会注意到它。
  • (与您的问题本身无关,但需要考虑)如果您已经在使用参数化查询...为什么还要进行字符串连接?您还可以在 WHERE 条件中使用参数;没有理由混合使用两种方式来运行查询,而且字符串连接会导致 SQL 注入和性能问题。

现在,如果我所说的不是您真正想要实现的,请重新表述您的问题。添加您在 cmets 中编写的任何相关信息,并正确格式化(老实说,我很难相信您的问题没有被搁置,甚至没有收到一个反对票)

【讨论】:

    【解决方案2】:

    您在更新声明中没有引用您的列 Curriculum Name

    SqlCommand cmd = new SqlCommand("UPDATE GradeLevel set GradeLevel = @GradeLevel, CurriculumID = @CurriculumID where GradeLevelID = '" + txtGradeLevelID.Text + "'", scon);
    

    您希望Curriculum Name 更新到什么?您没有提供任何更改。事实上,如果您要更改 Curriculum Name,因为它存在于您的 Curriculum 表中,而不是您的 GradeLevel 表中,那么您正在更新错误的表。

    您的更新语句应该看起来更像这样:

    UPDATE Curriculum
    SET 'Curriculum Name' = @curriculumName
    WHERE curriculumId = @curriculumId
    

    我不明白您为什么要根据年级 ID 更新课程名称...这将使用许多潜在的不同值多次更新表中的行。所以最后,你不一定知道最后会叫什么名字。

    一旦您的课程名称更新,任何从年级 -> 课程在正确列上的连接都将显示新更新的课程名称。

    老实说,我不了解您的架构。如果要同时更新这两个值,则将它们作为两个单独的表似乎不可行。他们两个总是要一起改变吗?他们有1对1的关系吗?如果是这样的话,它们可能属于同一张桌子。要么,要么将您的 PK 放在您的成绩表上,然后将课程表设置为两个表上的主键。这样,您将拥有一对一的关系,而不是一对多的关系。

    【讨论】:

    • 如果我使用 UPDATE Curriculum SET 'Curriculum Name' = courseName WHERE courseId = courseId 它将更新我的课程表,当我添加年级时,我只需要在我的年级表中获取课程名称我的课程
    • @KennethChang 您可以尝试改写您的回复吗?我不明白你的意思。
    • 第一个表:Curriculum = CurriculumID(PK) and CurriculumName---- 第二个表:GradeLevel = GradeLevelID(PK), GradeLevelName, and CurriculumID(ForeignKey)---- 例如。表 1:CurriculumID = 1 & 2,CurriculumName = K-12 & K-13---- 表 2:GradeLevelID = 1,GradeLevelName = Grade 2,CurriculumID = 1---- 已插入,所以接下来我需要更新我的Table2 CurriculumID rom 1 到 2 所以结果将是 Table2: GradeLevelID = 1, GradeLevelName = Grade 2, CurriculumID = 2----
    • @KennethChang 由于 cmets 的格式,这并不能真正帮助我理解您的问题。请使用所有相关信息更新您的问题。您当前在两个表(示例)中都有哪些数据,您正在尝试完成什么,以及您预期的结果数据。我看到你已经在你的问题中做了一个“结果”部分,但正如我在回答中所说,你的模式对于这种关系并没有真正意义。至少我所掌握的关于您的问题的信息不是。
    最近更新 更多