简体   繁体   中英

Connection to SQL Server through ADO.NET - Empty Listbox

Trying to set up a connection to my local SQL Server Express instance so that I can display columns in a listbox. Th build runs fine and I can't see errors, but there is no data in the listbox. I have tested the query and that is fine. I am using NT Authentication to the database. Any ideas where I might have gone wrong?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void customers_SelectedIndexChanged(object sender, EventArgs e)
    {
        string commstring = "Driver ={SQL Server}; Server = DESKTOP-5T4MHHR\\SQLEXPRESS; Database = AdventureWorks2014; Trusted_Connection = Yes;";
        string connstring = "SELECT FirstName, LastName FROM Person.Person";

        SqlDataAdapter customerDataAdapater = new SqlDataAdapter(commstring, connstring);

        DataSet customerDataSet = new DataSet();
        customerDataAdapater.Fill(customerDataSet, "Person.Person");

        DataTable customerDataTable = new DataTable();
        customerDataTable = customerDataSet.Tables[0];

        foreach (DataRow dataRow in customerDataTable.Rows)
        {
            customers.Items.Add(dataRow["FirstName"] + " (" + dataRow["LastName"] + ")");
        }
    }
}

Your connection string seems weird.....

Could you try using just this:

string commstring = "Server=DESKTOP-5T4MHHR\\SQLEXPRESS;Database=AdventureWorks2014;Trusted_Connection=Yes;";

Also: why are you first creating a DataSet , filling in a single set of data, and then extracting a DataTable from it?? This is unnecessarily complicated code - just use this instead:

SqlDataAdapter customerDataAdapater = new SqlDataAdapter(commstring, connstring);

// if you only ever need *one* set of data - just use a DataTable directly!
DataTable customerDataTable = new DataTable();

// Fill DataTable with the data from the query
customerDataAdapater.Fill(customerDataTable);

Update: I would really rewrite your code to something like this:

// create a separate class - call it whatever you like
public class DataProvider
{
    // define a method to provide that data to you
    public List<string> GetPeople()
    {
        // define connection string (I'd really load that from CONFIG, in real world)
        string connstring = "Server=MSEDTOP;Database=AdventureWorks2014;Trusted_Connection=Yes;";

        // define your query
        string query = "SELECT FirstName, LastName FROM Person.Person";

        // prepare a variable to hold the results
        List<string> entries = new List<string>();

        // put your SqlConnection and SqlCommand into "using" blocks
        using (SqlConnection conn = new SqlConnection(connstring))
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            conn.Open();

            // iterate over the results using a SqlDataReader
            using (SqlDataReader rdr = cmd.ExecuteReader())
            {
                while (rdr.Read())
                {
                    // get first and last name from current row of query
                    string firstName = rdr.GetFieldValue<string>(0);
                    string lastName = rdr.GetFieldValue<string>(1);

                    // add entry to result list
                    entries.Add(firstName + " " + lastName);
                }

                rdr.Close();
            }

            conn.Close();
        }

        // return the results
        return entries;
    }
}

And in your code-behind, you only need to do something like this:

protected override void OnLoad(.....)
{
    if (!IsPostback)
    {
        List<string> people = new DataProvider().GetPeople();

        customers.DataSource = people;
        customers.DataBind();
    }
}

but I still don't understand what you were trying to when the SelectedIndexChanged event happens.....

I tested your code in a sample project here and I realized you passed the parameters to SqlDataAdapter constructor in a wrong order.

After changing the follow line:

SqlDataAdapter customerDataAdapater = new SqlDataAdapter(commstring, connstring);

by

SqlDataAdapter customerDataAdapater = new SqlDataAdapter(connstring, commstring);

the listbox was filled successfully.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM