不要担心SQL注入或类似的东西,只是试图让它工作。使用SSMS和Visual Studio。
我有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);
}
}
我一直在阅读动态SQL并看到将表名作为参数传递,你必须手动构建它并执行它作为“SET ...”等等。我一直在尝试略有不同修改下面的最后3行。每次,我都会遇到与该行不同部分有关的“无效语法...”异常。在堆栈交换中,它分为3行,但在SSMS中它是一行,更容易阅读。
状态为nvarchar列,Course为int列。
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;
END
GO
我知道全局变量有效,我有另一行代码,它只是一个显示值的MessageBox,而且是正确的。只是不能让最后几行SQL工作。我正在尝试第一部分@IntrotoPublicSpeaking,然后再转到另一部分。
任何帮助都会非常感激。
答案 0 :(得分:1)
这里有两件事:
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;