我有以下代码尝试从两个不同的表中获取记录,然后将它们添加到特定的组合框中。只有第一个查询有效,第二个查询被忽略。
//SqlDataAdapter adapt = new SqlDataAdapter(cmd);
//DataTable data = new DataTable();
//conn.Open();
//adapt.Update(data);
//conn.Close();
//dataGridView1.DataSource = data;
我可以想到另一种方法是在多个查询中执行它但是代码可以简化为这样的吗?
答案 0 :(得分:1)
使用带有2个查询的DBDataReader
,只有第一个执行,因为无法通知每个读取项目来自哪个表/查询。你的"双读"循环似乎假设它们将同时返回(而不是一个接一个的查询 - 与发送到DBCOmmand的方式相同);如果 以这种方式工作,只要每个表中的行数不同,就会失败。
使用DataTables
使您有机会将结果简单地绑定到组合而不是将数据复制到组合中:
Dim SQL = "SELECT * FROM Sample; SELECT * FROM Simple"
Dim ds As New DataSet
Using dbcon As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(SQL, dbcon)
dbcon.Open()
Dim da As New MySqlDataAdapter(cmd)
da.Fill(ds)
End Using
' debug results
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)中的行) 。并非所有DBProviders都具备此功能。例如,访问将阻塞SQL字符串。对代码编写方式的其他更改:
Using
块为我们执行此操作:目标对象在开始时创建并关闭,并在End Using
处理。代码从查询中填充DataSet
,在这种情况下创建2个表。您可以使用DataTable
作为DataSource
:
cboDevName.DataSource = ds.Tables(0)
cboDevName.DisplayMember = "DevName" ' column names
cboDevName.ValueMember = "Id"
cboDevType.DataSource = ds.Tables(1)
cboDevType.DisplayMember = "DevType"
cboDevType.ValueMember = "DevCode"
结果将是每个表中出现在相应组合控件中的所有行。通常使用这种类型的东西,您需要ID / PK以及对查询中的用户有意义的名称。用户会看到友好名称(DisplayMember
),代码可以轻松访问该选择的唯一标识符(ValueMember
)。
使用绑定列表控件时,您不是使用SelectedIndex
和SelectedIndexChanged
事件,而是使用SelectedValue
和SelectedItem
来访问实际数据。< / p>
答案 1 :(得分:0)
您可以使用.net连接器(下载here)
然后您可以安装它并将其添加到您的项目中(项目 - &gt;参考 - &gt;添加 - &gt;浏览)。
最后添加导入:
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将包含两个数据表:每个查询一个