[英]Unable to create dynamic sql query in asp.net C#
我一直在
将varchar值'46434,15864'转换为数据类型int时,转换失败。
我有这个texbox可以接受数字和逗号。 我需要在(46434,15864)中使用emp_num创建查询,例如语法。
从codebehind生成的查询是这样的,它可以在sql服务器中手动正常运行:
SELECT * -- column names
FROM [DBO].[tablename] LPR
WHERE LPR.[EMPLOYEE_NUMBER] in (46434,15864)
码:
if (txtEmpNum.Text.Trim() != "")
{
////sb.Append(" and LPR.[EMPLOYEE_NUMBER] like '%'+ @empnumber + '%' ");
sb.Append(" and LPR.[EMPLOYEE_NUMBER] in (@empnumber) ");
cmd.Parameters.Add("@empnumber", SqlDbType.VarChar).Value = txtEmpNum.Text.Trim(); //.Replace("," , "','");
}
cmd.CommandText = sb.ToString();
DataTable dt = GetData(cmd);
gvdetails.DataSource = dt;
gvdetails.DataBind();
您需要一个split函数来从字符串创建列表。 您可以一次运行此脚本来创建该函数:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[fnSplitString]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(splitdata NVARCHAR(MAX)
)
BEGIN
set @delimiter = coalesce(@delimiter, dbo.cSeparador());
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitdata)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
现在您的查询将是:
SELECT *
FROM [DBO].[tablename] LPR
WHERE LPR.[EMPLOYEE_NUMBER] in (select * from fnSplitString(@empnumber, ','))
您可以从C#中调用它,就像调用原始代码一样。
您将必须参数化每个值。 这样,您将动态创建查询,但不容易使用SQL Inject此处的代码:
//where IN part of your query
string inClause = "and LPR.[EMPLOYEE_NUMBER] in ({0})";
// string arrays for values and variables of your query
string[] paramValues = txtEmpNum.Text.Trim().Split(',');
string[] paramVars = paramValues.Select((s, i) => "@empNo" + i.ToString()).ToArray();
//create query, ie. and LPR.[EMPLOYEE_NUMBER] in (@empNo0, @empNo1...)
inClause = string.Format(inClause, string.Join(", ", paramVars));
//add vars and values to command
for (int i = 0; i < paramVars.Length; i++)
{
cmd.Parameters.Add(paramVars[i], SqlDbType.Int).Value = paramValues[i];
}
基本上错误是说您的变量@empnumber
是varchar
和LPR.[EMPLOYEE_NUMBER]
是整数
您可以将文本框的值附加到查询中。
编辑:正如其他人所建议的那样,这很容易发生SQL注入。 Marc Guillot和Nino解决方案更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.