Tôi muốn lưu một đối tượng (thuộc bất kỳ loại nào) vào một trường trong cơ sở dữ liệu trong SQL Server 2005. Có thể không? Tôi có phải chuyển đổi các đối tượng thành một cái gì đó, giống như một mảng byte ví dụ và đúc nó trở lại khi lấy nó?Tôi có thể lưu 'Đối tượng' trong cơ sở dữ liệu SQL Server không?
Trả lời
Bạn có thể sử dụng các loại VARBINARY(MAX)
trường trong SQL Server, nếu bạn muốn. Bạn có thể lưu trữ bất kỳ loại đối tượng nào trong đó, có kích thước tối đa là 2 GB.
Để truy cập vào nó, bạn có thể sử dụng ADO.NET - một cái gì đó như thế này:
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();
Marc
nhưng làm thế nào tôi có thể chuyển một đối tượng vào một loại VARBINARY? –
nhưng đây là một hình ảnh được đọc từ một tệp. Nếu tôi có một lớp hoặc một đối tượng được tạo ra trong thời gian chạy. Không có gì để làm với các tập tin. –
bất kỳ loại đối tượng nào có thể được ghi vào MemoryStream và do đó được gán cho giá trị của SqlParameter mà sau đó sẽ ghi nó vào cơ sở dữ liệu. –
Để thực hiện việc này, bạn cần phải sắp xếp lại đối tượng của mình. Bạn có thể tìm kiếm ở đây tại ví dụ:
Nhưng tôi không muốn lưu nó trên đĩa cứng. Tôi chỉ muốn đặt nó vào một databse. –
BinaryFormatter là một lựa chọn ** rất xấu ** để lưu trữ lâu dài. –
Như những người khác đã nói, serialization thể là chìa khóa ở đây (giả sử bạn không muốn sử dụng ORM để lưu trữ các thuộc tính dưới dạng các cột trong bảng, có vẻ trực tiếp hơn nhiều).
Một số cảnh báo mặc dù; một cơ sở dữ liệu là:
- lưu trữ lâu dài
- không liên quan đến mã NET của bạn
Như vậy, bạn không muốn sử dụng bất kỳ kỹ thuật serialization đó là nền tảng cụ thể hoặc phiên bản -riêng. Bạn sẽ thường thấy mọi người đề cập đến số BinaryFormatter
cho sự kiên trì, nhưng điều này rơi vào cả hai bẫy trên. Bạn sẽ bị lừa đảo nếu bạn thay đổi nền tảng, hoặc thậm chí nếu bạn chỉ cần change some properties.
Bạn cần một cách tiếp cận độc lập với triển khai; đơn giản nhất (cũng có khả năng đọc được con người) là xml hoặc json, có lẽ thông qua XmlSerializer
hoặc Json.NET (được lưu trữ trong một [n]varchar(max)
). Nếu bạn không quan tâm đến con người có thể đọc được, "bộ đệm giao thức" (nhanh/nhị phân) sẽ hoạt động tốt (được lưu trữ trong một varbinary(max)
), và là available for most platforms (bao gồm C# /. NET/etc).
Tôi sẽ sử dụng JSON để chuyển đổi đối tượng thành chuỗi và lưu trữ nó trong trường VARCHAR hoặc TEXT. Không chỉ dữ liệu được lưu trữ ở định dạng có thể đọc được của con người, nhưng nó cũng có thể đọc được từ các ngôn ngữ khác nhau, vì hầu hết mọi ngôn ngữ chính thống đều có sẵn một trình phân tích cú pháp JSON.
Liên kết tôi đăng có liên kết tới một số thư viện bằng nhiều ngôn ngữ (bao gồm cả C#), tôi đã sử dụng this one một vài lần trong quá khứ.
Thật không may, bây giờ bạn có liên kết chết đến trang web này. http://jayrock.berlios.de/ –
Cảm ơn, đã cập nhật liên kết. – Badaro
Dưới đây là một ví dụ nếu bạn đang sử dụng 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();
}
}
Và đây là cách để de-serialize các đối tượng:
// De-serialize
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream(serializedObject);
YourObject deserializedYourObject = (YourObject)formatter.Deserialize(stream);
stream.Close();
Làm thế nào để bạn đưa nó trở lại đối tượng chúng tôi vừa lưu ... biết rõ đối tượng ban đầu là gì. – ppumkin
@ppumpkin. Tôi đã cập nhật câu trả lời của tôi với thông tin làm thế nào để de-serialize đối tượng. Mã hóa hạnh phúc :) –
Lớp đang được tuần tự hóa phải được đánh dấu bằng thuộc tính Serializable. – Elton
- 1. Cách chọn đối chiếu cơ sở dữ liệu SQL Server
- 2. Thả cơ sở dữ liệu SQL Server
- 3. Tôi không thể tạo sơ đồ cơ sở dữ liệu trong VS2010 cho SQL Server Express
- 4. Làm cách nào để tôi có thể tạo biểu đồ cơ sở dữ liệu SQL Server?
- 5. Tạo tập lệnh SQL cho dữ liệu của cơ sở dữ liệu của tôi (SQL SERVER)
- 6. Có thể truy cập cơ sở dữ liệu .mdf không có SQL Server không?
- 7. Nhận cơ sở dữ liệu SQL Server Cross Phụ thuộc
- 8. enums trong cơ sở dữ liệu SQL Server
- 9. Cơ sở dữ liệu hướng đối tượng Vs đối tượng Cơ sở dữ liệu quan hệ
- 10. Tránh con trỏ cơ sở dữ liệu trong SQL Server
- 11. Toàn bộ cơ sở dữ liệu Script SQL-Server
- 12. Bảo vệ cơ sở dữ liệu SQL Server 2008R2
- 13. Làm cách nào để lưu đối tượng của tôi vào cơ sở dữ liệu của tôi trong LINQ to SQL?
- 14. Tôi muốn lưu trữ nhiều loại đối tượng trong cơ sở dữ liệu SQL. Tôi có nên có một bảng khác nhau cho từng loại đối tượng?
- 15. Cập nhật bảng cơ sở dữ liệu từ một bảng cơ sở dữ liệu SQL Server sang bảng cơ sở dữ liệu SQL Server khác?
- 16. Làm cách nào để lưu trữ băm trong cơ sở dữ liệu SQL Server bằng C#?
- 17. Cách chuyển đổi cơ sở dữ liệu Visual Foxpro sang cơ sở dữ liệu SQL Server
- 18. Bí danh cơ sở dữ liệu chéo của SQL Server
- 19. Vai trò cơ sở dữ liệu SQL Server
- 20. cơ sở dữ liệu SQL 5MB có thể lưu trữ bao nhiêu dữ liệu?
- 21. Cơ sở dữ liệu đối tượng mở?
- 22. Lưu trữ giá trị C# DateTimeOffset trong cơ sở dữ liệu SQL Server 2005
- 23. Sao lưu cơ sở dữ liệu SQL Server một phần (không bao gồm một số bảng)
- 24. Chọn kích thước cơ sở dữ liệu SQL Server
- 25. Chúng tôi có thể thêm nhận xét hoặc tệp README vào cơ sở dữ liệu/bảng SQL Server không?
- 26. Có thể ẩn các cột trong sơ đồ cơ sở dữ liệu SQL Server Management Studio?
- 27. Mang cơ sở dữ liệu SQL Server trực tuyến
- 28. MIME loại tệp cơ sở dữ liệu SQL Server BACKUP
- 29. Thả Người dùng từ Cơ sở dữ liệu SQL Server?
- 30. Hiện đã là một đối tượng có tên là '## Temp' trong cơ sở dữ liệu
Bạn cũng có thể serialize ra XML mà sẽ dễ dàng hơn để kiểm tra bên trong db hơn dữ liệu nhị phân – pjp
Nó không phải là một thiết kế DB tuyệt vời. Bạn sẽ cần phải truy vấn các thuộc tính của đối tượng tại bất kỳ điểm nào? ví dụ. nhận được tất cả các đối tượng nơi object.Foo = 1. – Paddy
Không, tôi không cần phải biết hoặc truy vấn nội dung của các bảng được lưu trữ –