Проблема с использованием MySql.Data.Types.MySqlGeometry в приложении VB.Net - PullRequest
0 голосов
/ 08 января 2019

Я пишу приложение, которое читает и публикует пространственные данные. Поставщик базы данных - MySql, который возвращает массив Byte [] для пространственных столбцов в методе Fill адаптера данных. В отличие от Sql Server, тип данных MySqlGeometry может обрабатывать только одно значение POINT? Мне нужно работать с многоточечными фигурами (например, LINESTRING, POLYGON и т. Д.), И я ищу способ использовать возвращенный массив для извлечения и изменения его общеизвестного текста (WKT), а затем создать новый массив Byte []. Я предложил обходной вариант демонстрации «kludge» (см. Ниже), но для использования функций MySql «GeometryFromText» и «AsText» требуется соединение с базой данных. Одной из функций приложения является предоставление пользователю возможности выполнять значительную работу без подключения к базе данных (например, на самолете), а затем, находясь на земле и подключенной к базе данных, быстро получить свои результаты. Kludge эффективно отрицает эту особенность.

Мне трудно поверить, что тип данных MySqlGeometry настолько ограничен, и я не вижу альтернативного типа данных. (На мой взгляд, это похоже на тип данных Decimal, который может обрабатывать только простые числа). Поэтому я обеспокоен тем, что мне не хватает того, что должно быть очевидным (это будет не в первый раз). Любые предложения будут с благодарностью. С Уважением, Грег

Сборки: NetFramework версия 4.71 MySql.Data версия 8.0.13.0 (последняя версия)

Option Explicit On
Option Strict On

Public Class Form1
  '
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    '
    'NOTES: TextBox1 IS THE WKT INPUT VALUE, Label2 IS THE WKT OUTPUT AND Label5 DISPLAYS THE SRID
    '
    Dim cs As String = "server=localhost;database=sakila;user id=myID;password=myPW;connectiontimeout=15"
    Dim cn As New MySql.Data.MySqlClient.MySqlConnection(cs)
    Dim SRID As Int32 = 4326
    Dim b() As Byte = Nothing
    Dim geom As MySql.Data.Types.MySqlGeometry
    '
    'CREATE EITHER THE 'MySqlGeometry' VALUE (SINGLE POINT) OR A Byte[] ARRAY (MULTI-POINT FIGURE) FROM THE WELL KNOWN TEXT (WKT)
    '
    'INPUT: FOR A SINGLE POINT GEOMETRY VALUE, CREATE THE GEOMETRY OBJECT FROM THE SPATIAL STRING (INCLUDING THE SRID)
    If TextBox1.Text.ToUpper.IndexOf("POINT") = 0 Then
      '
      'SINGLE POINT
      MySql.Data.Types.MySqlGeometry.TryParse("SRID=" & SRID & ";" & TextBox1.Text.ToUpper, geom)
      '
    Else
      '
      'MULTI-POINT FIGURE; USE GeomFromText(WKT[, SRID]) WITH A DATAREADER
      '(WORKAROUND FOR THE LIMITATION OF SINGLE POINT ONLY SUPPORT OF THE MySqlGeometry DATA TYPE)
      Dim cmd As New MySql.Data.MySqlClient.MySqlCommand
      Dim p As New MySql.Data.MySqlClient.MySqlParameter("@input", MySql.Data.MySqlClient.MySqlDbType.Text)
      p.Direction = ParameterDirection.Input
      '
      'SET THE PARAMETER VALUE TO THE WELL KNOWN TEXT
      p.Size = TextBox1.Text.Length
      p.Value = TextBox1.Text
      cmd.Parameters.Add(p)
      '
      'SET UP THE COMMAND TEXT
      cmd.CommandText = "SELECT GeometryFromText(@input, " & SRID.ToString & ")"
      cmd.Connection = cn
      If cn.State <> ConnectionState.Open Then cn.Open()
      cmd.CommandType = CommandType.Text
      Dim myReader As MySql.Data.MySqlClient.MySqlDataReader
      myReader = cmd.ExecuteReader()
      '
      'GET THE GEOMETRY OBJECT AS A BYTE ARRAY
      While myReader.Read()
        Dim s As String = myReader.GetDataTypeName(0).ToString
        Dim o As Object = myReader.GetValue(0)
        b = DirectCast(o, Byte())
      End While
      '
      cn.Close()
      '
    End If
    '
    'OUTPUT
    Label2.Text = Nothing
    Label5.Text = Nothing
    If geom.Value IsNot Nothing Then
      '
      'THIS IS A SINGLE POINT SPATIAL VALUE; GET THE WKT AND SRID
      Label2.Text = geom.GetWKT
      Label5.Text = geom.SRID.ToString
      '
      'THE FOLLOWING IS NOT PART OF THE DEMO SCRIPT BUT CAN BE USED FOR SINGLE POINT SPATIAL DATA RETURNED FROM A QUERY AS A Byte[] ARRAY
    ElseIf b IsNot Nothing AndAlso b.Length = 25 Then
      '
      Dim t As MySql.Data.MySqlClient.MySqlDbType
      geom = New MySql.Data.Types.MySqlGeometry(t, b)
      '
      'GET THE WKT AND SRID
      Label2.Text = geom.GetWKT
      Label5.Text = geom.SRID.ToString
      '
    Else
      '         
      'MULTIPLE POINT FIGURES
      Dim cmd As New MySql.Data.MySqlClient.MySqlCommand
      Dim p As New MySql.Data.MySqlClient.MySqlParameter("@input", MySql.Data.MySqlClient.MySqlDbType.Blob)
      p.Direction = ParameterDirection.Input
      p.Size = b.Length
      p.Value = b
      cmd.Parameters.Add(p)
      cmd.CommandText = "SELECT ASTEXT(@input), SRID(@input)"
      cmd.Connection = cn
      If cn.State <> ConnectionState.Open Then cn.Open()
      cmd.CommandType = CommandType.Text
      Dim myReader As MySql.Data.MySqlClient.MySqlDataReader
      myReader = cmd.ExecuteReader()
      '
      'GET THE WKT AND THE SRID
      While myReader.Read()
        Label2.Text = myReader.GetString(0)
        Label5.Text = myReader.GetString(1)
      End While
      cn.Close()
      '
    End If
    '
  End Sub
  '
End Class
...