我正在尝试用一个小型数据库“玩”并制作一个应该使用我提供的信息连接到数据库的程序(该部分工作正常)
登录后,程序的另一部分应连接到数据库并执行以下两项操作: 1.获取所有表名并将其放入组合框中 2.获取表的所有列名(从组合框中选择)并将其显示在列表框中
我计划检查列名并使用它在表上运行不同的SQL命令
我的问题是我无法使其发挥作用
从stackoverflow和google搜索其他示例,我知道我错过了一些小东西,这使得这个东西不起作用,但我不知道是什么。
向我们提供更多信息的人请求帮助
用于组合框
private void listTables()
{
const string query = "SELECT * FROM [dstut].sys.Tables";
SqlConnection sqlConn = new SqlConnection(lw.ConnectionString);
sqlConn.Open();
SqlCommand cmd = new SqlCommand(query, sqlConn);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds);
List<string> l = new List<string>();
foreach (DataRow dr in ds.Tables[0].Rows)
{
l.Add(dr[0].ToString());
}
cbTables.DataSource = l;
}
public DataSet GetAllColumns()
{
string query = "SELECT name FROM " + TableName;
SqlConnection sqlConn = new SqlConnection(lw.ConnectionString);
sqlConn.Open();
SqlCommand cmd = new SqlCommand(query, sqlConn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
foreach (DataRow dr in ds.Tables[0].Rows)
{
MessageBox.Show(Convert.ToString(dr["Field_1"]));
}
return ds;
}
答案 0 :(得分:2)
前两个子部分可以使用以下方法使其工作。而对于最后一部分,您必须使用自己的UI。请注意,您不是第一个创建Query Expression Builder
工具的人。所以值得检查或谷歌免费/开源Query Expression Builder
工具。
使用以下查询返回已连接数据库中的所有表,并将其绑定到您的第一个组合。
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'
您可以执行以下查询以返回第一个组合中所选列的所有列
SELECT COLUMN_NAME, * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='SelectedValueFromCombo1' ORDER BY ORDINAL_POSITION
答案 1 :(得分:0)
我使用SMO来提取信息。
public class SqlDatabaseAdapter
{
private readonly ServerConnection _serverConnection;
public SqlDatabaseAdapter(string connectionString)
{
_serverConnection = new ServerConnection(new SqlConnection(connectionString));
}
public DataSet GetTables(string databaseName = "master")
{
var server = new Server(_serverConnection);
var database = server.Databases.Cast<Database>().FirstOrDefault(d => d.Name == databaseName);
var dataSet = new DataSet(databaseName);
if (database == null) return dataSet;
foreach (var table in database.Tables.Cast<Table>())
{
var dataTable = new DataTable(table.Name);
FillColumns(table, dataTable);
dataSet.Tables.Add(dataTable);
}
return dataSet;
}
public DataTable GetTable(string tableName, string databaseName = "master")
{
var server = new Server(_serverConnection);
var database = server.Databases.Cast<Database>().FirstOrDefault(d => d.Name == databaseName);
var dataTable = new DataTable(tableName);
if (database == null) return dataTable;
database.Refresh();
var table = database.Tables.Cast<Table>().FirstOrDefault(f => f.Name == tableName);
if (table == null) return dataTable;
FillColumns(table, dataTable);
return dataTable;
}
private static void FillColumns(Table table, DataTable dataTable)
{
foreach (Column column in table.Columns)
{
var type = ConvertToClrType(column.DataType.SqlDataType, column.Nullable);
var dataColumn = new DataColumn(column.Name, type);
dataTable.Columns.Add(dataColumn);
}
}
private static Type ConvertToClrType(SqlDataType sqlDataType, bool nullable)
{
switch (sqlDataType)
{
case SqlDataType.BigInt:
return nullable ? typeof (long?) : typeof (long);
case SqlDataType.Binary:
case SqlDataType.Image:
case SqlDataType.Timestamp:
case SqlDataType.VarBinary:
return typeof (byte[]);
case SqlDataType.Bit:
return nullable ? typeof (bool?) : typeof (bool);
case SqlDataType.Char:
case SqlDataType.NChar:
case SqlDataType.NText:
case SqlDataType.NVarChar:
case SqlDataType.Text:
case SqlDataType.VarChar:
case SqlDataType.Xml:
return typeof (string);
case SqlDataType.DateTime:
case SqlDataType.SmallDateTime:
case SqlDataType.Date:
case SqlDataType.Time:
case SqlDataType.DateTime2:
return nullable ? typeof (DateTime?) : typeof (DateTime);
case SqlDataType.Decimal:
case SqlDataType.Money:
case SqlDataType.SmallMoney:
case SqlDataType.Numeric:
return nullable ? typeof (decimal?) : typeof (decimal);
case SqlDataType.Float:
return nullable ? typeof (double?) : typeof (double);
case SqlDataType.Int:
return nullable ? typeof (int?) : typeof (int);
case SqlDataType.Real:
return nullable ? typeof (float?) : typeof (float);
case SqlDataType.UniqueIdentifier:
return nullable ? typeof (Guid?) : typeof (Guid);
case SqlDataType.SmallInt:
return nullable ? typeof (short?) : typeof (short);
case SqlDataType.TinyInt:
return typeof (byte?);
case SqlDataType.Variant:
return typeof (object);
case SqlDataType.DateTimeOffset:
return nullable ? typeof (DateTimeOffset?) : typeof (DateTimeOffset);
default:
throw new ArgumentOutOfRangeException("sqlDataType");
}
}
}