Попробовав множество решений, перечисленных в интернете, я очень растерялся У меня есть веб-приложение на C # / SQL, для которого я просто пытаюсь связать команду ExecuteReader с выпадающим списком, чтобы пользователь мог выбрать значение. Это проект VS2008 на ОС XP.
Как это работает, когда пользователь выбирает таблицу, я использую этот выбор в качестве входного параметра для метода из моего файла Datamatch.aspx.cs. Затем этот файл Datamatch.aspx.cs вызывает метод из моего файла класса ADONET.cs. Наконец, этот метод выполняет процедуру SQL, чтобы вернуть список столбцов из этой таблицы. (Это все таблицы в БД Adventureworks). Я знаю, что этот метод успешно возвращает список столбцов, если я выполняю этот SP в SSMS. Однако я не уверен, как определить, работает ли он в VS или нет.
Это должно быть просто. Как я могу это сделать? Вот часть моего кода. T-sQL, хранимый 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
Это дает мне желаемый вывод, когда я выполняю следующее из 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();
}
}
private void CreateLabels ()
{
for (int counter = 0; 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>"));
}
} * * тысяча двадцать-один
Где 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", но я не знаю, какие свойства искать для проверки имен столбцов.