C# 当数据库表有0行时,如何检查该表是否存在?
编辑:很抱歉浪费大家的时间,下面的代码显示我刚刚忘记了C_表上的“C”,更正后效果很好 在以下代码中,如果数据库中存在该表,则exist应==1。但是,它为我返回0,即使该表存在于数据库中。我不知道为什么会这样 谢谢:C# 当数据库表有0行时,如何检查该表是否存在?,c#,sql-server,database,datareader,C#,Sql Server,Database,Datareader,编辑:很抱歉浪费大家的时间,下面的代码显示我刚刚忘记了C_表上的“C”,更正后效果很好 在以下代码中,如果数据库中存在该表,则exist应==1。但是,它为我返回0,即使该表存在于数据库中。我不知道为什么会这样 谢谢: foreach (var row in calcSched) { var dif3 = new DataInterfaceFactory(DatabaseTypes.SqlServer, row.DatabaseName,
foreach (var row in calcSched)
{
var dif3 = new DataInterfaceFactory(DatabaseTypes.SqlServer, row.DatabaseName, row.ServerName);
using (DataReader dr2 = dif3.GetDataReader())
{
dr2.ExecuteReader("SELECT COUNT(1) AS TABLECOUNT2 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'C_TABLE'");
var exists = Convert.ToInt32(dr2["TABLECOUNT2"]);
CommandExecutor CE = dif3.GetCommandExecutor();
try
{
if (exists == 0)
{
string sql = "CREATE TABLE dbo.C_TABLE(COLUMN_UID INT, KIP INT, SD_DATE DATE, ST INT, CS_DATE DATE, CE_DATE DATE, SM CHAR(100), PRG CHAR(20)";
CE.ExecuteNonQuery(sql);
}
}
catch (Exception ex)
{
Console.WriteLine("Error: could not create C_TABLE");
}
}
}
据我所知,这是MS SQL Server。您可以直接查询sys.tables。即:
select case when exists ( select *
from sys.tables
where [name] = 'YourTableName'
and is_ms_shipped = 0 ) then 1 else 0 end;
还可以直接使用GetSchema查询连接。即:
void Main()
{
string strCon =
@"server=.\sqlexpress;database=Northwind;Trusted_connection=yes";
DataTable schemaInfo;
string[] restrictions = {"Northwind",null,null,"BASE TABLE"};
using( SqlConnection con = new SqlConnection(strCon))
{
con.Open();
schemaInfo = con.GetSchema("Tables", restrictions );
con.Close();
}
// schemaInfo datatable contains all tables
}
PS:您误导了人们,好像这是检查MS SQL Server中是否存在表的一种方式,从而导致一些人以正确的方式否决投票。您使用的是ExecuteReader,然后,您试图访问其中的数据,而无需先执行dr2.Read。我的理解是,至少需要有一行才能返回1-我不会这么认为,不;只要存在一个空表,它就应该工作;你验证过这个假设吗?我刚刚做到了:伯爵很成功。。在空行上,集合总是存在的,显然是0。ExecuteScalar是您所需要的一切。@Jeroenmoster是的,但它使用异常作为否,它不存在-通常不是一个好主意,但是。。。我相信这会管用的guess@LasseV抱歉,我完全错了。我已经编辑了这个问题。因为该表存在,所以它应该返回1,而不是0。目前,由于它返回0,并且由于表已经存在而无法创建该表,因此抛出了一个错误。如果您发布的代码是正确的,请检查DataReader实际是什么以及ExecuteReader应该做什么。看起来这不是使用ADO.NET标准类,而是一些自定义层,它可以对您的查询执行各种有趣的操作-它可以以人类未知的方式包装或破坏查询。你也可能只是去了一个错误的服务器或数据库,再次基于一些动态配置,我们没有看到这里。好眼睛!然而,我对这个问题的评论可能是务实的,我只是简单地切换到ExecuteScalar,以避免一些其他相关的问题,而不是我的否决票,但我认为它被否决的原因是因为具体的查询不是这里的问题-已经显示的查询是好的;因此,我们可以合理地假设,更改查询实际上不会help@MarcGravell,我不会更改查询。简单地展示正确的方法。为什么他应该尝试使用错误的方法?这种方法并不比查询信息模式更正确;是的,您更改了查询completely@MarcGravell,这是正确的方法。不管你喜不喜欢。上面有人已经提供了一个链接信息,但这个模式不可靠。我可以看出我们对此并不同意,但是:这两种方法都可以很好地工作,这并不是说我们需要额外的列,而这些列只存在于表中,而不存在于视图中;查询不是问题所在,因此提出不同的查询是没有帮助的。我肯定会说,使用GetSchema是一个坏主意,但是,对于这个场景来说,完全是杀伤力过大,加上使用API非常糟糕,特别是当我们只想知道一件非常简单的事情存在时