在尝试了互联网上列出的许多解决方案之后,我现在非常困惑。我有一个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文件的代码当前为:
私人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();
}
}
私人void CreateLabels()
{
for(int计数器= 0;计数器 {
标签lbl = new Label();
lbl.ID =“标签” + counter.ToString();
lbl.Text =标头[计数器];
lbl.Style [“ position”] =“绝对”;
如果(计数器 {
lbl.Style [“ top”] = 100 *计数器+ 50 +“ px”;
lbl.Style [“ left”] = 250 +“ px”;
}
否则,如果(计数器> = 7)
{
lbl.Style [“ top”] =(100 *计数器)-650 +“ px”;
lbl.Style [“ left”] = 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”中找到,但是我不知道要搜索哪些属性来验证列名。
最佳答案
看起来您实际上并没有在此代码中的任何地方绑定下拉列表。您需要执行以下操作:
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" />
关于c# - 下拉列表和数据读取器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2604117/