使用MySqlCommand.ExecuteNonQuery将几何数据插入表中

时间:2015-05-06 10:57:10

标签: c# mysql

我正在尝试以编程方式将中型(434MB的原始转储)表从远程服务器复制到本地服务器。我当前的方法使用MySqlDataAdapter和DataSet:

        using(MySqlConnection conn_local = new MySqlConnection(localcs))
        {
            conn_local.Open();
            //build an insertcommand
            MySqlCommand insertcommand = new MySqlCommand("INSERT INTO `buildtools`.`straten` (straat, a_naam, e_naam, n_naam, plaats, opr_id, wegtype, wegtype_b, wegtype_a, wegtype_p, rotonde, opaf, opaf_naam, hoogtenummer, knooppunt, rijrichting, eenrichting, regio, layerNr, geom) VALUES (@straat, @a_naam, @e_naam, @n_naam, @plaats, @opr_id, @wegtype, @wegtype_b, @wegtype_a, @wegtype_p, @rotonde, @opaf, @opaf_naam, @hoogtenummer, @knooppunt, @rijrichting, @eenrichting, @regio, @layerNr, @geom);", conn_local);

            //addparameters is a static function to add the necessary parameters to insertcommand
            foreach(some datastructure in some dataset)
            {
               addparameters(insertcommand);
               //Do some work to set parameter values
               insertcommand.ExecuteNonQuery();
               insertcommand.Parameters.Clear;
            }

        }

addparameters函数如下所示:

private static void addparameters(MySqlCommand cmd)
    {
        cmd.Parameters.Add("@straat", MySqlDbType.VarChar, 60, "straat");
        cmd.Parameters.Add("@a_naam", MySqlDbType.VarChar, 60, "a_naam");
        cmd.Parameters.Add("@e_naam", MySqlDbType.VarChar, 20, "e_naam");
        cmd.Parameters.Add("@n_naam", MySqlDbType.VarChar, 20, "n_naam");
        cmd.Parameters.Add("@plaats", MySqlDbType.VarChar, 40, "plaats");
        cmd.Parameters.Add("@opr_id", MySqlDbType.Decimal, 16, "opr_id");
        cmd.Parameters.Add("@wegtype", MySqlDbType.VarChar, 20, "wegtype");
        cmd.Parameters.Add("@wegtype_b", MySqlDbType.VarChar, 20, "wegtype_b");
        cmd.Parameters.Add("@wegtype_a", MySqlDbType.VarChar, 20, "wegtype_a");
        cmd.Parameters.Add("@wegtype_p", MySqlDbType.VarChar, 20, "wegtype_p");
        cmd.Parameters.Add("@rotonde", MySqlDbType.VarChar, 20, "rotonde");
        cmd.Parameters.Add("@opaf", MySqlDbType.VarChar, 20, "opaf");
        cmd.Parameters.Add("@opaf_naam", MySqlDbType.VarChar, 45, "opaf_naam");
        cmd.Parameters.Add("@hoogtenummer", MySqlDbType.Int16, 6, "hoogtenummer");
        cmd.Parameters.Add("@knooppunt", MySqlDbType.VarChar, 45, "knooppunt");
        cmd.Parameters.Add("@rijrichting", MySqlDbType.VarChar, 1, "rijrichting");
        cmd.Parameters.Add("@eenrichting", MySqlDbType.VarChar, 1, "eenrichting");
        cmd.Parameters.Add("@regio", MySqlDbType.VarChar, 30, "regio");
        cmd.Parameters.Add("@layerNr", MySqlDbType.VarChar, 45, "layerNr");
        cmd.Parameters.Add("@geom", MySqlDbType.Geometry, 1, "geom");
    }

在致电System.IndexOutOfRangeException

时,我一直收到Index was outside the bounds of the array消息insertcommand.ExecuteNonQuery();

1 个答案:

答案 0 :(得分:0)

当我尝试在没有Geometry数据的情况下执行INSERT时,它确实有效。

我尝试将MySqlDbType.Geometry更改为MySqlDbType.Blob,因为Geometry对象基本上是BLOB的一个特殊子集,这解决了这个问题。 MySqlDbType.Geometry可能存在一些问题。