我正在使用ASP MVC和存储过程(SQL Server)开发项目,我想在数据库中存储已选中的复选框项。我试图在模型中添加List<string>
类型以访问这些值,然后将它们存储在数据库中。
关系数据库专门设计用于存储每行/列组合一个值的问题。为了存储多个值,我必须将列表序列化为单个存储值,然后在检索时对其进行反序列化。
这是我的观点标记:
<h6>Items</h6>
<ul>
<li>
<label class="anim">
<input type="checkbox" class="checkbox" value="Soups" name="Items">
<span>Soups</span>
</label>
</li>
<li>
<label class="anim">
<input type="checkbox" class="checkbox" value="Burger" name="Items" >
<span>Burger</span>
</label>
</li>
<li>
<label class="anim">
<input type="checkbox" class="checkbox" value="Drinks" name="Items">
<span>Drinks</span>
</label>
</li>
<li>
<label class="anim">
<input type="checkbox" class="checkbox" value="Desserts" name="Items">
<span>Desserts</span>
</label>
</li>
</ul>
方法AddBestellung
:
try
{
using (SqlConnection con = new SqlConnection(Connection()))
{
using (SqlCommand cmd = new SqlCommand("AddNewBestellung", con))
{
foreach(var item in bs.Items)
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Items", item);
}
// Another saved parameters...
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i >= 1)
return true;
else
return false;
}
}
}
catch(Exception ex)
{
string e = ex.Message;
return false;
}
private static string Connection()
{
return ConfigurationManager.ConnectionStrings["deliverycon"].ToString();
}
型号:
public List<string> Items { get; set; }
答案 0 :(得分:1)
你不应该序列化/反序列化。之后使用会很痛苦。
想象一下,您需要检索已检查项目1和5的对象。 如果将其序列化为字符串,那么将其存储起来的效率和效率都会降低。
让我们说你有一个&#34; Person&#34;表,你想检查&#34;控制台&#34;他们拥有。
您将拥有表人:
和表控制台
和存储控制台的表:
<强> owned_console 强>
在您的代码中,您将为每个选中的复选框插入一条记录。
人:
控制台:
owned_console:
(1)(3)
(2)(1)
然后你可以做以下事情:
SELECT *
FROM person p
INNER JOIN owned_console oc
ON p.id = oc.person_id
WHERE oc.console_id IN (3,1);
答案 1 :(得分:0)
标志枚举 -
[Flags]
public enum ItemStorage
{
Soups = 1,
Burger = 2,
Drinks = 4,
Dessert = 8,
Cheese = 16
}
我添加了奶酪只是为了强调Flags枚举的二元性质。
这是您的其他代码 -
public class Stuff
{
private List<string> Items;
private static string Connection()
{
return ConfigurationManager.ConnectionStrings["deliverycon"].ToString();
}
public bool DoStuff()
{
try
{
using (SqlConnection con = new SqlConnection(Connection()))
{
using (SqlCommand cmd = new SqlCommand("AddNewBestellung", con))
{
cmd.Parameters.AddWithValue("@Items", (int)ConstuctEnumValueFromList(Items));
//other saved parameters...
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i >= 1)
return true;
else
return false;
}
}
}
catch (Exception ex)
{
string e = ex.Message;
return false;
}
}
private ItemStorage ConstuctEnumValueFromList(List<string> list)
{
var result = new ItemStorage();
if (list.Any())
{
var separatedList = string.join(",", list)
bool success = Enum.TryParse<ItemStorage>(separatedList, out result)
}
return result;
}
}
在这种情况下,您可以简单地将Items字段存储为单个整数,并在检索时将其强制转换回ItemStorage -
int i = 1 + 2 + 4 + 8;
var items = (ItemStorage)i;
Console.WriteLine(items.ToString());
这应该给你 &#34;汤,汉堡,饮料,甜点&#34 ;;
答案 2 :(得分:0)
XML序列化
首先,确保您熟悉this document。此方法要求您将Items集合存储到SQL Server中的XML列。它还具有可以查询该列的优点,前提是您不必担心SQLXML和XPath。许多开发人员都是。
一旦你拥有了它,一切看起来都非常相似(如果有点简单)。
; Allow or prevent persistent links.
; http://php.net/mysql.allow-persistent
mysql.allow_persistent = Off
同样,将XML片段重新水化为您开始使用的php.ini
很容易。你只需使用
public class Stuff
{
private List<string> Items;
private static string Connection()
{
return ConfigurationManager.ConnectionStrings["deliverycon"].ToString();
}
public bool DoStuff()
{
try
{
using (SqlConnection con = new SqlConnection(Connection()))
{
using (SqlCommand cmd = new SqlCommand("AddNewBestellung", con))
{
cmd.Parameters.AddWithValue("@Items", ConstructXmlFromList(Items));
//other saved parameters...
con.Open();
int i = cmd.ExecuteNonQuery();
con.Close();
if (i >= 1)
return true;
else
return false;
}
}
}
catch (Exception ex)
{
string e = ex.Message;
return false;
}
}
public static T FromXML<T>(string xml)
{
using (var stringReader = new StringReader(xml))
{
var serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(stringReader);
}
}
public string ToXML<T>(T obj)
{
using (var stringWriter = new StringWriter(new StringBuilder()))
{
var xmlSerializer = new XmlSerializer(typeof(T));
xmlSerializer.Serialize(stringWriter, obj);
return stringWriter.ToString();
}
}
private string ConstructXmlFromList(List<string> list)
{
return ToXML(list);
}
}