如何在c#中获得数据库(sql)表名和列以组合和列表框
本文关键字:列表 组合 sql 数据库 | 更新日期: 2023-09-27 18:15:51
我正试图"玩"一个小数据库,并做了一个程序,应该连接到一个数据库使用信息我给它(那部分工作良好)
登录后,程序的另一部分应该连接到数据库并做两件事: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;
}
我使用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");
}
}
}
前两个子部分可以使用以下方法完成。最后一部分,你需要使用自己的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