【问题标题】:How to Store a User-defined Class Object in Sql Server 2008 using C#? [duplicate]如何使用 C# 在 Sql Server 2008 中存储用户定义的类对象? [复制]
【发布时间】:2012-12-17 10:49:24
【问题描述】:

可能重复:
Save byte[] into a SQL Server database from C#

我有一个名为 LeaveDetails.cs

的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace LeaveMgmt_14dec
{
    [Serializable]
    public class LeaveDetails
    {
        public string date;
        public string leave_type;
    }
}

然后创建了一个 LeaveDetails 类的对象列表。

List<LeaveDetails> Details = new List<LeaveDetails>();

现在我将其序列化并存储在数据库中,即 Microsoft SQL Server 2008。

BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, Details);

            //Saving to db
            SqlConnection con = new SqlConnection("Data Source=IND492\\SQLEXPRESS;Initial Catalog=LeaveMgmt;Integrated Security=True");
            {
                SqlCommand cmd = new SqlCommand("insert into LeaveDetailsTable values (@leave_details)", con);
                con.Open();
                byte[] bytes = new byte[ms.Length];
                ms.Write(bytes, 0, bytes.Length);
                cmd.Parameters.AddWithValue("@leave_details", bytes);

                cmd.ExecuteNonQuery();
            }

现在我对在数据库中存储时应该选择哪种数据类型有疑问? 其实我用的表 LeaveDetailsTable(L_ID int , leave_details nvarchar(50))

但是从数据库中检索时显示错误

System.InvalidCastException:无法将“System.String”类型的对象转换为“System.Byte[]”类型。

从数据库中检索的代码是:

SqlConnection con = new SqlConnection("Data Source=IND492\\SQLEXPRESS;Initial Catalog=LeaveMgmt;Integrated Security=True");
            {
                SqlCommand cmd = new SqlCommand("select leave_details from LeaveDetailsTable where L_ID=1", con);
                con.Open();
                byte[] bytes = (byte[])cmd.ExecuteScalar();

                BinaryFormatter bf = new BinaryFormatter();
                MemoryStream ms = new MemoryStream(bytes);
                ms.Position = 0;
                List<LeaveDetails> mc = (List<LeaveDetails>)bf.Deserialize(ms);
}

【问题讨论】:

  • 现在我将表格更改为 LeaveDetailstable(L_ID int , leave_details varbinary(MAX))。但它在反序列化代码中显示错误为“二进制流'0'不包含有效的BinaryHeader。可能的原因是无效的流或序列化和反序列化之间的对象版本更改”。变化?

标签: c# asp.net sql-server database visual-studio-2010


【解决方案1】:

嗯,你可以阅读,所以应该很明显,或者?

System.InvalidCastException:无法将“System.String”类型的对象转换为类型 'System.Byte[]'。

序列化(标准,不是 XML / XAML)是二进制的。因此,varchar 不起作用。使用 varbinary。 Varbinary 作为字节数组返回。

【讨论】:

  • 现在,错误是“二进制流 '0' 不包含有效的 BinaryHeader。可能的原因是无效的流或序列化和反序列化之间的对象版本更改。”
  • 如果您告诉我代码中的问题在哪里,那将更有帮助。谢谢!!
  • @developer 老兄,这是一个问答网站,不是咨询网站。你问了一个问题,得到了答案。想问另一个问题,制作代码示例并提出问题。作为提示 - 首先进行单元测试(总是好的)并比较您写入和输出的数组。
猜你喜欢
  • 1970-01-01
  • 2011-01-30
  • 2015-11-04
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
相关资源
最近更新 更多