我希望基于ListBox中的多个值将SELECT
语句用于表中并获取多个ID,然后运行INSERT
语句并将多个ID存储到{{1}的不同表中声明。
我的代码无效,因为我得到了" NULL"单行而不是多行中的多个ID。
我正在为所有SQL语句使用存储过程。
请参阅下面的代码:
我的ASPX网页的代码隐藏:
INSERT
存储过程:
string listboxvalue = "";
foreach (ListItem item in listbox.Items)
{
if (item.Selected)
{
listboxvalue += item.Text + ',';
}
}
listboxvalue = listboxvalue.Substring(0, listboxvalue.Length - 1);
cmd.Parameters.AddWithValue("spselectvalue", listboxvalue);
答案 0 :(得分:1)
似乎您的问题是您不知道如何将ID列表添加到存储过程中进行处理。希望这个例子会有所帮助。如果你这样做,你就不必乱用逗号分隔的字符串或动态SQL。
首先,定义一个可以包含ID列表的SQL类型:
CREATE TYPE dbo.MyList
AS TABLE
(
ID VarChar(50)
);
然后,编写一个接受此类型作为其输入参数的存储过程:
CREATE PROCEDURE dbo.InsertAList
@List AS dbo.MyList READONLY
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[DifferentTable]
SELECT ID FROM @List
END
现在将数据绑定到c#end的存储过程。要绑定它,您必须先将数据存储在DataTable
中,这相对容易:
var table = new DataTable();
table.Columns.Add("ID", typeof(string));
foreach (ListItem item in listBox.Items.Where(i => i.Selected))
{
table.Rows.Add(item.Text);
}
然后将表格提交给存储过程,如下所示:
var cmd = new SqlCommand()
{
CommandType = CommandType.StoredProcedure,
CommandText = "InsertAList",
Connection = myConnection
};
cmd.Parameters.Add(new SqlParameter("@List", SqlDbType.Structured)
{
TypeName = "dbo.MyList",
Value = table
});
cmd.ExecuteNonQuery();
答案 1 :(得分:0)
这似乎不是一个有效的(或逻辑的)SQL。 * Initialized password authentication
* Authentication complete
* Failed to close libssh2 file
不应该在那里,或exec sp_executesql @Dis
不应该是一张桌子。
可以找到详细答案documentation。
另外:由于链接问题中提到的原因(以及那里提到的Erland Sommarskog博客),sp_executesql
行在按此方式编写时无法正常工作。
答案 2 :(得分:0)
选定的值视为数字。
DECLARE @Sqltext nvarchar(max) =
'INSERT INTO [dbo].[DifferentTable] ([SelectedIds])
SELECT DId
FROM [table name]
WHERE [COLUMN] IN (' + @spselectvalue + ')'
EXEC sp_executesql @Sqltext