C#插入并检索模型对象作为BLOB往/返数据库

时间:2016-07-14 17:48:02

标签: c# asp.net-mvc-4 oop blob

无处不在我问这个关于C#的问题,我只是得到图像和文件的答案。我想将一个对象作为BLOB而不是图像从一个asp.net应用程序存储到数据库中,并从另一个应用程序中检索它。

我们说我有一个模型Person

public class Person
{
    public int userID { set; get; }
    public string userName { get; set; }
    public string lastName { get; set; }
    public string firstName { get; set; }
    public string email { get; set; }

    public List<int> someAttr { get; set; }
    public List<int> otherAttr { get; set; }

    public List<SomeModel> modelAttr { get; set; }
    public List<AnotherModel> modelAttr2 { get; set; }
}

此模型不仅具有常规数据类型值,还包含一些List(数组)以及其他特定模型类型数据(SomeModelAnotherModel)。出于这个原因,我需要将此模型的对象存储到数据库中并从另一个应用程序中检索它,因为会话变量在不同的asp.net应用程序之间来回导航时丢失。

现在我的目标是:

Person p1 = *Retrieve data from database, and store it to p1*

我试图将p1存储在数据库中,其所有值都保持不变,这样当我从第二个asp.net mvc应用程序中检索它时,我可以像p1.userName一样使用它,{{1然后是循环中的列表,如:

p1.email

我找到了各种资源来执行此操作,但使用的是图像文件。它们与我的场景不匹配,所以我发布了这个问题。

http://www.c-sharpcorner.com/uploadfile/Ashush/working-with-binary-large-objects-blobs/ http://www.aspsnippets.com/Articles/Read-and-Write-BLOB-Data-to-SQL-Server-database-using-C-and-VBNet.aspx

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用此PersonRepository类来实现此目的,该类将使用JSON中的序列化版本将对象存储在SQL数据库中。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;

namespace StackOverflow
{
    #region Models
    public class Person
    {
        public int userID { set; get; }
        public string userName { get; set; }
        public string lastName { get; set; }
        public string firstName { get; set; }
        public string email { get; set; }
        public List<int> someAttr { get; set; }
        public List<int> otherAttr { get; set; }

        public List<SomeModel> modelAttr { get; set; }
        public List<AnotherModel> modelAttr2 { get; set; }
    }
    public class SomeModel
    {
        public int SomeProperty { get; set; }
    }
    public class AnotherModel
    {
        public string AnotherProperty { get; set; }
    }
    #endregion

    public class PersonRepository
    {
        // Before you can use this repository you need to setup a Person table to store your objects
        // CREATE TABLE Person (UserID int primary key, PersonObject text)

        private string _dbConnectionString;
        public PersonRepository(string dbConnectionString)
        {
            this._dbConnectionString = dbConnectionString;
        }

        public void WriteToDatabase(Person p)
        {
            using (var conn = new SqlConnection(_dbConnectionString))
            {
                conn.Open();
                using (var command = conn.CreateCommand())
                {
                    // Serialize the person object to JSON to store in the database
                    var personJson = JsonConvert.SerializeObject(p);

                    command.CommandText = "INSERT INTO Person (UserID, PersonObject) values (@UserId, @PersonObject)";
                    command.Parameters.Add(new SqlParameter("@UserID", p.userID));
                    command.Parameters.Add(new SqlParameter("@PersonObject", personJson));

                    // Execute the SQL command to insert the record
                    command.ExecuteNonQuery();
                }
            }
        }

        public Person ReadFromDatabase(int userId)
        {
            using (var conn = new SqlConnection(_dbConnectionString))
            {
                conn.Open();
                using (var command = conn.CreateCommand())
                {
                    command.CommandText = "SELECT PersonObject from Person where UserID = @UserID";
                    command.Parameters.AddWithValue("@UserID", userId);

                    using (var reader = command.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            // Read out the JSON respresentation of the Person object
                            var personJson = reader.GetString(0);

                            // Deserialize it back into a Person object. Note you will have to deal with versioning issues.
                            return JsonConvert.DeserializeObject<Person>(personJson);
                        }
                        else
                            throw new ApplicationException($"No person found with user ID {userId}");
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

简而言之,您可以将它们保存为Json或Xml格式,甚至可以在二进制Json / Xml中序列化,但处理CRUD操作并不简单。

<强>但

BLOB是存储在数据库中的二进制数据类型,如图像/音频,目前,它们作为文件流保存在MS SQL Server中。

List someAttr,List modelAttr等数据被视为集合,可以通过其外键访问(不能被视为Blob) 在Entity Framework中,您可以使用“Include”检索它们,例如:

var modelAttr = MyEntitiy.Person.Include(r =&gt; r.modelAttr)

在OData中,您可以通过“Expand”关键字获得 因此,在使用许多ORM框架,OData和Rest服务的CRUD操作中,可以轻松地在单独的实体中保存集合。