使用命令检查表是否存在

时间:2017-03-17 13:55:08

标签: c# sql-server

我正在尝试编写一个方法来检查表是否存在。我正在尝试使用using语句使其在我的数据库中保持一致。

public void checkTableExists()
{
    connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\keith_000\Documents\ZuriRubberDressDB.mdf;Integrated Security=True;Connect Timeout=30";

    string tblnm = "BasicHours";
    string str = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = " + tblnm + ");";

    SqlDataReader myReader = null;
    int count = 0;

    try
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            using (SqlCommand command = new SqlCommand(str, connection))
            {
                connection.Open();

                using (SqlDataReader reader = command.ExecuteReader())
                {
                    MessageBox.Show("The count is " + count);

                    myReader = command.ExecuteReader();

                    while (myReader.Read())
                    {
                        count++;
                    }

                    myReader.Close();

                    MessageBox.Show("Table Exists!");
                    MessageBox.Show("The count is " + count);
                }

                connection.Close();
            }
        }
    }
    catch (SqlException ex)
    {
        MessageBox.Show("Sql issue");
    }
    catch (Exception ex)
    {
        MessageBox.Show("Major issue");
    }

    if (count > 0)
    {
        MessageBox.Show("Table exists");
    }
    else
    {
        MessageBox.Show("Table doesn't exists");
    }
}

它在遇到try块时抛出异常。它捕获SqlException块。

这是我学习再次与数据库交互的地方。解决方案很好,但更重要的是,简要说明我需要学习如何改进代码。

由于

基思

4 个答案:

答案 0 :(得分:7)

您的代码失败,因为当您直接编写搜索字符串值的查询时,此值应包含在单引号中,例如' BasicHours'。

但是,对您的实际代码有一些改进 首先,您可以使用简化的sql命令 其次,您使用参数而不是字符串连接。

SqlCommand cmd = new SqlCommand(@"IF EXISTS(
  SELECT 1 FROM INFORMATION_SCHEMA.TABLES 
  WHERE TABLE_NAME = @table) 
  SELECT 1 ELSE SELECT 0", connection);

cmd.Parameters.Add("@table", SqlDbType.NVarChar).Value = tblName;
int exists = (int)cmd.ExecuteScalar();
if(exists == 1)
    // Table exists

此命令文本不要求您使用SqlDataReader,因为查询只返回一行,其中包含一行''并且该单个单元格的值为1或0 开销要少得多。

这一部分,最重要的是,你永远不会构建连接字符串的SQL查询。众所周知,这种方法会引起问题。 更糟糕的是SQL Injection,可能会破坏您的数据库或向黑客泄露机密信息。当串联的字符串包含单引号时,次要的是崩溃。始终使用参数化查询。

答案 1 :(得分:1)

我在我的项目中使用了以下代码并为我工作:

 try
 {
     using (con = new SqlConnection(Constr);)
        {
            con.Open();
            string query = $"IF EXISTS (SELECT * FROM sys.tables WHERE name = '{tableName}') SELECT 1 ELSE Select 0;"
             Exists = int.Parse(sqlQuery.ExecuteScalar().ToString())==1;
             con.Close();
         }

  }
  catch{}

答案 2 :(得分:0)

问题可能在于:string tblnm = "BasicHours";。您的表名是一个字符串,应该是撇号,请尝试:string tblnm = "'BasicHours'";

在catch catch块中,您还可以记录异常消息和详细信息。

答案 3 :(得分:0)

感谢您对此问题的帮助。这是我实施的解决方案。

    public void checkTableExists()
    {
        connectionString = @" 
        Data Source=(LocalDB)\MSSQLLocalDB;
        AttachDbFilename=C:\Users\keith_000\Documents\ZuriRubberDressDB.mdf;
        Integrated Security=True;
        Connect Timeout=30";

        string tblName = @"BasicHours";
        string str = @"IF EXISTS(
                SELECT 1 FROM INFORMATION_SCHEMA.TABLES 
                WHERE TABLE_NAME = @table) 
                SELECT 1 ELSE SELECT 0";

        try
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                using (SqlCommand command = new SqlCommand(str, connection))
                {
                    connection.Open();
                    SqlCommand cmd = new SqlCommand(str, connection);

                    cmd.Parameters.Add("@table", SqlDbType.NVarChar).Value = tblName;
                    int exists = (int)cmd.ExecuteScalar();
                    if (exists == 1)
                    {
                        MessageBox.Show("Table exists");
                    }
                    else
                    {
                        MessageBox.Show("Table doesn't exists");
                    }
                    connection.Close();
                }
            }
        }
        catch (SqlException ex)
        {
            MessageBox.Show("Sql issue");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Major issue");
        }
    }