【发布时间】:2015-07-10 16:33:11
【问题描述】:
我似乎无法在网上找到一个很好的例子。我想要做的是将多选列表框的所有值传递到 SQL 存储过程中以将它们写入表。
我知道如果我想将一个选定的值传递给 SQL,我会这样做:
C#:
using (SqlCommand cmd = new SqlCommand("sp_RegisterUser", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
cmd.Parameters.Add("@UserPreferences", SqlDbType.Char).Value = MatchPrefs.SelectedValue;
cmd.Parameters.Add("@UserName", SqlDbType.Char).Value = UserName.Text;
conn.Open();
cmd.ExecuteNonQuery();
SQL:
ALTER PROCEDURE [dbo].[sp_RegisterUser]
@UserPreferences varchar(max),
@UserName varchar(25)
AS
BEGIN
INSERT INTO tmpUserMatch (
UserID,
MatchField,
MatchValue
)
VALUES (
(SELECT Top 1 UserID FROM tmpUsers WHERE UserName = @UserName),
'MatchPreferences',
@UserPreferences
)
END
但是如果 MatchPrefs 是多选,我该怎么做呢?
编辑
通过替换,我将 C# 部分关闭:
cmd.Parameters.Add("@UserPreferences", SqlDbType.Char).Value = MatchPrefs.SelectedValue;
与:
var selectedInterests = MatchPrefs.Items.Cast<ListItem>().Where(item => item.Selected).Select(item => item.Value).ToList();
string strInterests = String.Join(",", selectedInterests).TrimEnd();
cmd.Parameters.Add("@UserPreferences", SqlDbType.Char).Value = strInterests;
在 SQL 端,我有一个函数将创建一个表值参数:
SELECT * FROM dbo.CSVToTable(@UserPreferences)
只需要一些帮助来完成我需要包含的 2 个附加字段的 SQL 方面; UserID 和 MatchField。
【问题讨论】:
-
您想查看 ADO.NET 中的结构化参数以及 SQL Server SP 中的等效表值参数。基本上,它允许您将强类型的对象列表推送到 SQL Server SP/查询。这里和互联网上有很多例子。
-
那么如何使用我需要添加到 SQL 表(UserID 和 MatchField)的 2 个附加字段来完成?
-
附带说明,您应该避免使用 sp_ 前缀,因为它是微软保留的,可能会导致一些性能问题。 sqlperformance.com/2012/10/t-sql-queries/sp_prefix 或者事件更好,完全去掉前缀。
-
我将参数作为 XML 传递。您可以在您的应用程序中以多种不同的方式创建它,并且在 SQL 中处理 XML 相当容易。这为您提供了最佳的灵活性...
标签: c# sql asp.net sql-server multi-select