如何更新动态表?

时间:2018-04-04 16:35:10

标签: c# sql sql-server

在看到代码之前,我想尝试解释一下我想要发生的事情。这是一个个人项目,不担心sql注入,没有生产等等。

我的应用程序允许用户创建一个帐户,选择他们拍摄的类,然后查看它们。

我目前拥有的内容:用户创建存储在“用户”表格中的用户名/密码。用户名也存储为全局变量。同时,制作主课程列表(107行)的副本并重命名为用户用户名(来自全局变量。)创建用户名/密码后,用户将被带到他们选择课程的表单中已经采取了相应的等级。

我被困的地方:用户可以选择他们选择的课程并选择相应的成绩。 users表是即时生成的,因此除了使用Dynamic SQL之外,我不知道在运行时访问该表的任何其他方法。我只想在运行时更新用户表及其选择。

Example of user selection.

从这里,我的代码基本上说“如果选中标记,请更新用户课程表,其中的等级和状态为课程#= x。”我的问题是全局变量吗?我应该以某种方式使用我的用户表吗?我应该以某种方式使用QUOTENAME而不是UPDATE吗?我的@sql代码不断出现语法错误,所以我觉得一个简单的修复可以解决问题。

private void btnNext_Click(object sender, EventArgs e)
    {
        if (checkIntrotoPublicSpeaking.Checked || checkEffectiveOralCommunication.Checked || checkProfComm.Checked)
        {
            List<SqlParameter> sqlOralComm = new List<SqlParameter>();
            sqlOralComm.Add(new SqlParameter("Username", GlobalVariables.username));
            sqlOralComm.Add(new SqlParameter("IntrotoPublicSpeaking", cboxIntrotoPublicSpeaking.Text));
            sqlOralComm.Add(new SqlParameter("EffectiveOralCommunication", cboxEffectiveOralCommunication.Text));
            sqlOralComm.Add(new SqlParameter("ProfComm", cboxProfComm.Text));
            DAL.ExecSP("CreateOralComm", sqlOralComm);
        }
}

ALTER PROCEDURE [dbo].[CreateOralComm]
-- Add the parameters for the stored procedure here
    @Username nvarchar(30),
    @IntrotoPublicSpeaking nvarchar(3),
    @EffectiveOralCommunication nvarchar(3),
    @ProfComm nvarchar(3)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
    SET NOCOUNT ON;

-- Insert statements for procedure here

    DECLARE @sql as nvarchar(max)
    SET @sql = 'UPDATE ' + @Username + ' SET Grade = ' + 
    @IntrotoPublicSpeaking + ', Status = ''Completed'' WHERE Course = 
    7600105'
    EXEC sp_executesql @sql;

    /*
    SELECT QUOTENAME(@Username) 
    SET Grade = 'A', Status = 'Completed' 
    WHERE Course = 7600105;
    */
END
GO

我觉得自己很讨厌。我知道我不是那么好,而且可能有很多更简单的方法可以解决这个问题,但我真的正在努力通过我所掌握的知识来解决这个问题。

0 个答案:

没有答案