10

Nếu tôi có cả SQL Server 2008 và SQL Server 2012 được cài đặt cục bộ, tôi chỉ đơn giản là sẽ thử điều này cho bản thân mình; tuy nhiên tôi chỉ có phiên bản mới hơn được cài đặt và muốn giữ nó theo cách đó.Phiên bản SQL Server 2012 của Microsoft.SqlServer.Types 'UDT hình học có tương thích ngược với SQL Server 2008 không?

  • SQL Server 2008 đi kèm với một lắp ráp Microsoft.SqlServer.Types.dll, phiên bản chính 10
  • SQL Server 2012 đi kèm với một lắp ráp Microsoft.SqlServer.Types.dll, phiên bản chính 11.

Trong số những thứ khác, cả hội tiếp xúc với một SqlGeometryBuilder type . Một sự khác biệt đáng chú ý giữa hai phiên bản lắp ráp là loại 2012 có phương pháp quá tải bổ sung AddCircularArc và loại 2008 thì không.

Kể từ it's not exactly trivial (and perhaps a bad idea) to reference both assemblies in parallel, tôi tự hỏi liệu tôi có thể sử dụng phiên bản 2012 — ngay cả đối với phiên bản SQL Server 2008, miễn là tôi không sử dụng số AddCircularArc.

Có ai có thể chia sẻ trải nghiệm của họ nếu họ đã thử cách này không?

+1

Phần _ "Kiểu dữ liệu SQL CLR (hình học, địa lý và phân cấp)" _ của trang MSDN [_ "Breaking Changes to Database Engine Features trong SQL Server 2012" _] (http://technet.microsoft. com/en-us/library/ms143179.aspx) không đi vào vấn đề này. – stakx

Trả lời

18

Theo mặc định SqlClient sử dụng phiên bản 10.0 của Microsoft.SqlServer.Types lắp ráp (ngay cả khi bạn tham khảo một phiên bản mới hơn trong dự án của bạn). Khi hai phiên bản khác nhau của hội đồng đó được nạp cùng một lúc, bạn có thể thấy các ngoại lệ thời gian chạy lạ như "System.InvalidCastException: Không thể truyền đối tượng kiểu 'Microsoft.SqlServer.Types.SqlGeometry' để nhập 'Microsoft.SqlServer.Types.SqlGeometry .' "...

bài viết sau đây mô tả một số khả năng mà bạn phải sử dụng các Microsoft.SqlServer.Types hội mới với SqlClient: Breaking Changes to Database Engine Features in SQL Server 2012

các tùy chọn là:

  • Gọi Phương thức GetSqlBytes, thay vì các phương thức Get (ví dụ: SqlGeometry.Deseria) lize (reader.GetSqlBytes (0)))
  • Sử dụng chuyển hướng hội nhập trong cấu hình ứng dụng
  • Chỉ định giá trị "SQL Server 2012" cho thuộc tính "Loại phiên bản hệ thống" để buộc SqlClient tải phiên bản 11.0 của hội đồng

Cá nhân tôi ưu tiên từ khóa chuỗi kết nối "Loại phiên bản hệ thống". Xem bài viết MSDN tại đây: SqlConnection.ConnectionString Property và tìm kiếm 'Loại phiên bản hệ thống'.

+2

+1 cho thuộc tính "Loại phiên bản hệ thống" để giải quyết vấn đề truyền giữa hai phiên bản SQL Server –

+0

Hai sự kiện ([mà tôi đã học trong thời gian chờ đợi] (http://stackoverflow.com/questions/14675774/ là-the-sql-server-2012-phiên bản-của-microsoft-sqlserver-type-geometry-udt-backwa # comment38074389_14855882)) bị thiếu trong câu trả lời của bạn là phiên bản 11 tương thích ngược với phiên bản 10, nhưng phiên bản 10 là chỉ một phần về phía trước tương thích với phiên bản 11. Tôi vẫn chấp nhận câu trả lời của bạn bởi vì nó thực sự quan trọng để nhận ra rằng một số công việc rõ ràng phải được thực hiện để có phiên bản 11 nạp. – stakx

6

Tôi đã thử sử dụng SQL Server 2012 Microsoft.SqlServer.Types.dll đối với SQL Server 2008 Express.

  • hình học có thể INSERT ed miễn là chúng không chứa chuỗi tròn; nếu họ làm tròn chứa các chuỗi, mà SQL Server 2008 không hỗ trợ, ngoại lệ này được ném:

    System.Data.SqlClient.SqlException: Các đến dòng dữ liệu dạng bảng (TDS) dòng giao thức là không chính xác. Tham số 1 (@geometry): Giá trị được cung cấp không phải là một thể hiện hợp lệ của hình dạng kiểu dữ liệu. Kiểm tra dữ liệu nguồn cho các giá trị không hợp lệ.

  • hình học có thể SELECT ed, nhưng dường như chỉ qua chữ Well-Known (WKT):

    // SELECT [Geometry].STAsText() FROM … 
    var geometry = SqlGeometry.STGeomFromText(sqlDataReader.GetSqlChars(…), …); 
    

    Nếu một cố gắng đọc hình học trực tiếp:

    // SELECT [Geometry] FROM … 
    var geometry = (SqlGeometry)sqlDataReader[…]; 
    

    thì ngoại lệ sau được ném (ngay cả khi không có chuỗi hình tròn nào có trong hình học):

    System.InvalidCastException: [A] Microsoft.SqlServer.Types.SqlGeometry không thể được đúc tới [B] Microsoft.SqlServer.Types.SqlGeometry.

    • Loại A có nguồn gốc từ Microsoft.SqlServer.Types, Version=10. ...
    • Loại B có nguồn gốc từ Microsoft.SqlServer.Types, Version=11. ...

    (ngoại lệ đó không ném khi Microsoft.SqlServer.Types.dll phiên bản 10 được sử dụng.)