【问题标题】:MySql .NET connector returning byte array instead of actual typeMySql .NET 连接器返回字节数组而不是实际类型
【发布时间】:2015-08-15 13:31:10
【问题描述】:

我有一个 MySql 数据库,其中一个字段是 GEOMETRY 字段。我正在使用 ADO.Net 连接到数据库,并且正在将数据写入如下字段:

var myGeometry = new MySql.Data.Types.MySqlGeometry(15.3f, 12.9f);
string cmdString = "INSERT INTO `MyTable` (LaunchPoint) VALUES (@val1);";

using (var connection = new MySqlConnection(_connectionString))
{
    using (var command = new MySqlCommand())
    {
        command.Connection = connection;
        command.CommandType = CommandType.Text;
        command.CommandText = cmdString;
        command.Parameters.Add(new MySqlParameters("@val1", MySqlDbType.Geometry) {Value = myGeometry});

        connection.Open();
        command.ExecuteScalar();
    }
}

这工作正常。它将数据写入数据库,如果我从 MySQL Workbench 执行SELECT 命令,我可以看到数据在那里。

我遇到的问题是读回数据。数据以 byte[] 而不是 MySqlGeometry 对象的形式返回。这是我的阅读代码:

string sql = "SELECT * FROM MyTable";

using (var connection = new MySqlConnection(_connectionString))
{
    using (var command = new MySqlCommand())
    {
        command.Connection = connection;
        command.CommandType = CommandType.Text;
        command.CommandTet = sql;

        connection.Open();
        using (var adapter = new MySqlDataAdapter())
        {
            using (var ds = new DataSet())
            {
                adapter.SelectCommand = command;
                adapter.Fill(ds);

                // Error occurs on the next line
                var geo = (MySqlGeometry) ds.Tables[0].Rows[0]["LaunchPoint"];
            }
        }
    }
}

当我尝试用数据加载geo 变量时发生错误。错误告诉我它不能将字节数组转换为MySqlGeometry。仔细一看,确实,MySQL .NET 连接器似乎出于某种原因将其转换为字节数组。我发现了一个关于这个here 的类似问题。但是,这个问题没有回应,就像6岁一样。如果它是一个错误,那么现在肯定已经修复了。

有人有解决办法吗?

【问题讨论】:

    标签: c# mysql .net ado.net


    【解决方案1】:

    使用字节数组构造函数新建对象的一个​​新实例,而不是强制转换。

    public MySqlGeometry(MySqlDbType type, byte[] val)
    

    source

    var geo = new MySqlGeometry(MySqlDbType.Geometry, ds.Tables[0].Rows[0]["LaunchPoint"]);
    

    【讨论】:

    • 此解决方案完美运行。我仍然认为它应该通过强制转换来工作,就像所有其他数据类型一样。但这很好用。谢谢!
    • @Icemanind 乐于助人!虽然如果有一个强制转换选项会很好,但它需要作为显式运算符添加到 MySqlGeometry 类,库创建者显然没有看到其中的值。以下添加到 MySqlGeometry 的源将允许你的演员。公共静态显式运算符 MySqlGeometry (byte[] geometry) { return new MySqlGeometry(MySqlDbType.Geometry, geometry);当然,这实际上只是语法糖。归根结底,它仍在更新该类的新实例。
    猜你喜欢
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2018-11-19
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多