3

我正在尝试通过 sql 从数据库中检索数据来填充列表框。我之前问过这个问题,但我使用的是不同的配置,而我现在使用的配置没有给出任何结果。

从 SQL 中检索 VB 中的数据

那是我的旧帖子。我现在将代码提供给我尝试的新版本。

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 是我表中的项目数。我如何获得实际值?

4

3 回答 3

4

你错过了connectionString
如果你想从数据库中填充列表有很多方法

使用数据读取器

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

使用数据表

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


编辑:
连接字符串的其他参数取决于您的安全性等等。您必须看到此链接SQL Server 2008 的连接字符串

于 2013-02-17T04:03:29.160 回答
3

绑定后设置DisplayMember属性:DataSource

ListBox1.DataSource = dt
ListBox1.DisplayMember="name"
于 2013-02-17T04:47:13.217 回答
0

我看到的最后一个解决方案应该可以工作,但是关于 SQL Server,有几个重要的最佳实践需要牢记。

1)尽可能避免 Select * ,而是明确命名您的列。如果您不打算拉下表中的所有列,则选择 * 会使 SQL 执行额外的工作。它也不是面向未来的,因为 dba 将来可能会添加一个 VARBINARY(MAX) 列,并用 gigs 的 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();
}
  1. 不要忘记在读取循环完成后关闭您的 SqlDataReader。

    if (!dr.IsClosed) dr.Close();

我希望这有帮助。

安德烈·拉涅利

于 2013-02-17T19:10:45.823 回答