Как проверить, существует ли таблица базы данных, когда в таблице 0 строк? - PullRequest
0 голосов
/ 28 января 2019

РЕДАКТИРОВАТЬ: Извините за трату времени каждого, код ниже показывает, что я только что забыл 'C' на PMS_CALC_SCHEDULE, после исправления он отлично работает.

В следующем коде "существовать" следует == 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 = 'PMS_CAL_SCHEDULE'");
                    var exists = Convert.ToInt32(dr2["TABLECOUNT2"]);
                    CommandExecutor CE = dif3.GetCommandExecutor();

                    try
                    {
                        if (exists == 0)//if table doesn't exist create it
                        {
                            string sql = "CREATE TABLE dbo.PMS_CAL_SCHEDULE(CALCULATION_SCHEDULE_UID INT, USER_UID INT, SCHEDULE_DATE DATE, PMS_CALC_STATUS_UID INT, CALCULATION_START_DATE DATE, CALCULATION_END_DATE DATE, STATUS_MESSAGE CHAR(100), PROGRESS CHAR(20)";
                            CE.ExecuteNonQuery(sql);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error: could not create PMS_CALC_SCHEDULE");
                    }
                }
            }

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы используете ExecuteReader, а затем пытаетесь получить доступ к данным в нем, не выполнив сначала dr2.Read().

0 голосов
/ 28 января 2019

Это 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, и, таким образом, заставляет некоторых людей понижать голос правильным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...