я пытаюсь сделать элемент базы данных дисплея (таблицы, строки, fk,...).
Я застрял на первых нескольких шагах. Я загрузил имена БД в DropDownList. Но я попытался загрузить таблицы из имени выбранной базы данных в CheckBoxList, но ничего не показывает.
Вот мои коды
aspx:
<form id = "form1" runat = "server" method = "get">
<div>
<asp:DropDownList ID = "drpListDBName" runat = "server" OnSelectedIndexChanged = "drpListDBName_SelectedIndexChanged">
</asp:DropDownList>
</div>
<div>
<asp:CheckBoxList ID = "chkListTable" runat = "server">
</asp:CheckBoxList>
</div>
aspx.cs:
public static String dbname = "";
protected void Page_Load(object sender, EventArgs e)
{
String query = "SELECT * FROM SYS.sysdatabases WHERE name != 'master'" +
" and name != 'tempdb'" +
" and name != 'model'" +
" and name != 'msdb'" +
" and name != 'distribution'";
Program.Connect();
if (!Page.IsPostBack)
{
drpListDBName.DataSource = Program.ExecSqlDataReader(query);
drpListDBName.DataTextField = "name";
drpListDBName.DataBind();
}
}
protected void drpListDBName_SelectedIndexChanged(object sender, EventArgs e)
{
dbname = drpListDBName.SelectedValue.Trim();
String query = "USE " + dbname +
" SELECT * FROM SYS.tables" +
" WHERE is_ms_shipped = 0";
Program.Connect();
if (chkListTable.Items.Count > 0)
chkListTable.Items.Clear();
chkListTable.DataSource = Program.ExecSqlDataReader(query);
chkListTable.DataTextField = "name";
chkListTable.DataBind();
Response.Write(chkListTable);
}
Я все еще новичок в asp.net. Заранее спасибо.
Хорошо, а вы могли бы отправить свой второй выбор (список таблиц) в список флажков? (и если вам нужно выбрать несколько таблиц - возможно, да).
но, давайте сделаем один лучше. Давайте используем два поля со списком. Сначала выберите базу данных, заполните второе поле со списком таблицами.
Затем вы выбираете таблицу и отображаете таблицу в сетке.
Итак, сначала (возможно) используется строка подключения. Мы можем предположить, что вы построили или настроили хотя бы одну рабочую строку подключения к одной из баз данных на этом сервере sql.
Итак, проект->"настройки имени моего проекта".
Вы получаете это:
Итак, я уже сделал несколько, но обратите внимание на кнопку [...], если вы нажмете на нее, VS запустит для вас построитель соединений (красиво и просто). И вы можете проверить соединение.
Итак, мы просто начинаем с использования TEST4. (обратите внимание, что это ДЕЙСТВИТЕЛЬНО помещает строку подключения автоматически в веб-конфигурацию для вас).
Хорошо, давайте добавим поле со списком (чтобы выбрать базу данных).
А затем наш список флажков.
Итак, у нас есть такая разметка:
<h4>Select Database</h4>
<asp:DropDownList ID = "DropDownList1" runat = "server" Width = "177px"
DataTextField = "name"
DataValueFeild = "name"
AutoPostBack = "true" OnSelectedIndexChanged = "DropDownList1_SelectedIndexChanged">
</asp:DropDownList>
<br />
<asp:CheckBoxList ID = "CheckBoxList1" runat = "server"
DataTextField = "TABLE_NAME"
DataValueField = "TABLE_NAME" >
</asp:CheckBoxList>
И теперь у нас есть этот код:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadData();
}
void LoadData()
{
Session["MyCon"] = Properties.Settings.Default.TEST4;
string query = "SELECT * FROM SYS.sysdatabases WHERE name != 'master'" +
" and name != 'tempdb'" +
" and name != 'model'" +
" and name != 'msdb'" +
" and name != 'distribution' ORDER BY Name";
DropDownList1.DataSource = MyRst(query);
DropDownList1.DataBind();
}
public DataTable MyRst(string strSQL)
{
var rst = new DataTable();
using (SqlConnection conn = new SqlConnection((Session["MyCon"] as string)))
{
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
conn.Open();
rst.Load(cmdSQL.ExecuteReader());
}
}
return rst;
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
// set connecting string from TEST4 to whatever database selected
string strCon = Session["MyCon"] as string;
string strDB = DropDownList1.SelectedItem.Value;
strCon = strCon.Replace("Initial Catalog = test4;", strDB);
Session["MyCon"] = strCon;
// now load check box list with all tables
string strSQL = @"SELECT TABLE_NAME FROM [" + strDB + "].INFORMATION_SCHEMA.TABLES " +
"WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_NAME";
CheckBoxList1.DataSource = MyRst(strSQL);
CheckBoxList1.DataBind();
}
Итак, теперь мы получаем это:
Итак, да, вы можете установить таблицу данных в список флажков. Но в некоторых из моих баз данных довольно много таблиц - слишком длинные (много) флажки.
Итак, давайте изменим наш код на два поля со списком.
Однако нам нужно «пожалуйста, выберите» для полей со списком.
Итак, наша разметка теперь такая:
<h4>Select Database</h4>
<asp:DropDownList ID = "DropDownList1" runat = "server" Width = "180px"
DataTextField = "name"
DataValueFeild = "name"
AutoPostBack = "true" OnSelectedIndexChanged = "DropDownList1_SelectedIndexChanged">
</asp:DropDownList>
<br />
<h4>Select Table</h4>
<asp:DropDownList ID = "DropDownList2" runat = "server" Width = "180"
DataTextField = "TABLE_NAME"
DataValueField = "TABLE_NAME"
AutoPostBack = "true" OnSelectedIndexChanged = "DropDownList2_SelectedIndexChanged"
>
</asp:DropDownList>
<asp:GridView ID = "GridView1" runat = "server" CssClass = "table">
</asp:GridView>
Наш код теперь такой:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
LoadData();
}
void LoadData()
{
Session["MyCon"] = Properties.Settings.Default.TEST4;
string query = "SELECT * FROM SYS.sysdatabases WHERE name != 'master'" +
" and name != 'tempdb'" +
" and name != 'model'" +
" and name != 'msdb'" +
" and name != 'distribution' ORDER BY Name";
DropDownList1.DataSource = MyRst(query);
DropDownList1.DataBind();
DropDownList1.Items.Insert(0, new ListItem("Please Select", ""));
}
public DataTable MyRst(string strSQL)
{
var rst = new DataTable();
using (SqlConnection conn = new SqlConnection((Session["MyCon"] as string)))
{
using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
{
conn.Open();
rst.Load(cmdSQL.ExecuteReader());
}
}
return rst;
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
// set connecting string from TEST4 to whatever database selected
string strCon = Session["MyCon"] as string;
string strDB = DropDownList1.SelectedItem.Value;
strCon = strCon.Replace("Initial Catalog = test4;", strDB);
Session["MyCon"] = strCon;
// now load 2nd cbo box list with all tables
string strSQL = @"SELECT TABLE_NAME FROM [" + strDB + "].INFORMATION_SCHEMA.TABLES " +
"WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_NAME";
DropDownList2.DataSource = MyRst(strSQL);
DropDownList2.DataBind();
DropDownList2.Items.Insert(0, new ListItem("Please Select", ""));
}
protected void DropDownList2_SelectedIndexChanged(object sender, EventArgs e)
{
// send results to the Grid
string strSQL = "SELECT * FROM [" + DropDownList2.SelectedItem.Value + "]";
GridView1.DataSource = MyRst(strSQL);
GridView1.DataBind();
}
И теперь мы получаем это:
Итак, я использовал рабочую строку подключения к данной базе данных. Я в значительной степени предполагал, что одна и та же информация может и будет подключаться ко всем из них, поэтому я заменил имя базы данных TEST4 на любое, которое мы выберем.
Огромное спасибо. Это именно то, что мне нужно. Еще не нашел применения для второго решения, но я очень ценю его, и я буду использовать его в будущем. Хорошего дня.