VS TableAdapter查询配置向导中的SQL查询
我正在尝试在Visual Studio TableAdapter查询向导中编写SQL查询 我的SQL查询是:VS TableAdapter查询配置向导中的SQL查询,sql,visual-studio,tableadapter,Sql,Visual Studio,Tableadapter,我正在尝试在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 S
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 contruct或语句'
如果删除Declare语句,则会出现错误:
'不支持Set SQL构造或语句'
这有什么办法吗
谢谢。诸如此类:
SET @SQL = @SQL + ' AND addLine1 = ''' + @ApexLine1 + ''''
是邪恶的。不要这样做。像@ApexLine1这样的变量可以包含任何内容,甚至包括以下内容:
",;删除表dbAddress--
仔细考虑如果有人在您的地址行1字段中输入类似的内容会发生什么。这里唯一正确的解决方案是使用内置的sp_executesql
存储过程。学习它,使用它
除此之外,我认为至少部分问题可能是@SQL变量只有255个字符。很有可能您的查询空间不足。类似的内容:
SET @SQL = @SQL + ' AND addLine1 = ''' + @ApexLine1 + ''''
是邪恶的。不要这样做。像@ApexLine1这样的变量可以包含任何内容,甚至包括以下内容:
",;删除表dbAddress--
仔细考虑如果有人在您的地址行1字段中输入类似的内容会发生什么。这里唯一正确的解决方案是使用内置的sp_executesql
存储过程。学习它,使用它
除此之外,我认为至少部分问题可能是@SQL变量只有255个字符。很可能是您的查询空间不足。NeverNEVER从未构建过这样的查询字符串。NeverNEVER从未构建过这样的查询字符串。我不太担心SQL注入问题,因为参数不是从文本框或任何东西获取的。它们是从代码隐藏中的另一个数据库中提取的。此外,这是一个本地intranet应用程序,我们公司以外的任何人都无法访问。这只是一个测试查询,255个字符在工作后将被删除,但这不是问题所在。它们是否从另一个数据库中提取并不重要。这仍然是一个注入风险(二阶注入),因为该数据库可能是在某个地方手工填充的。“本地内联网”从来不是借口——大多数攻击都是在作业内部进行的。即使这些都是正当的借口,为什么不做对呢?这并不难。你对那个查询所做的是完全错误的。我明白了。我会采取必要的措施来修复。谢谢。我不太担心SQL注入问题,因为参数不是从文本框或任何东西获取的。它们是从代码隐藏中的另一个数据库中提取的。此外,这是一个本地intranet应用程序,我们公司以外的任何人都无法访问。这只是一个测试查询,255个字符在工作后将被删除,但这不是问题所在。它们是否从另一个数据库中提取并不重要。这仍然是一个注入风险(二阶注入),因为该数据库可能是在某个地方手工填充的。“本地内联网”从来不是借口——大多数攻击都是在作业内部进行的。即使这些都是正当的借口,为什么不做对呢?这并不难。你对那个查询所做的是完全错误的。我明白了。我会采取必要的措施来修复。非常感谢。