下拉列表和数据阅读器

发布于 2024-08-28 04:37:51 字数 4165 浏览 2 评论 0原文

在尝试了互联网上列出的许多解决方案之后,我现在非常困惑。我有一个 C#/SQL Web 应用程序,我只是尝试将 ExecuteReader 命令绑定到 Dropdownlist,以便用户可以选择一个值。这是 XP 操作系统上的 VS2008 项目。

它的工作原理是在用户选择一个表后,我使用此选择作为 Datamatch.aspx.cs 文件中的方法的输入参数。然后,此 Datamatch.aspx.cs 文件调用我的 ADONET.cs 类文件中的方法。最后,此方法执行 SQL 过程以返回该表中的列列表。 (这些都是 Adventureworks DB 中的表)。我知道如果我在 SSMS 中执行此 SP,此方法会成功返回列列表。但是,我不知道如何判断它在 VS 中是否有效。

这应该很简单。我该怎么做?这是我的一些代码。 T-SQL 存储过程:

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

当我从 SSMS 执行以下操作时,它会提供所需的输出: exec getColumnNames 'AddressType'

Datamatch.aspx.cs 文件中的代码当前为:

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();
}

}

私有无效 CreateLabels() { for (int counter = 0; counter < NumberOfControls; counter++) { 标签 lbl = new Label(); lbl.ID = "标签" + counter.ToString(); lbl.Text = headers[计数器]; lbl.Style["位置"] = "绝对"; 如果(计数器 < 7) { lbl.Style["top"] = 100 * 计数器 + 50 + "px"; lbl.Style["左"] = 250 + "px"; } 否则如果(计数器> = 7) { lbl.Style["top"] = (100 * counter) - 650 + "px"; lbl.Style["左"] = 550 + "px"; 其中

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

上面

ADONET_methods.DisplayTableColumns(targettable) 是:

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

的 CreateLabels 方法正确地显示了标签。但 CreateDropDownLists 方法只向我显示一个下拉列表,其中没有任何内容。换句话说,它是不可选择的。 那么我如何验证数据读取器是否返回所有 4 列并检查它们的值?我能够从数据读取器“COLUMN_NAME”中找到,但我不知道要搜索哪些属性来验证列名称。

After trying many solutions listed on the internet I am very confused now. I have a C#/SQL web application for which I am simply trying to bind an ExecuteReader command to a Dropdownlist so the user can select a value. This is a VS2008 project on an XP OS.

How it works is after the user selects a table, I use this selection as an input parameter to a method from my Datamatch.aspx.cs file. Then this Datamatch.aspx.cs file calls a method from my ADONET.cs class file. Finally this method executes a SQL procedure to return the list of columns from that table. (These are all tables in Adventureworks DB). I know that this method returns successfully the list of columns if I execute this SP in SSMS. However, I'm not sure how to tell if it works in VS or not.

This should be simple. How can I do this? Here is some of my code. The T-sQL stored 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

It gives me desired output when I execute following from SSMS: exec getColumnNames 'AddressType'

And the code from Datamatch.aspx.cs file currently is:

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 counter = 0; counter < NumberOfControls; counter++)
{
Label lbl = new Label();
lbl.ID = "Label" + counter.ToString();
lbl.Text = headers[counter];
lbl.Style["position"] = "absolute";
if (counter < 7)
{
lbl.Style["top"] = 100 * counter + 50 + "px";
lbl.Style["left"] = 250 + "px";
}
else if (counter >= 7)
{
lbl.Style["top"] = (100 * counter) - 650 + "px";
lbl.Style["left"] = 550 + "px";
}

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

}

Where ADONET_methods.DisplayTableColumns(targettable) is:

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

The CreateLabels method above correctly shows me the labels. But the CreateDropDownLists method just shows me one dropdownlist with nothing in it. In other words, it is not selectable.
So how can I verify that the datareader is returning all 4 columns and inspect their values? I was able to find from datareader "COLUMN_NAME" but I don't know what properties to search to verify the column names.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

难以启齿的温柔 2024-09-04 04:37:51

看起来您实际上并未在此代码中的任何位置绑定下拉列表。您需要执行如下操作:

ddl.DataTextField = "COLUMN_NAME";
ddl.DataValueField = "COLUMN_NAME";
ddl.DataSource = dr.ExecuteReader();
ddl.DataBind();

或者,您可以使用 SqlDataSource 控件在页面标记中完成这一切。

  <asp:SqlDataSource
      id="SqlDataSource1"
      runat="server"
      DataSourceMode="DataSet"
      ConnectionString="myConnString"
      SelectCommand="myStoredProcedure"
      >
  </asp:SqlDataSource>

  <asp:MyDropDownList id="ddl" runat="server" DataSource="SqlDataSource1"
       DataTextField="COLUMN_NAME" DataValueField="COLUMN_NAME" />

It doesn't look like you're actually binding the dropdown anywhere in this code. You need to do something like this:

ddl.DataTextField = "COLUMN_NAME";
ddl.DataValueField = "COLUMN_NAME";
ddl.DataSource = dr.ExecuteReader();
ddl.DataBind();

Alternately, you can do this all in your page markup by using a SqlDataSource control.

  <asp:SqlDataSource
      id="SqlDataSource1"
      runat="server"
      DataSourceMode="DataSet"
      ConnectionString="myConnString"
      SelectCommand="myStoredProcedure"
      >
  </asp:SqlDataSource>

  <asp:MyDropDownList id="ddl" runat="server" DataSource="SqlDataSource1"
       DataTextField="COLUMN_NAME" DataValueField="COLUMN_NAME" />
雨后咖啡店 2024-09-04 04:37:51

在返回 dr 之前的 ADONET_methods.DisplayTableColumns(targettable) 方法中,检查是否使用断点为 dr.GetValue() 获取了一些值

string temp;
while(dr.Read())
{
    temp = dr.GetValue();  //use a breakpoint here
}

另外,您可以更好地使用 dataAdapter 直接填充 dataTable,而不是使用 dataReader 并将其加载到 dataTable

public static DataTable DisplayTableColumns(string tt) 
{ 
    Datatable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter();

    try 
    { 
        da.Fill(dt); 
    } 
    catch (Exception ex) 
    { 
        errorMsg = ex.Message; 
    } 

    string temp;
    foreach(DataRow row in dt.Rows)
    {
        foreach(DataColumn column in dt.Columns)
        {
            temp = (row[column]);  // use your breakpoint here
        }
    }

    return dt; 
} 

In the ADONET_methods.DisplayTableColumns(targettable) method before returning dr, check if you get some value for dr.GetValue() using a breakpoint

string temp;
while(dr.Read())
{
    temp = dr.GetValue();  //use a breakpoint here
}

Also instead of using dataReader and loading it to dataTable, you can better use a dataAdapter to fill the dataTable directly

public static DataTable DisplayTableColumns(string tt) 
{ 
    Datatable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter();

    try 
    { 
        da.Fill(dt); 
    } 
    catch (Exception ex) 
    { 
        errorMsg = ex.Message; 
    } 

    string temp;
    foreach(DataRow row in dt.Rows)
    {
        foreach(DataColumn column in dt.Columns)
        {
            temp = (row[column]);  // use your breakpoint here
        }
    }

    return dt; 
} 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文