Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何从一个DBCommand对象执行两个单独的查询?_Mysql_.net_Vb.net_Mysqldatareader - Fatal编程技术网

Mysql 如何从一个DBCommand对象执行两个单独的查询?

Mysql 如何从一个DBCommand对象执行两个单独的查询?,mysql,.net,vb.net,mysqldatareader,Mysql,.net,Vb.net,Mysqldatareader,下面的代码试图从两个不同的表中获取记录,然后将它们添加到特定的组合框中。只有第一个查询有效,第二个查询被忽略 试试看 sqlConn=新的MySqlConnection connStr=New字符串(“服务器=localhost;数据库=gen\u数据库;Uid=root;Pwd=”) sqlConn.ConnectionString=connStr myCommand=New MySqlCommand(“从developer\u name\u表中选择DevCompanyName;从develo

下面的代码试图从两个不同的表中获取记录,然后将它们添加到特定的组合框中。只有第一个查询有效,第二个查询被忽略

试试看
sqlConn=新的MySqlConnection
connStr=New字符串(“服务器=localhost;数据库=gen\u数据库;Uid=root;Pwd=”)
sqlConn.ConnectionString=connStr
myCommand=New MySqlCommand(“从developer\u name\u表中选择DevCompanyName;从developer\u type\u表中选择DevType”)
myCommand.CommandType=CommandType.Text
myCommand.Connection=sqlConn
ComboBox1.Items.Clear()
sqlConn.Open()
MsgBox(“连接打开”)
dR=myCommand.ExecuteReader()
当里德博士()时做
ComboBox1.Items.Add(dR(“DevCompanyName”))
ComboBox2.Items.Add(dR(“DevType”))错误显示此处无法在结果中找到指定列:DevType
环
Catch ex作为MySqlException
MsgBox(例如ToString)
最后
克洛斯博士()
sqlConn.Close()
结束尝试

我可以想出另一种方法,即在多个查询中执行此操作,但代码是否可以简化为类似这样的内容?

您可以使用.net connector(下载)
然后您可以安装它并将其添加到您的项目中(项目->参考->添加->浏览)。
最后添加导入:

Imports MySql.Data.MySqlClient
因此,您可以使用以下功能:

Dim connStr as String = "Server = localhost; Database = gen_database; Uid = root; Pwd ="
Dim SqlStr as String = "Select DevCompanyName from developer_name_table; Select DevType from development_type_table"
Dim ds As DataSet = MySqlHelper.ExecuteDataset(CnStr, SqlStr)

ds将包含两个数据表:每个查询一个,使用带有两个查询的
DBDataReader
,只有第一个数据表执行,因为无法指示每个读取项来自哪个表/查询。您的“双读”循环似乎假定它们将在同一时间返回(而不是一个查询接一个查询-它们发送到DBCOmmand的方式相同);如果它确实是这样工作的,那么每当每个表中的行数不相同时,它就会失败

使用
DataTables
可以简单地将结果绑定到组合中,而不是将数据复制到组合中:

Dim SQL=“从示例中选择*;从简单中选择*”
Dim ds作为新数据集
使用dbcon作为新的MySqlConnection(MySQLConnStr),
cmd作为新的MySqlCommand(SQL、dbcon)
dbcon.Open()
Dim da作为新的MySqlDataAdapter(cmd)
da.填充(ds)
终端使用
'调试结果
Console.WriteLine(ds.Tables.Count)
Console.WriteLine(ds.Tables(0.Rows.Count)
Console.WriteLine(ds.Tables(1.Rows.Count)
如果我查看输出窗口,它将打印
2
(表)、
10000
(T(0)中的行)和
6
(T(1)中的行)。并非所有DBProvider都具有此功能。例如,访问将阻塞SQL字符串。对代码组成方式的其他更改:

  • 需要释放DBConnections和DBCommand对象。它们分配资源,因此需要创建、使用和处置它们来释放这些资源
  • Using
    块为我们做到了这一点:目标对象在开始时创建,然后在
    结束时使用
    关闭和处理
  • 上面的代码堆叠或组合2个这样的块
代码从查询中填充一个
数据集
,在本例中创建两个表。您可以使用
数据表
作为
数据源
,而不是将数据从一个容器复制到另一个容器(如控件):

cboDevName.DataSource=ds.Tables(0)
cboDevName.DisplayMember=“DevName”列名
cboDevName.ValueMember=“Id”
cboDevType.DataSource=ds.Tables(1)
cboDevType.DisplayMember=“DevType”
cboDevType.ValueMember=“DevCode”
结果将是每个表中的所有行出现在相应的组合控件中。通常,对于这种类型的东西,您需要ID/PK和对查询中的用户有意义的名称。用户可以看到友好的名称(
DisplayMember
),代码可以轻松访问该选择的唯一标识符(
ValueMember

使用绑定列表控件时,而不是使用
SelectedIndex
SelectedIndexChanged
事件,您应该使用
SelectedValue
SelectedItem
访问实际数据


MSDN:

非常感谢您的清晰解释。但是我可以使用了解更多关于
的信息吗?这是否意味着当我使用
Using
时不需要关闭连接?
Using
关闭并处理它。通常,具有
Dispose
方法的任何内容都应包含在
Using
块中。