Dropdownlist et Datareader

Après avoir essayé de nombreuses solutions listées sur internet, je suis très confus pour l'instant. J'ai un C#/SQL application web pour laquelle je suis simplement en train d'essayer de lier un ExecuteReader commande pour un Dropdownlist de sorte que l'utilisateur peut sélectionner une valeur. C'est un VS2008 projet sur un XP OS.

Comment il fonctionne, c'est une fois que l'utilisateur sélectionne une table, j'ai utiliser cette sélection comme un paramètre d'entrée d'une méthode à partir de mon Datamatch.aspx.cs fichier. Puis ce Datamatch.aspx.cs fichier appelle une méthode de mon ADONET.cs fichier de classe. Enfin, cette méthode exécute une procédure SQL pour revenir à la liste des colonnes de la table. (Ce sont toutes les tables dans la base de données Adventureworks DB). Je sais que cette méthode retourne avec succès la liste des colonnes si j'exécute cette SP dans SSMS. Cependant, je ne suis pas sûr de la façon de dire si cela fonctionne en VS ou pas.

Cela devrait être simple. Comment puis-je faire cela? Ici est une partie de mon code. Le T-sQL stockées proc:

CREATE PROCEDURE [dbo].[getColumnNames]
@TableName VarChar(50) AS
BEGIN
SET NOCOUNT ON;
SELECT col.name 'COLUMN_NAME' FROM sysobjects obj
INNER JOIN syscolumns col ON obj.id = col.id
WHERE obj.name = @TableName
END

Il me donne de la sortie souhaitée lorsque j'exécute la suite de SSMS: exec getColumnNames 'AddressType'

Et le code de Datamatch.aspx.cs fichier actuellement est:

private void CreateDropDownLists()
{
SqlDataReader dr2 = ADONET_methods.DisplayTableColumns(targettable);

int NumControls = targettable.Length;
DropDownList ddl = new DropDownList();
DataTable dt = new DataTable();
dt.Load(dr2);
ddl.DataValueField = "id";
ddl.DataTextField = "text";
ddl.DataSource = dt;
ddl.DataBind();
for (int counter = 0; counter < NumberOfControls; counter++)
{
ddl.ID = "DropDownListID " + (counter + 1).ToString();
btnSubmit.Style.Add("top", "auto");
btnSubmit.Style.Add("left", "auto");
btnSubmit.Style.Add("position", "absolute");
if (counter < 7)
{
ddl.Style["top"] = 100 * counter + 80 + "px";
ddl.Style["left"] = 250 + "px";
int bSubmitPosition = NumberOfControls * 100 + 80;
btnSubmit.Style.Add("top", System.Convert.ToString(bSubmitPosition) + "px");
}
else if (counter >= 7)
{
ddl.Style["top"] = 100 * counter - 620 + "px";
ddl.Style["left"] = 550 + "px";
int bSubmitPosition = NumberOfControls * 100 - 620;
btnSubmit.Style.Add("top", System.Convert.ToString(bSubmitPosition) + "px");
}
ddl.SelectedIndexChanged += new EventHandler(SelectedIndexChanged);
ddl_ht.Add(counter, ddl.SelectedValue);
pnlDisplayData.Controls.Add(ddl);
pnlDisplayData.Controls.Add(new LiteralControl("<br><br><br>"));
pnlDisplayData.Visible = true;
pnlDisplayData.FindControl(ddl.ID);
// dr.Close();
}

}

private void CreateLabels()
{
for (int compteur = 0; compteur < NumberOfControls; compteur++)
{
Étiquette lbl = new Label();
lbl.ID = "Label" + compteur.ToString();
lbl.Texte = en-têtes[compteur];
lbl.Style["position"] = "absolute";
if (compteur < 7)
{
lbl.Style["top"] = 100 * compteur + 50 + "px";
lbl.Style["gauche"] = 250 + "px";
}
else if (compteur >= 7)
{
lbl.Style["top"] = (100 * compteur) - 650 + "px";
lbl.Style["gauche"] = 550 + "px";
}

    pnlDisplayData.Controls.Add(lbl);
pnlDisplayData.Controls.Add(new LiteralControl("<br><br><br>"));
}

}

Où ADONET_methods.DisplayTableColumns(targettable) est:

public static SqlDataReader DisplayTableColumns(string tt)
{
SqlDataReader dr = null;
string TableName = tt;
string connString = "Server=(local);Database=AdventureWorks;Integrated Security = SSPI";
string errorMsg;
SqlConnection conn2 = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand("getColumnNames");  //conn2.CreateCommand();
try
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn2;
SqlParameter parm = new SqlParameter("@TableName", SqlDbType.VarChar);
parm.Value = "Person." + TableName.Trim();
parm.Direction = ParameterDirection.Input;
cmd.Parameters.Add(parm);
conn2.Open();
dr = cmd.ExecuteReader();
}
catch (Exception ex)
{
errorMsg = ex.Message;
}
return dr;
}

La CreateLabels méthode ci-dessus montre bien à moi les étiquettes. Mais le CreateDropDownLists méthode me montre un dropdownlist avec rien dedans. En d'autres termes, il n'est pas sélectionnable.
Alors, comment puis-je vérifier que le datareader est de retour tous les 4 colonnes et inspecter leurs valeurs? J'ai été en mesure de trouver de datareader "COLUMN_NAME" mais je ne sais pas quelles sont les propriétés de recherche pour vérifier les noms de colonne.

  • Est-il un message d'erreur à un certain point?
  • Juste un avis, SqlDataReaders sont IDisposable et vraiment vraiment ne pas laisser le champ où ils ont été créés, en particulier de ne pas remplir une liste déroulante. Vous devriez viens de lire toutes les données dans une mémoire de collecte et de retour que.
  • Pas d'erreurs. Mais il n'est qu'un dropdownlist montrant maintenant et il est vide! Romanarmy, pouvez-vous expliquer plus sur la façon de faire cela? Je mets à jour ma question ci-dessus lors de ma dernière tentative.