我的网站中有一个listbox
项,其中selectionmode
为“多个”。我想在单击提交按钮时将所有选定项目插入到sql
服务器表格中的列。
这是我的listbox
项目。
<asp:TableCell>
<asp:ListBox ID="lbLanguagesKnown" runat="server" Height="217px"
SelectionMode="Multiple">
<asp:ListItem Selected="True" Value="-1">-Select Languages-</asp:ListItem>
<asp:ListItem Value="1">Arabic</asp:ListItem>
<asp:ListItem Value="2">Bengali</asp:ListItem>
<asp:ListItem Value="3">English</asp:ListItem>
<asp:ListItem Value="4">German</asp:ListItem>
<asp:ListItem Value="5">Hindi</asp:ListItem>
<asp:ListItem Value="6">Japanese</asp:ListItem>
<asp:ListItem Value="7">Javanese</asp:ListItem>
<asp:ListItem Value="8">Mandarin</asp:ListItem>
<asp:ListItem Value="9">Others</asp:ListItem>
<asp:ListItem Value="10">Portuguese</asp:ListItem>
<asp:ListItem Value="11">Russian</asp:ListItem>
<asp:ListItem Value="12">Spanish</asp:ListItem>
</asp:ListBox>
</asp:TableCell>
怎么可能?请帮忙。
答案 0 :(得分:5)
你可能不想这样做,因为你将破坏第一张普通形式。相反,将关系建模为多对多可能更有意义。
在这种情况下,您将拥有一个Languages
表,一个(例如)User
表,然后是junction table(例如LanguagesKnown
),它将多种语言链接到许多语言用户在联结表中为每一行使用两个外键。
答案 1 :(得分:2)
你可以使用一个简单的循环:
string sql = "INSERT INTO dbo.Language VALUES(@languageID, @languageName);";
using (var con = new SqlConnection(yourConnectionString))
using(var cmd = new SqlCommand(sql, con))
{
con.Open();
foreach (ListItem item in lbLanguagesKnown.Items)
{
cmd.Parameters.Clear();
if (item.Selected)
{
cmd.Parameters.AddWithValue("@languageID", int.Parse(item.Value));
cmd.Parameters.AddWithValue("@languageName", item.Text);
int insertedCount = cmd.ExecuteNonQuery();
}
}
}
我使用了sql-parameters来阻止sql注入。 using
- 语句用于确保连接尽快关闭(即使出现异常)。
然而,这项要求毫无意义。为什么要在用户选择masterdata时插入masterdata。听起来好像你真的想插入一个链接到语言表的不同表。
例如:
表1:UserLanguages
UserID
+ LanguageID
表2:Languages
以上型号
答案 2 :(得分:0)
将所有值组合在一起并将它们放入单列中并不是一个好的想法...如上所述,它甚至不满足数据规范化的1NF条件,结果是磁盘空间使用效率低,查询速度慢(根据我的理解,从这样的表中得到结果真是太乱了)。但是如果您仍然想要这样做,您可以尝试使用分隔符(或/)连接这些值并插入它们,以便在以后的阶段将其拆分出来。