在看到代码之前,我想尝试解释一下我想要发生的事情。这是一个个人项目,不担心sql注入,没有生产等等。
我的应用程序允许用户创建一个帐户,选择他们拍摄的类,然后查看它们。
我目前拥有的内容:用户创建存储在“用户”表格中的用户名/密码。用户名也存储为全局变量。同时,制作主课程列表(107行)的副本并重命名为用户用户名(来自全局变量。)创建用户名/密码后,用户将被带到他们选择课程的表单中已经采取了相应的等级。
我被困的地方:用户可以选择他们选择的课程并选择相应的成绩。 users表是即时生成的,因此除了使用Dynamic SQL之外,我不知道在运行时访问该表的任何其他方法。我只想在运行时更新用户表及其选择。
从这里,我的代码基本上说“如果选中标记,请更新用户课程表,其中的等级和状态为课程#= 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
我觉得自己很讨厌。我知道我不是那么好,而且可能有很多更简单的方法可以解决这个问题,但我真的正在努力通过我所掌握的知识来解决这个问题。