Несоответствие значений DataTable с использованием SqlGeography и C#

Итак, следующий код дает мне довольно запутанное исключение.

public void BuildTable()
        {
            using (SqlConnection connection = new SqlConnection("Data Source=ylkx1ic1so.database.windows.net;Initial Catalog=hackathon;Persist Security Info=True;User ID=REDACTED;Password=REDACTED"))
            {
                SqlGeographyBuilder builder = createTestPoint();            
                SqlGeography myGeography = builder.ConstructedGeography;
                connection.Open();
                DataTable myTable = new DataTable();
                using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM myTable", connection))
                {
                    SqlCommandBuilder cb = new SqlCommandBuilder(adapter);
                    adapter.Fill(myTable);
                    myTable.Rows.Add(6, "Test", myGeography);
                    adapter.Update(myTable);
                }
            }
        }

        private SqlGeographyBuilder createTestPoint()
        {
            SqlGeographyBuilder builder = new SqlGeographyBuilder();
            builder.SetSrid(4326);
            builder.BeginGeography(OpenGisGeographyType.Point);
            builder.BeginFigure(31, -85);
            builder.EndFigure();
            builder.EndGeography();
            return builder;
        }

В строке myTable.Rows.Add(6, "Test", myGeography); я получаю следующее исключение:

Type of value has a mismatch with column typeCouldn't store <POINT (-85 31)> in placemark Column.  Expected type is SqlGeography.

Чего я не понимаю, так это почему это не сработает. Во время отладки я пробовал это:

for (int i = 0; i < myTable.Columns.Count; i++)
                    {
                        Debug.WriteLine(myTable.Columns[i].DataType);
                    }
                    Debug.WriteLine(myGeography.GetType());

И мой выход был:

System.Int32
System.String
Microsoft.SqlServer.Types.SqlGeography
Microsoft.SqlServer.Types.SqlGeography

Итак, я определенно пытаюсь поместить объект SqlGeography в столбец, который принимает объекты SqlGeography.


person Pharylon    schedule 02.06.2013    source источник


Ответы (2)


попробуй с прямой вставкой

string sqlCommandText = "insert into myTable(col1,col2,col3) Values(@col1,@col2,@col3)";
SqlCommand sqlCommand = new SqlCommand(sqlCommandText, connection);
sqlCommand.Parameters.AddWithValue("@col1", 6);
sqlCommand.Parameters.AddWithValue("@col2", "Test");
sqlCommand.Parameters.Add(new SqlParameter("@col3", myGeography) { UdtTypeName = "Geography" });
sqlCommand.ExecuteNonQuery(); 
person Damith    schedule 02.06.2013
comment
Да, это сработало, но я все еще хотел бы сделать это с DataTable. Это своего рода тестовый пример для выполнения чего-то более сложного, и этот способ будет занозой в заднице... хотя я думаю, что это лучше, чем ничего. Так что спасибо! - person Pharylon; 02.06.2013

Однако этот вопрос устарел, но этот ответ может помочь будущим пользователям:
Я обнаружил, что несоответствие связано с разными версиями класса SqlGeography. Проблему можно решить, используя правильную версию сборки Microsoft.SqlServer.Types.dll.
Я изменил dll на версию 2009.100 (которая предназначена для SDK SQL Server 2008R2) для приложения с .net 4, однако я подключался к SQL Server 2014.

person Zatkhahi    schedule 27.07.2015