2017-11-29 11 views
0

データベースからオブジェクトを保存および取得します。私はC#のコードを以下のように保存するように書いて、うまくいきました。これで、オブジェクトをデータベースに保存できます。SQL Serverデータベースに保存されたバイナリからC#オブジェクトを取得します。

ReportObject ro = new ReportObject() 
{ 
    Name = ctrl.Name, 
    BackColor = ctrl.BackColor, 
    ForeColor = ctrl.BackColor, 
    Fonts = ctrl.Font, 
    TypeofControl = ctrl.GetType() 
}; 

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

sw.Write(ro); 

string sql = "INSERT INTO [TemplateDetails] ([Object]) VALUES (@Object)"; 

SqlCommand cmd = new SqlCommand(sql, con, tran); 
cmd.Parameters.Add("@Object", SqlDbType.VarBinary, Int32.MaxValue); 
cmd.Parameters["@Object"].Value = memStream.GetBuffer(); 

cmd.ExecuteNonQuery(); 

SQL Serverデータベースには、すでにReportObjectのC#オブジェクトが保存されています。私はそれをC#オブジェクトに戻したいと思います。

string sql = "SELECT [Object] FROM [TemplateDetails]" 

SqlDataReader dr = db.Reader(sql); 

if (dr.Read()) 
{ 
byte[] arrays = (byte[])dr["Object"]; 
} 
+0

代わりにバイナリシリアル化を使用してください。 –

+0

'StreamWriter.Write(Object)'はオブジェクトの 'ToString()'メソッドを呼び出します。型名以外のものを返すようにオーバーライドしましたか? – Amy

+0

@Amyいいえ、私はToString()をオーバーライドしませんでした –

答えて

0

私は自分自身で問題を解決しました。 firstバイト配列にシリアル化し、データベースに保存します。

enter ReportObject ro = new ReportObject() 
    { 
     Name = ctrl.Name, 
     BackColor = ctrl.BackColor, 
     ForeColor = ctrl.BackColor, 
     Fonts = ctrl.Font, 
     TypeofControl = ctrl.GetType() 
    }; 

    MemoryStream memorystream = new MemoryStream(); 
    BinaryFormatter bf = new BinaryFormatter(); 
    bf.Serialize(memorystream, ro); 
    byte[] yourBytesToDb = memorystream.ToArray(); 

バイト配列としてデータベースから取得した後。デシリアライズしてオブジェクトに変換します。

MemoryStream memorystreamd = new MemoryStream(arrBytes); 
BinaryFormatter bfd = new BinaryFormatter(); 
ReportObject deserializedReportObject = bfd.Deserialize(memorystreamd) as ReportObject; 
関連する問題