C# 无法获取动态SQL以传递动态表参数

C# 无法获取动态SQL以传递动态表参数,c#,sql,sql-server,C#,Sql,Sql Server,不担心SQL注入之类的问题,只是想让它正常工作。使用SSMS和VisualStudio 我有一个C#代码,它将一个变量GlobalVariables.username传递给一个SQL参数 private void btnNext_Click(object sender, EventArgs e) { if (checkIntrotoPublicSpeaking.Checked || checkEffectiveOralCommunication.Checked || checkProfC

不担心SQL注入之类的问题,只是想让它正常工作。使用SSMS和VisualStudio

我有一个C#代码,它将一个变量GlobalVariables.username传递给一个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);
    }
}
我知道全局变量可以工作,我有另一行代码,它只是一个显示值的MessageBox,它是正确的。就是无法让最后几行SQL正常工作。“我只是在试第一部分,@IntrotoPublicSpeaking,然后再看另外两部分。”

非常感谢您的帮助。

这里有两件事:

DECLARE @sql as nvarchar(max)
SET @sql = 'UPDATE ' + @Username + ' SET Grade = ' + 
@IntrotoPublicSpeaking + ' Status = "Completed" WHERE Course = 7600105';
EXEC sp_executesql @sql;
状态前缺少逗号,我认为您确实需要使用单引号

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

事实上,您甚至需要使用这种动态SQL,这意味着您的数据模型在使用数据(
@userName
变量的内容)作为元数据(表名)时被破坏了。除非您有不同的表来描述恰好共享相同列的不相关业务实体,否则正确的解决方案是将所有这些表合并到一个表中,添加一个列来区分不同的用户。这可能会修复报告的问题(语法错误),但这不是一个解决方案,这是一个解决办法。正确的解决方案是重构数据库。有关详细信息,请参阅我对问题的评论。@ZoharPeled同意,但我敢打赌,由于这些错误,他得到的语法无效。我同意-这就是为什么我在开始评论时说“这可能会解决报告的问题”…@hardkoded System.Data.SqlClient.SqlException:“Status附近的语法不正确”。这就是它现在告诉我的。我会继续捣乱的,谢谢你
Status
是SQL Server中的一个关键字,您可能需要在其周围使用方括号:
[Status]
DECLARE @sql as nvarchar(max)
SET @sql = 'UPDATE ' + @Username + ' SET Grade = ' + 
@IntrotoPublicSpeaking + ', Status = ''Completed'' WHERE Course = 7600105';
EXEC sp_executesql @sql;