【问题标题】:SQL Query within VS TableAdapter Query Configuration WizardVS TableAdapter 查询配置向导中的 SQL 查询
【发布时间】:2011-01-23 05:30:39
【问题描述】:

我正在尝试在 Visual Studio TableAdapter 查询向导中编写 SQL 查询

我的 SQL 查询是:

    DECLARE @SQL varchar(255);

SET @SQL = ' SELECT * FROM dbAddress WHERE 1 = 1'

IF @ApexLine1 = ''
    BEGIN
        SET @SQL = @SQL + ' AND addLine1 IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addLine1 = ''' + @ApexLine1 + ''''
    END

IF @ApexLine2 = ''
    BEGIN
        SET @SQL = @SQL + ' AND addLine2 IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addLine2 = ''' + @ApexLine2 + ''''
    END

IF @ApexLine3 = ''
    BEGIN
        SET @SQL = @SQL + ' AND addLine3 IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addLine3 = ''' + @ApexLine3 + ''''
    END

IF @ApexZip = ''
    BEGIN
        SET @SQL = @SQL + ' AND addPostCode IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addPostCode = ''' + @ApexZip + ''''
    END

IF @ApexCity = ''
    BEGIN
        SET @SQL = @SQL + ' AND addLine4 IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addLine4 = ''' + @ApexCity + ''''
    END

IF @ApexProv = ''
    BEGIN
        SET @SQL = @SQL + ' AND addLine5 IS NULL '
    END
ELSE
    BEGIN
        SET @SQL = @SQL + ' AND addLine5 = ''' + @ApexProv + ''''
    END

EXEC(@SQL)

我得到错误:

'不支持Declare SQL 结构或语句'

如果我删除 Declare 语句,我会收到错误:

'不支持 Set SQL 构造或语句'

有解决办法吗?

谢谢。

【问题讨论】:

  • NeverNEVER NEVER 构建这样的查询字符串。

标签: sql visual-studio tableadapter


【解决方案1】:

这样的:

SET @SQL = @SQL + ' AND addLine1 = ''' + @ApexLine1 + ''''

邪恶。不要这样做。像@ApexLine1 这样的变量可以包含任何东西,甚至是这样的:

';DROP TABLE dbAddress--

仔细考虑如果有人在您的地址行 1 字段中输入类似内容会发生什么。这里唯一正确的解决方案是使用内置的sp_executesql 存储过程。学习它,使用它。

除此之外,我认为您的问题至少有一部分可能是您的 @SQL 变量只有 255 个字符。您的查询很可能空间不足。

【讨论】:

  • 我不太担心 SQL 注入问题,因为参数不是从文本框或任何东西获取的。它们是从后面代码中的另一个数据库中提取的。此外,这是一个本地 Intranet 应用程序,我们公司以外的任何人都无法访问。这只是一个测试查询,一旦工作,255 个字符将被解除,但这不是问题。
  • 从另一个数据库中提取它们并不重要。它仍然存在注入风险(二阶注入),因为 那个 数据库很可能是在某处手动填充的。而“本地 Intranet”绝不是借口——大多数攻击都是在工作内部进行的。即使这些是正当的借口,为什么不做对呢?这并不难。您对该查询所做的操作完全是错误
  • 点了。我将采取必要的步骤进行修复。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2022-01-24
相关资源
最近更新 更多