2012-08-23 13 views
8

के साथ मैकिंग एसक्लोगोग्राफी मेरे पास इकाई "प्वाइंट" है, जिसमें आईडी, टेक्स्ट और भूगोल निर्देशांक शामिल हैं।डैपर

CREATE TABLE [Point] (
    [Id] INT IDENTITY CONSTRAINT [PK_Point_Id] PRIMARY KEY, 
    [Coords] GEOGRAPHY NOT NULL, 
    [Text] NVARCHAR(32) NOT NULL, 
    [CreationDate] DATETIME NOT NULL, 
    [IsDeleted] BIT NOT NULL DEFAULT(0) 
) 

CREATE PROCEDURE [InsertPoint] 
    @text NVARCHAR(MAX), 
    @coords GEOGRAPHY 
AS BEGIN 
    INSERT INTO [Point](Text, Coords, CreationDate) 
    VALUES(@text, @coords, GETUTCDATE())  
    SELECT * FROM [Point] WHERE [Id] = SCOPE_IDENTITY() 
END 

यह तालिका का एसएस एसक्यूएल कोड और डालने की संग्रहीत प्रक्रिया है। मैं व्यवसायिक उपयोग करने के लिए वर्ग है:

public class DapperRequester : IDisposable { 
    private readonly SqlConnection _connection; 
    private SqlTransaction _transaction; 

    public DapperRequester(string connectionString) { 
     _connection = new SqlConnection(connectionString); 
     _connection.Open(); 
    } 
    public void Dispose() { 
     _connection.Close(); 
    } 

    public void BeginTransaction() { 
     _transaction = _connection.BeginTransaction(); 
    } 
    public void CommitTransaction() { 
     _transaction.Commit(); 
    } 
    public void RollbackTransaction() { 
     _transaction.Rollback(); 
    } 

    public void Query(string query, object parameters = null) { 
     Dapper.SqlMapper.Execute(_connection, query, parameters, transaction: _transaction); 
    } 

    public void QueryProc(string procName, object parameters = null) { 
     Dapper.SqlMapper.Execute(_connection, procName, parameters, commandType: CommandType.StoredProcedure, transaction: _transaction); 
    } 

    public IEnumerable<T> Execute<T>(string query, object parameters = null) { 
     return Dapper.SqlMapper.Query<T>(_connection, query, parameters, transaction: _transaction); 
    } 

    public IEnumerable<dynamic> ExecuteProc(string procName, object parameters = null) { 
     return Dapper.SqlMapper.Query(_connection, procName, parameters, 
             commandType: CommandType.StoredProcedure, transaction: _transaction); 
    } 

    public IEnumerable<T> ExecuteProc<T>(string procName, object parameters = null) { 
     return Dapper.SqlMapper.Query<T>(_connection, procName, parameters, 
             commandType: CommandType.StoredProcedure, transaction: _transaction); 
    } 
} 

ग # वर्ग है:

public class Point 
{ 
    public int Id { get; set; } 
    public SqlGeography Coords { get; set; } 
    public string Text { get; set; } 
} 

और जब मैं किसी अन्य वर्ग के लिए इस तरह के सिस्टम का उपयोग भंडार विधि

public Point InsertPoint(string text, SqlGeography coords) 
    { 
     using (var requester = GetRequester()) 
     { 
      return requester.ExecuteProc<Point>("InsertPoint", new { text, coords }).FirstOrDefault(); 
     } 
    } 

है, सब कुछ भला है , लेकिन मैपिंग के साथ एक समस्या है, मुझे लगता है कि यह एसक्लोगोग्राफी प्रकार के कारण है .. का उपयोग:

SqlGeography coords = new SqlGeography(); 
     coords = SqlGeography.Point(10.5, 15.5, 4326); 
     Point point = new Point { Coords = coords, Text = "Text" }; 
     point = Repositories.PointRepository.InsertPoint(point.Text, point.Coords); 

और मेरे पास अपवाद है The member coords of type Microsoft.SqlServer.Types.SqlGeography cannot be used as a parameter value

क्या उस प्रकार के मानचित्रण का कुछ रहस्य है?

उत्तर

9

डैपर 1.32 अब includes direct support for this। आपका कोड अब होना चाहिए बस पर काम करें।

+0

क्या यह भी QueryMultiple के साथ काम करना चाहिए? मुझे पाठक करते समय "कॉलम 5 पार्स करने में त्रुटि" मिल रही है। पढ़ें। और कॉलम 5 एक एसक्लोगोग्राफी बहुभुज है। –

+1

एसक्यूजीजीोग्राफी के सही संस्करण का उपयोग करने के लिए सावधान रहें, जिसके आधार पर आप किस एमएस डेटाबेस संस्करण का उपयोग कर रहे हैं। मुझे एसक्यूएल 2012 के लिए एसक्लोगोग्राफी संस्करण 10.5 स्थापित करना पड़ा। फिर यह डैपर के साथ ठीक काम करता था। – mac10688

1

डैपर डीबी प्रदाता विशिष्ट डेटा प्रकारों का समर्थन नहीं करता है। आपके मामले में इसकी भूगोल।

डैप्पर, कोई डीबी विशिष्ट कार्यान्वयन विवरण होता है कि यह में काम करता है सब .net हलचल SQLite, sqlce, Firebird, ओरेकल, MySQL और SQL सर्वर सहित प्रदाताओं

आदेश के साथ इस परम संभाल करने में डैपर, आपको इसके लिए अपना खुद का हैंडलिंग लिखना होगा। उदाहरण के लिए, यह answer देखें।

शुभकामनाएं

1

मैं एक समान समस्या में भाग गया। मैंने पाया कि डैपर परिणामस्वरूप फ़ील्ड को Microsoft.SqlServer.Types.SqlGeography पर ठीक कर देगा, लेकिन पैरामीटर के रूप में उनका उपयोग करके काम नहीं किया गया।

मैंने इस प्रकार के समर्थन को शामिल करने के लिए SqlMapper.cs फ़ाइल को संशोधित किया है। आप यहां गिस्ट देख सकते हैं: https://gist.github.com/bmckenzie/4961483

मैंने जो बदलाव किया है उसे देखने के लिए "संशोधन" पर क्लिक करें।

संबंधित मुद्दे