繁体   English   中英

无法在ASP.NET C#中创建动态SQL查询

[英]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];
}

基本上错误是说您的变量@empnumbervarcharLPR.[EMPLOYEE_NUMBER]是整数

您可以将文本框的值附加到查询中。

编辑:正如其他人所建议的那样,这很容易发生SQL注入。 Marc Guillot和Nino解决方案更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM