通过选择 UserID(PK) 在 ExecuteReader 上出现 MySqlException

Posted

技术标签:

【中文标题】通过选择 UserID(PK) 在 ExecuteReader 上出现 MySqlException【英文标题】:MySqlException on ExecuteReader by Selecting UserID(PK) 【发布时间】:2016-07-10 01:33:45 【问题描述】:

我尝试从 phpAdmin 上的数据库中删除一行,查询正在运行 很好,但是当我用

执行它时

代码:

mysqlCommand getUserID = new MySqlCommand("SELECT UserID FROM User", connection);

MySqlDataReader reader = getUserID.ExecuteReader();

我明白了

错误:

目标数组不够长,无法复制 收藏。检查数组索引和长度。

我之前插入删除用户没有任何问题。

数据库有一个 UserID 属性 Unique,Int(长度 9) 和 Auto-Increment 和一个来自 Char 类型的 UserName

我的问题是:

为什么我收不到userID,我该如何接收?

编辑

我只能接收任何整数或日期数据 varchar。

这是数据库创建查询: Creation Query

【问题讨论】:

您的数据有多大?表中有多少用户? 这是一张有 20 个值的小桌子 “非查询”选择?`严重吗?您知道“SELECT”是每个定义的查询吗? ExecuteNonQuery 适用于不返回数据的事物(例如 UPDATE、DELETE)。 【参考方案1】:

异常意味着您得到了意想不到的结果。 ExecuteNonQuery 方法尝试执行不返回任何行的查询,并返回一个整数,显示在数据库中编辑的行数。所以它试图将结果数组放入一个整数字段中,这是不可能的。

所以要回答你的问题,错误的原因是查询。对于选择查询,您应该使用ExecuteReader() 方法。

【讨论】:

【参考方案2】:

首先因为您想检索单个值 (UserID),您可以在此处使用 ExecuteScalar

MySqlCommand getUserID = new MySqlCommand("SELECT UserID FROM `User`", connection);
connection.Open();
int userId = (int)getUserID.ExecuteScalar();
connection.Close();

其次User 是reserved keyword,因此您需要在表名周围使用反引号使其明确:

MySqlCommand getUserID = new MySqlCommand("SELECT UserID FROM `User`", connection);

【讨论】:

【参考方案3】:

问题是数据库 MySqlConnection 无法获取 Int 或 Date 值,如果它们不是无符号的,这也意味着异常:

“目标数组不够长,无法复制集合中的所有项目。请检查数组索引和长度。”

【讨论】:

以上是关于通过选择 UserID(PK) 在 ExecuteReader 上出现 MySqlException的主要内容,如果未能解决你的问题,请参考以下文章

SQL 连接 3 个按最新组值分组的表

如何参数化 Postgres-custom-function 中的表和列,如果值存在则选择 PK,否则插入并返回 PK?

为啥 SQL Server 在“选择 *”操作中在聚簇 PK 上使用非聚簇索引?

增加数据库中的记录位置(通过 LINQ 或 TSQL)

缓存技术PK:选择Memcached还是Redis?

如何创建 MsSQL 过程以根据其他两个表过滤一个表?