programing

SQL Server 데이터베이스에 'Object'를 저장할 수 있습니까?

jooyons 2023. 10. 27. 21:53
반응형

SQL Server 데이터베이스에 'Object'를 저장할 수 있습니까?

SQL Server 2005에서 객체(어떤 유형이든)를 데이터베이스의 필드에 저장하고자 합니다.가능합니까?객체를 예를 들어 바이트 배열과 같은 것으로 변환하고 검색할 때 다시 캐스트해야 합니까?

사용할 수 있습니다.VARBINARY(MAX)원하는 경우 SQL Server의 필드 유형을 입력합니다.최대 2GB 크기의 모든 유형의 개체를 저장할 수 있습니다.

접속하려면 ADO를 사용하면 됩니다.NET - 다음과 같은 것:

object yourMysteryObject = (whatever you like it to be);

MemoryStream memStream = new MemoryStream();
StreamWriter sw = new StreamWriter(memStream);

sw.Write(yourMysteryObject);

SqlCommand sqlCmd = new SqlCommand("INSERT INTO TableName(VarBinaryColumn) VALUES (@VarBinary)", sqlConnection);

sqlCmd.Parameters.Add("@VarBinary", SqlDbType.VarBinary, Int32.MaxValue);

sqlCmd.Parameters["@VarBinary"].Value = memStream.GetBuffer();

sqlCmd.ExecuteNonQuery();

마크

JSON을 사용하여 객체를 문자열로 변환하고 VARCHAR 또는 TEXT 필드에 저장합니다.데이터는 사람이 읽을 수 있는 형식으로 저장될 뿐만 아니라, 거의 모든 주류 언어에는 JSON 파서가 사용 가능하기 때문에 여러 언어에서 읽을 수도 있습니다.

제가 올린 링크에는 여러 언어(C# 포함)로 된 여러 라이브러리의 링크가 있는데, 예전에 몇 번 사용한 적이 있습니다.

Entity Framework(EF)를 사용하는 경우의 예는 다음과 같습니다.

using (DbContext db = new DbContext())
{
    // The object that you want to serialize. In this case it is just an empty instance
    YourObject objectToSerialize = new YourObject();
    IFormatter formatter = new BinaryFormatter();
    using (MemoryStream stream = new MemoryStream())
    {
        formatter.Serialize(stream, objectToSerialize);

        // EF model. In one of its properties you store the serialized object
        YourModel modelObject = new YourModel();

        // In your model 'SerializedObject' should be of type byte[]. In the database it should be of type varbinary(MAX)
        modelObject.SerializedObject = stream.ToArray(); 
        db.YourModel.Add(modelObject);
        db.SaveChanges();
    }
}

다음은 개체의 직렬화를 해제하는 방법입니다.

// De-serialize
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream(serializedObject);
YourObject deserializedYourObject = (YourObject)formatter.Deserialize(stream);
stream.Close();

다른 사람들이 말했듯이, 여기서는 직렬화가 핵심일 수 있습니다(ORM을 사용하여 속성을 테이블의 열로 저장하고 싶지 않다고 가정하면 훨씬 더 직접적으로 보입니다).

그러나 몇 가지 주의 사항: 데이터베이스는 다음과 같습니다.

  • 장기 보관
  • 당신과 관련이 없습니다.NET코드

따라서 플랫폼별 또는 버전별 직렬화 기법을 사용하지 않을 수 있습니다.당신은 사람들이 언급하는 것을 자주 볼 것입니다.BinaryFormatter저항력이 필요하지만, 이것은 위의 두 가지 함정에 모두 해당합니다.플랫폼을 변경하거나 일부 속성만 변경해도 문제가 발생할 수 있습니다.

구현에 독립적인 접근 방식이 필요합니다. 가장 간단한 것(인간이 읽을 수 있는 기능도 보유)은 xml 또는 json입니다.XmlSerializer아니면 Json.NET(에 저장됨)[n]varchar(max)사람이 읽을 수 있는 것을 신경쓰지 않는다면, "protocol buffer" (fast/binary)가 좋을 것입니다 (a에 저장됨).varbinary(max), 및 C#/을 포함한 대부분의 플랫폼에서 사용할 수 있습니다.NET/등).

이렇게 하려면 개체를 직렬화해야 합니다.여기서 예를 살펴볼 수 있습니다.

http://www.c-sharpcorner.com/UploadFile/bipinjoshi/serializingObjectsinCS11102005234746PM/serializingObjectsinCS.aspx

언급URL : https://stackoverflow.com/questions/1299410/can-i-save-an-object-in-a-sql-server-database

반응형