[英]Check if table exists in c#
我想从用户提供名称的表中读取数据。 因此,在实际开始读取数据之前,我想检查数据库是否存在。
我在NET上看到了几段声称可以做到这一点的代码。 但是,它们似乎都只适用于SQL Server,MySQL或其他实现。 有没有通用的方法可以做到这一点?
(我已经在单独检查是否可以连接到提供的数据库,因此,我相当确定可以打开与数据库的连接。)
您不能以跨数据库的方式执行此操作。 通常,DDL(即用于创建表,索引等的代码)在数据库之间完全不同,因此检查表是否存在的逻辑也不同。
我想说,最简单的答案就是:
SELECT * FROM <table> WHERE 1 = 0
如果该查询给出错误,则该表不存在。 如果工作正常(尽管它将返回0行),则该表存在。
但是,请务必小心让用户输入的内容。 是什么阻止他将“ sysusers”指定为表名(在SQL Server中,它将是所有数据库用户的列表)
您可以使用DbConnection.GetSchema系列方法检索有关数据库的元数据。 它将返回带有模式对象的DataTable。 确切的对象类型和限制值可能因供应商而异,但是我敢肯定,您可以以适用于大多数数据库的方式来设置对特定表的检查。
这是一个使用GetSchema的示例,该示例将打印“模式名称”拥有并称为“表名称”的每个表的名称和所有者。 这是针对oracle测试的。
static void Main(string[] args)
{
string providerName = @"System.Data.OracleClient";
string connectionString = @"...";
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
using (DbConnection connection = factory.CreateConnection())
{
connection.ConnectionString = connectionString;
connection.Open();
DataTable schemaDataTable = connection.GetSchema("Tables", new string[] { "schema name", "table name" });
foreach (DataColumn column in schemaDataTable.Columns)
{
Console.Write(column.ColumnName + "\t");
}
Console.WriteLine();
foreach (DataRow row in schemaDataTable.Rows)
{
foreach (object value in row.ItemArray)
{
Console.Write(value.ToString() + "\t");
}
Console.WriteLine();
}
}
}
这就像在数据库中询问“是否有一种获取相关数据的通用方法”。 答案当然不是-唯一的“通用方法”是拥有一个隐藏您特定数据源的实现细节并适当查询的数据层。
如果您真的在没有Stategy设计模式或类似方法的情况下支持和访问许多不同类型的数据库,我会感到非常惊讶。
话虽如此,最好的方法是这样的代码:
bool exists;
try
{
// ANSI SQL way. Works in PostgreSQL, MSSQL, MySQL.
var cmd = new OdbcCommand(
"select case when exists((select * from information_schema.tables where table_name = '" + tableName + "')) then 1 else 0 end");
exists = (int)cmd.ExecuteScalar() == 1;
}
catch
{
try
{
// Other RDBMS. Graceful degradation
exists = true;
var cmdOthers = new OdbcCommand("select 1 from " + tableName + " where 1 = 0");
cmdOthers.ExecuteNonQuery();
}
catch
{
exists = false;
}
}
来源: 检查是否存在SQL表
您可以执行以下操作:
string strCheck = "SHOW TABLES LIKE \'tableName\'";
cmd = new MySqlCommand(strCheck, connection);
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
cmd.Prepare();
var reader = cmd.ExecuteReader();
if (reader.HasRows)
{
Console.WriteLine("Table Exist!");
}
else (reader.HasRows)
{
Console.WriteLine("Table Exist!");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.