0

我有一个如下的 sql 查询:

Select CatId 
From tbl_T2H_Category 
Where Category IN ('Category3', 'Category4', 'Category6')

现在我想要的是 IN 子句中的值应该从复选框列表中动态添加。我从我的控件中获取逗号分隔的值并将其传递给 sql 查询,如下所示:

string mystring = "Category3,Category4,Category6";
cmd.commanText = "Select CatId From tbl_T2H_Category Where Category IN (" + mystring + ")";

这不是在 sql 端执行的,因为 sql 仅识别位于 "'" "'" (单引号)内的字符串。请帮我编写适当的查询。

4

6 回答 6

5

您想使用表值参数。此处显示的 MSDN 文章比我做得更好:

http://msdn.microsoft.com/en-us/library/bb675163.aspx

于 2013-06-11T14:23:43.540 回答
2

正确的语法

string mystring = "'Category3','Category4','Category6'";
cmd.commanText = "Select CatId From tbl_T2H_Category Where Category IN (" + mystring + ")";

但请不要使用它。你可以像下面这样使用它(但也不推荐这样做)

cmd.commanText = "Select CatId From tbl_T2H_Category Where Category IN ('" + cat_1 + "','" + cat_2 + "','" + cat_3 + "')";

我会在下面使用这个,它很安全

string commandText = "Select CatId From tbl_T2H_Category Where Category IN (@cat_1,@cat_2 @cat_3)";
 SqlCommand command = new SqlCommand(commandText, connection);
 command.Parameters.Add("@cat1", SqlDbType.Varchar);
 command.Parameters["@cat1"].Value = "category1";
 command.Parameters.Add("@cat2", SqlDbType.Varchar);
 command.Parameters["@cat2"].Value = "category2";
 command.Parameters.Add("@cat3", SqlDbType.Varchar);
 command.Parameters["@cat3"].Value = "category3";

最后一个非常安全,它可以防止sql注入

于 2013-06-11T14:30:00.970 回答
1

最好使用Table-Valued Parameters来处理。

您的第一步是创建类型:

CREATE TYPE dbo.StringList AS TABLE (Value NVARCHAR(MAX) NOT NULL);

您的下一步是在 c# 中从逗号分隔列表创建一个数据表,以传递给您的 SqlCommand:

string mystring = "Category3,Category4,Category6";
string[] myarray = mystring.Split(",".ToCharArray());

DataTable table = new DataTable();
table.Columns.Add("Value", typeof(string));

for (int i = 0; i < myarray.Length; i++)
{
    var row = table.NewRow();
    row[0] = myarray[i];
    table.Rows.Add(row);
}

最后,您可以将其传递给您的 SqlCommand:

cmd.commanText = "Select CatId From tbl_T2H_Category Where Category IN (SELECT Value FROM @Strings)";
cmd.Parameters.Add(new SqlParameter("@Strings", SqlDbType.Structured)).Value = table;
于 2013-06-11T14:30:53.860 回答
0

Try this...

public String returnCategories(string categories) 
    {
        string categoriesConc = "";

        string[] split = categories.Split(',');

        for (int i = 0; i < split.Length; i++) 
        {
            if (string.IsNullOrEmpty(categoriesConc))
            {
                categoriesConc = split[i].ToString();
            }
            else 
            {
                categoriesConc = categoriesConc + "," + split[i].ToString();
            }
        }

        return categoriesConc;
    }
于 2013-06-11T14:39:10.390 回答
0

只需用单引号将每个类别包装在字符串中?

就像是

var mystring = "'Category3','Category4','Category6'"
于 2013-06-11T14:22:53.943 回答
0

将您的逗号分隔值拆分为一个数组

 string[] myArr = commaSepString.Split(',');

然后用逗号将它们连接起来,用这样的逗号包围

 string newString = "'"+myArr.Join("','")+"'";
于 2013-06-11T14:24:13.070 回答