Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当数据库表有0行时,如何检查该表是否存在?_C#_Sql Server_Database_Datareader - Fatal编程技术网

C# 当数据库表有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,

编辑:很抱歉浪费大家的时间,下面的代码显示我刚刚忘记了C_表上的“C”,更正后效果很好

在以下代码中,如果数据库中存在该表,则exist应==1。但是,它为我返回0,即使该表存在于数据库中。我不知道为什么会这样

谢谢:

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非常糟糕,特别是当我们只想知道一件非常简单的事情存在时