2016-06-28 13 views
0

Versuchen, eine Verbindung zu meiner lokalen SQL Server Express-Instanz einzurichten, so dass ich Spalten in einer Listbox anzeigen kann. Th Build läuft gut und ich kann keine Fehler sehen, aber es gibt keine Daten in der Listbox. Ich habe die Abfrage getestet und das ist in Ordnung. Ich verwende NT-Authentifizierung für die Datenbank. Irgendwelche Ideen, wo ich vielleicht falsch gelaufen bin?Verbindung mit SQL Server über ADO.NET - leere Listbox

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"] + ")"); 
     } 
    } 
} 
+0

Ihre Datenbank ist ** AdventureWorks2014 **, aber Sie verwenden ** Person.Person **. Wie? Das sollte ** AdventureWorks2014.Person ** sein. – Berkay

+2

@BerkayYaylaci Es gibt nichts falsch mit dem Tabellennamen, das OP ist im Schema der Tabelle angegeben. In der Tat, "AdventureWorks2014.Person" würde falsch sein, müssten Sie eingeben "AdventureWorks2014.dbo.Person" –

+0

@ PanagiotisKanavos danke, guter Punkt. – Berkay

Antwort

1

Ich habe Ihren Code in einem Beispielprojekt hier getestet und ich erkannte, dass Sie die Parameter an SqlDataAdapter-Konstruktor in einer falschen Reihenfolge übergeben.

Nach Änderung der Folgezeile:

SqlDataAdapter customerDataAdapater = new SqlDataAdapter(commstring, connstring); 

von

SqlDataAdapter customerDataAdapater = new SqlDataAdapter(connstring, commstring); 

die Listbox wurde erfolgreich gefüllt.

1

Ihre Verbindung String seltsam scheint .....

Könnten Sie versuchen, mit gerade dies:

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

auch: warum sind Sie zuerst eine DataSet Erstellen in einem einzigen Satz Füllung von Daten, und dann eine DataTable daraus extrahieren ?? Dies ist unnötig kompliziert Code - dies nur statt:

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: ich wirklich Ihren Code so etwas wie dies umschreiben würde:

// 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; 
    } 
} 

Und in Ihrem Code-behind, brauchen Sie nur

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

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

aber ich verstehe immer noch nicht, was Sie versuchen, wenn die SelectedInde: so etwas zu tun xChanged Ereignis passiert .....

+0

Danke, dass du mir einen einfacheren Weg gezeigt hast. Ich habe das obige versucht, aber es ist immer noch leer. Irgendwelche Ideen? –

+0

Also habe ich auch einen Versuch Fang auf eine Schaltfläche hinzugefügt, die, wenn gedrückt, öffnet die SQL-Verbindung und wenn es erfolgreich zeigt es eine Nachricht, die sagt, so viel und das hat funktioniert. So kann es sich verbinden. Die Verbindungszeichenfolge ist in Ordnung. Ist die Abfrage? Versuchte mehrere Tabellen und immer noch nichts –

+0

@NickProud: was ich nicht ganz verstehe ist, was Sie wirklich versuchen zu erreichen .... jedes Mal, wenn Sie die Auswahl Ihrer "Kunden" Listbox ändern, gehen Sie raus und bekommen alle die Daten nochmal .......scheint etwas übertrieben. Was versuchst du wirklich? –