把哈希表存储到数据库中
2008-09-25 02:42
197 查看
最近有个项目可能会把一些复合对象比如哈希表存储到数据库中,就提前做了一些测试
一般图片,文件等存储到数据库中都是要先转换成字节流byte[]类型的。我想这个hastable之类的集合对象也不例外
但是就是怎么转换的时候感觉难搞,最后终于是整理出了一个二进制转换帮助类,代码如下
// <summary>
///BinaryHelper 的摘要说明
///二进制转换帮助类,一个是对象转换成byte,一个反过来
/// </summary>
public class BinaryHelper
{
private BinaryHelper()
{
}
public static byte[] BinarySerialize(object o)
{
if (o == null)
throw new ArgumentNullException("o");
else
{
MemoryStream ms = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, o);
byte[] bs = ms.GetBuffer();
ms.Seek(0, SeekOrigin.Begin);
return bs;
}
}
public static object BinaryDeserialize(byte[] bs)
{
if (bs == null)
throw new ArgumentNullException("bs");
else
{
IFormatter formatter2 = new BinaryFormatter();
MemoryStream ms2 = new MemoryStream();
ms2.Write(bs, 0, bs.Length);
ms2.Seek(0, SeekOrigin.Begin);
return formatter2.Deserialize(ms2);
}
}
}
代码不多,运行的时候还要分别添加几个using命名空间,大家研究一下就明白了
然后就是设计一个数据表,我简单设置一个表HS(ID,Content)(sql2005数据库)
其中Content存储字节,我刚开始使用varbinary(50),第一次插入报错字节被截断了,应该是长度不够
后了设置成varbinary(max),其实不是很理解max,我感觉这个max应该是根据你插入的数据而变化的,当然使用image类型也可以。
下面是两个方法,一个是添加到数据库中,一个是从数据库读取
//添加到数据库
protected void Button1_Click(object sender, EventArgs e)
{
Hashtable table = new Hashtable();
table.Add("a", "aa");
table.Add("b","bb");
table.Add("c","cc");
byte[] bb = BinaryHelper.BinarySerialize(table);
string sql = "insert HS(Content) values(@Content)";
List<SqlParameter> list = new List<SqlParameter>();
list.Add(new SqlParameter("@Content", bb));
SQLHelper.ExecuteNonQuery(SQLHelper.ConnectionString, CommandType.Text, sql, list.ToArray());
}
//从数据库读取
protected void Button2_Click(object sender, EventArgs e)
{
string sql = "select Content from HS where ID = (select max(ID) from HS) ";
object o = SQLHelper.ExecuteScalar(SQLHelper.ConnectionString, CommandType.Text, sql);
if (o != null)
{
Hashtable ht = (Hashtable)BinaryHelper.BinaryDeserialize((byte[])o);
if (ht != null)
{
string ss = string.Empty;
foreach (string s in ht.Keys)
{
ss += s + ":" + ht[s].ToString() + "</br>";
}
Page.Response.Write(ss);
}
}
}
本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。
一般图片,文件等存储到数据库中都是要先转换成字节流byte[]类型的。我想这个hastable之类的集合对象也不例外
但是就是怎么转换的时候感觉难搞,最后终于是整理出了一个二进制转换帮助类,代码如下
// <summary>
///BinaryHelper 的摘要说明
///二进制转换帮助类,一个是对象转换成byte,一个反过来
/// </summary>
public class BinaryHelper
{
private BinaryHelper()
{
}
public static byte[] BinarySerialize(object o)
{
if (o == null)
throw new ArgumentNullException("o");
else
{
MemoryStream ms = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, o);
byte[] bs = ms.GetBuffer();
ms.Seek(0, SeekOrigin.Begin);
return bs;
}
}
public static object BinaryDeserialize(byte[] bs)
{
if (bs == null)
throw new ArgumentNullException("bs");
else
{
IFormatter formatter2 = new BinaryFormatter();
MemoryStream ms2 = new MemoryStream();
ms2.Write(bs, 0, bs.Length);
ms2.Seek(0, SeekOrigin.Begin);
return formatter2.Deserialize(ms2);
}
}
}
代码不多,运行的时候还要分别添加几个using命名空间,大家研究一下就明白了
然后就是设计一个数据表,我简单设置一个表HS(ID,Content)(sql2005数据库)
其中Content存储字节,我刚开始使用varbinary(50),第一次插入报错字节被截断了,应该是长度不够
后了设置成varbinary(max),其实不是很理解max,我感觉这个max应该是根据你插入的数据而变化的,当然使用image类型也可以。
下面是两个方法,一个是添加到数据库中,一个是从数据库读取
//添加到数据库
protected void Button1_Click(object sender, EventArgs e)
{
Hashtable table = new Hashtable();
table.Add("a", "aa");
table.Add("b","bb");
table.Add("c","cc");
byte[] bb = BinaryHelper.BinarySerialize(table);
string sql = "insert HS(Content) values(@Content)";
List<SqlParameter> list = new List<SqlParameter>();
list.Add(new SqlParameter("@Content", bb));
SQLHelper.ExecuteNonQuery(SQLHelper.ConnectionString, CommandType.Text, sql, list.ToArray());
}
//从数据库读取
protected void Button2_Click(object sender, EventArgs e)
{
string sql = "select Content from HS where ID = (select max(ID) from HS) ";
object o = SQLHelper.ExecuteScalar(SQLHelper.ConnectionString, CommandType.Text, sql);
if (o != null)
{
Hashtable ht = (Hashtable)BinaryHelper.BinaryDeserialize((byte[])o);
if (ht != null)
{
string ss = string.Empty;
foreach (string s in ht.Keys)
{
ss += s + ":" + ht[s].ToString() + "</br>";
}
Page.Response.Write(ss);
}
}
}
本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。
相关文章推荐
- 数据库存储管理
- 字段、数据库表-三大范式及存储方式-by小雨
- 添加之前查询数据库是否已经添加过(去空格后存储到数据库)!
- 购物车的实现及Cookie,session,数据库存储的优缺点
- Android数据库高手秘籍(五)——LitePal的存储操作
- sqlserver查询数据库中包含某个字段的所有表和所有存储过程
- Session存储在数据库
- 解决数据库存储和查询中的乱码问题
- 【Android 开发】:数据存储之 SQLite 数据库操作(二)
- 关系型数据库存储树的一种方式
- 使用MyEclipse中用Hibernate反向工程生成的DAO会发生对象无法存储到数据库的现象,原因是没有运用事务。
- C#连接Oracle数据库通过存储过程操作数据库
- 数据库中存储文件路径问题
- 数据库中存储Session信息
- 返回数据库数据的存储过程函数(5个参数)(SQL Server)
- 怎么把上传的图片路径动态的存储在数据库中啊
- 树型结构数据在数据库基本表中的存储及维护
- 第16天(就业班) 数据约束、数据库设计、关联查询、存储过程、权限和备份
- Hibernate的调用数据库的存储过程
- 简单的数据存储——plist、NSKeyedArchiver归档、NSUserDefaults(偏好设置)、SQLite(嵌入式数据库)