0

我已经使用 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)
4

1 回答 1

0

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

不在连接字符串中,不在数据类型ParameterParameterCollecion也不在我插入参数的方式中(有关于在 . 同样,它在 105 KiB 文件中“崩溃”了!Add(new Parameter)AddWithValue(paramName,value)

所以,...我做了一个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 中使用,因为它往往指向全局/私有变量。

解决方案?将@keyand@arq替换为?keyand ?arq in

    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);

而且要快乐!

于 2013-11-09T14:08:37.953 回答