通过选择 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的主要内容,如果未能解决你的问题,请参考以下文章
如何参数化 Postgres-custom-function 中的表和列,如果值存在则选择 PK,否则插入并返回 PK?