我不明白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);
我是怎么做到的?
答案 0 :(得分:0)
由于您的查询返回一个单元格,因此您可以使用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;
取消装箱是从类型对象到值的显式转换 键入或从接口类型到实现该类型的值类型 接口。拆箱操作包括:
检查对象实例以确保它是盒装值 给定的值类型。
将实例中的值复制到value-type变量中。
另外
要使值类型的取消装箱在运行时成功,则该项目为 unboxed必须是对先前创建的对象的引用 通过装箱该值类型的实例。试图取消装箱null 导致NullReferenceException。 尝试取消对...的引用 不兼容的值类型会导致InvalidCastException 。
在您的情况下,您的23
值已装箱。默认情况下它是int
。但是你试图将一个不是int
的变量取消装箱。这不是有效的操作。你不能一步到位。
例如,这将是一个有效的操作;
Int16 id = (Int16)(Int32)cmd.ExecuteScalar(); // valid