【问题标题】:SQL query get error "Specified cast is not valid."SQL 查询得到错误“指定的转换无效。”
【发布时间】:2018-05-29 15:08:37
【问题描述】:

我有如下示例代码:-

public List<Announcement_User> announcementUser([FromBody]MyAnnouncementUser value)
{
    MySqlConnection conn = WebApiConfig.conn();
    MySqlCommand query = conn.CreateCommand();
    query.CommandText = "select a.title,a.description,a.date_created,ua.read,ua.announcement_id,ua.user_announcement_id from announcement a left join user_announcement ua on a.announcement_id = ua.announcement_id where ua.user_id = @user_id";

    query.Parameters.AddWithValue("@user_id", value.user_id);

    var prodWishlist = new List<Announcement_User>();

    try
    {
        conn.Open();
    }
    catch (MySql.Data.MySqlClient.MySqlException ex)
    {
        prodWishlist.Add(new Announcement_User(null, null,null, false, 0, 0, ex.ToString()));
    }

    MySqlDataReader fetch_query = query.ExecuteReader();

    while (fetch_query.Read())
    {
        prodWishlist.Add(new Announcement_User(fetch_query["title"].ToString(), fetch_query["description"].ToString(), fetch_query["date_created"].ToString(), (bool)fetch_query["read"], fetch_query.GetInt32(4), fetch_query.GetInt32(5), null));
    }
    conn.Close();
    return prodWishlist;
}

我遇到如下错误:-

"Message": "发生错误。",

"ExceptionMessage": "指定的转换无效。",

"ExceptionType": "System.InvalidCastException",

现在我怀疑是 bool 引起的错误。我可以知道如何为 bool in(fetch_query.Read()) 编写正确的方法吗?请帮忙。谢谢。

【问题讨论】:

  • 数据库中的read是什么?
  • fetch_query["read"]的值是多少?

标签: c# api boolean


【解决方案1】:

尝试使用GetBoolean 方法:

fetch_query.GetBoolean("read")

【讨论】:

  • 1) GetBoolean 只接受 int(序数) 2) 这应该会抛出相同的错误
  • 以下任何地方都可能引发异常:(bool)fetch_query["read"], fetch_query.GetInt32(4), fetch_query.GetInt32(5), 不仅是您指定的那个。
  • @TimSchmelter 1) 不正确,请点击答案中的链接。它接受一个字符串。
  • @TimSchmelter 2) 如果ua.read 是一个布尔数据库字段。这不会抛出错误。
  • OP 指向SqlDataReader.Read() 返回布尔值的方法。该方法不可能抛出这种异常:msdn.microsoft.com/en-us/library/…
【解决方案2】:

我建议您事先使用列名而不是列索引检索所有值,并在所需参数有值时创建新对象:

string title = fetch_query["title"].ToString();
string description = fetch_query["description"].ToString();
// ...
object read = fetch_query["read"];
object integer1 = fetch_query[4];
// ...

// newest C# approach
if ( read != null && bool.TryParse(read.ToString(), out bool b_read) )

// old c# approach
bool b_read = false;
if ( read != null && bool.TryParse(read.ToString(), out b_read) )

检查每个必需的属性

prodWishlist.Add(
    new Announcement_User(
        title,
        description, 
// ..
        b_read,
        i_integer1
//...
));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多