我试图通过sql从数据库中检索数据来填充列表框。我之前已经问过这个问题,但我使用的是不同的配置,而我现在使用的配置并没有给出任何结果。
retrieving data in VB from SQL
那是我的老帖子。我现在将为我的尝试的新版本提供代码。
Imports System.Data.Sql
Imports System.Data.SqlClient
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim conn As New SqlConnection
conn.Open()
Dim comm As New SqlCommand("SELECT name FROM Table_1", conn)
Dim reader As SqlDataReader = comm.ExecuteReader
Dim dt As New DataTable
dt.Load(reader)
ListBox1.Items.Add(dt)
End Sub
End Class
如果有人愿意帮助我,我会非常感激。如果可能的话,在试图启发我时使用实用的方法,因为这是最好的。
编辑1
Imports System.Data.Sql
Imports System.Data.SqlClient
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim connString As String = "Data Source=THE_SHOGUNATE\SQLEXPRESS;Initial Catalog=le_database;Integrated Security=True"
Dim conn As New SqlConnection(connString)
conn.Open()
Dim comm As New SqlCommand("SELECT name FROM Table_1", conn)
Dim reader As SqlDataReader = comm.ExecuteReader
Dim dt As New DataTable
dt.Load(reader)
ListBox1.DataSource = dt
End Sub
End Class
使用此代码,列表框将填充6个“System.Data.DataRowView”字符串实例,其中6个是表格中的项目数。我如何获得实际值?
答案 0 :(得分:4)
你错过了connectionString
如果要从DB填充列表,有很多方法
使用DataReader
Imports System.Data.Sql
Imports System.Data.SqlClient
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim connectionString As String = "Data Sourec=localhost;........."
Dim conn As New SqlConnection(connectionString)
conn.Open()
Dim comm As New SqlCommand("SELECT name FROM Table_1", conn)
Dim reader As SqlDataReader = comm.ExecuteReader
/* As it is not working i commented this
listBox1.ItemsSource = dt; // use this instead of ListBox1.Items.Add(dt)
//because Add event add only one item in the list.
*/
Dim i As Integer
i=0
while reader.read()
listbox1.Items.Add(dr(i).ToString);
i++
End While
End Sub
End Class
使用DataTable
Imports System.Data.Sql
Imports System.Data.SqlClient
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim connectionString As String = "Data Sourec=localhost;........."
Dim conn As New SqlConnection(connectionString)
conn.Open()
// Create new DataAdapter
SqlDataAdapter a = new SqlDataAdapter("SELECT * FROM EmployeeIDs", c)
// Use DataAdapter to fill DataTable
DataTable dt = new DataTable();
a.Fill(dt);
ListBox1.DataSource = dt;
ListBox1.DataTextField = "name";
End Sub
End Class
编辑:
连接字符串的其他参数取决于您的安全性以及所有这些。您必须看到此链接Connection strings for SQL Server 2008
答案 1 :(得分:3)
在DisplayMember
绑定后设置DataSource
属性:
ListBox1.DataSource = dt
ListBox1.DisplayMember="name"
答案 2 :(得分:0)
我看到的最后一个解决方案应该可行,但有几个重要的最佳实践需要牢记SQL Server。
1)尽可能避免选择*,而是明确命名列。如果您不打算删除表中的所有列,则选择*会使SQL执行额外的工作。它也不是面向未来的,因为dba可能会在未来添加一个VARBINARY(MAX)列,并使用gig值得的blob数据填充它。这种情况会使您的查询写入速度大幅减慢而且不必要。
2)永远记得在完成后关闭你的SQLConnection。这将释放SQL连接和资源。
if (cn.State != ConnectionState.Closed)
cn.Close();
另一个很酷的技巧是使用USING指令,当执行超出范围时,该指令将处理SqlConnection对象。
using (SqlConnection cn = new SqlConnection(sConnectionString))
{
if (cn.State != ConnectionState.Open)
cn.Open();
// add query code here.
if (cn.State != ConnectionState.Closed)
cn.Close();
}
在读取循环完成后不要忘记关闭SqlDataReader。
if(!dr.IsClosed) dr.Close();
我希望这会有所帮助。
安德烈拉尼瑞