【问题标题】:How works DataTable c# with MySqlDataTable c# 与 MySql 的工作原理
【发布时间】:2014-07-14 07:41:19
【问题描述】:

我不明白 c# 中的 dataTable 是如何工作的,这是我的问题:

我有一个选择,这个选择只给我一个 ID,见

 string query = "SELECT ID FROM USERS WHERE NAME = 'WILL'";
 MySqlCommand cmd = new MySqlCommand(query, conn);
 MySqlDataAdapter da = new MySqlDataAdapter(cmd);

我不知道如何获取此 ID 并在其他选择中使用,

选择结果:

 ID = 23 // ID is result of first select

带有其他选择结果的新选择:

 SELECT NAME FROM USERS WHERE ID = @ID
 cmd.Parameters.AddWithValue("@ID", ID);

我是怎么做到的?

【问题讨论】:

    标签: c# mysql winforms datatable


    【解决方案1】:

    由于您的查询返回一个单元格,您可以使用ExecuteScalar 方法。在这种情况下,您似乎不需要使用 MySqlDataAdapter

    执行查询,并返回第一行的第一列 查询返回的结果集。

    int id = (Int32)cmd.ExecuteScalar(); //id will be 23
    

    那么你就可以把它当成;

     cmd.Parameters.AddWithValue("@ID", id);
    

    当然你可以在这里使用MySqlDataAdapter。您可以将 while 语句.Read() 方法一起使用,您可以获得第一列的值。但是ExecuteScalar 在一行中完成这些操作。

    我尝试使用 int16 但仅适用于 int32,为什么?

    ExecuteScalar 方法将此值返回为object。这就是为什么这是一个装箱/拆箱问题。来自documentation;

    拆箱是从类型对象到值的显式转换 类型或从接口类型到实现的值类型 界面。拆箱操作包括:

    • 检查对象实例以确保它是一个装箱值 给定的值类型

    • 将值从实例复制到值类型变量中。

    还有

    为了在运行时成功拆箱值类型,项目被 unboxed 必须是对先前创建的对象的引用 通过装箱该值类型的实例。尝试拆箱 null 导致 NullReferenceException。 正在尝试取消对某个引用的引用 不兼容的值类型会导致 InvalidCastException

    在您的情况下,您的 23 值已装箱。默认情况下它是int。但是您尝试将其拆箱为不是int 的变量。这不是一个有效的操作。你不能一步完成。

    例如这将是一个有效的操作;

    Int16 id = (Int16)(Int32)cmd.ExecuteScalar(); // valid
    

    【讨论】:

    • @WillianBresciani 更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2012-04-25
    • 2011-11-17
    • 2016-08-16
    • 2011-04-18
    • 2012-09-02
    • 1970-01-01
    相关资源
    最近更新 更多