【问题标题】:Error: Inserting a BLOB in MySQL results in null using C#错误:使用 C# 在 MySQL 中插入 BLOB 导致 null
【发布时间】:2013-11-21 12:23:33
【问题描述】:

我使用 MySQL 已经有一段时间了,但直到最近我才开始需要上传文件。 场景如下:我有一个使用 .NET 连接器运行的 C# 控制台应用程序,我需要它来允许用户上传 PDF 文件,并使用外键将其插入到特定表中。

所以,在定义了Command的连接之后,就变成了这样:

    command.CommandText =  "INSERT INTO targetTable (ForeignKey,file) VALUES (@key, @arq);";
    MySqlParameter FKParam = new MySqlParameter("@key", MySqlDbType.Int32,3);
    FKParam.Value = _value; //Received as a function parameter
    MySqlParameter fileParam new MySqlParameter("@arq", MySqlDbType.Blob,bytes.length);
    FKParam.Value = bytes; //is the name of the variable which holds the readed bytes from a file.
    command.Parameters.Add(FKParam);
    command.Parameters.Add(fileParam);
    command.ExecuteNonQuery();

这段代码运行良好……但它没有。我的意思是,创建了一个新行,除了文件列为空。

这是表结构:

    mysql> show columns from targetTable ;
    +---------------------+--------------+------+-----+-------------------+-----------------------------+
    | Field               | Type         | Null | Key | Default           | Extra                       |
    +---------------------+--------------+------+-----+-------------------+-----------------------------+
    | targetTableID       | int(3)       | NO   | PRI | NULL              | auto_increment              |
    | ForeignKey          | int(3)       | YES  |     | NULL              |                             |
    | file                | mediumblob   | YES  |     | NULL              |                             |                  
    +---------------------+--------------+------+-----+-------------------+-----------------------------+
   3 rows in set (0.00 sec)

【问题讨论】:

    标签: c# mysql blob


    【解决方案1】:

    好的,很抱歉自己回答。 只是我花了将近两天的时间坐在鸭子上试图找到这个解决方案。 因此,在使用各种其他工具检查上传仅 105KiB 文件(包括 PHPadmin 和 SQL Workbench)的过程后,我(终于!!)意识到我可能遗漏了一些东西(嗯,呃!)。

    不在连接字符串中,不在数据类型或我插入参数的方式中(有关于在ParameterCollecion 中添加Parameter 的方式的帖子,它们在Add(new Parameter) 和@987654324 中发生冲突@. 两者都有效),而且绝对不是 max_allowed_pa​​cket 设置。同样,它在 105 KiB 文件中“崩溃”了!

    所以,...我创建了一个SELECT * FROM targetTable,并注意到只有文件列为空... FK 列也为空!

       mysql> SELECT * FROM targetTable;
        +---------------+------------+-----+
        | targetTableID | ForeignKey | arq |
        +---------------+------------+-----+
        |             1 |    NULL    | NULL|
        +---------------+------------+-----+
        1 row in set (0.00 sec)
    

    那时,我意识到参数是用@ 字符设置的,这在Microsoft SQL Server 变量中很常见。到那时,只有到那时,我才意识到这个角色并不是一个聪明的人会在 MySQL 中使用,因为它往往指向全局/私有变量。

    解决方案?在

    中将@key@arq替换为?key?arq
        MySqlParameter FKParam = new MySqlParameter("@key", MySqlDbType.Int32,3);
        FKParam.Value = _value; //Received as a function parameter
        MySqlParameter fileParam new MySqlParameter("@arq", MySqlDbType.Blob,bytes.length);
    

    要快乐!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多