检查表存在:表存在时不存在

时间:2013-01-03 07:25:05

标签: c# sql sql-server visual-studio-2012

public bool CheckTblExist(string TblName)
    {
        try
        {  
            string cmTxt = "select case when exists" 
            + "((select * from information_schema.tables " 
            + "where table_name = '" + TblName + "')) then 1 else 0 end";

            var cmd = new OdbcCommand(cmTxt);
            if ((int)cmd.ExecuteScalar() == 1) exists = true;
            MessageBox.Show(TblName + " table Exists.");
        }
        catch
        {
            exists = false;
            MessageBox.Show(TblName + " table does not Exist.");
        }
        return exists;
    }

使用VS2012,C#我在App_Data中手动创建名为Tasoo1.mdf的mdf文件,连接名为con。 Tasoo.mdf已经有一个名为'1010'的表使用

创建
string cmdText = "CREATE TABLE [" + tblname + "]" 
                 + "(column_name1 int,column_name2 int,column_name3 int)";

代码淘汰,给我 - 表不存在?任何想法如何解决这个问题..提前很多。

4 个答案:

答案 0 :(得分:2)

您的if语句下只有一个声明,即exists = true。您的MessageBox.Show在if语句之外。因此,即使if语句返回false,您也将始终获得表存在的消息。将其括在{}中。

if ((int)cmd.ExecuteScalar() == 1) 
{    
     exists = true;
     MessageBox.Show(TblName + " table Exists.");
}

您当前的代码:

if ((int)cmd.ExecuteScalar() == 1) exists = true;
MessageBox.Show(TblName + " table Exists."); // this is irrespective of the if 
  

对代码进行了扩展,给了我 - 表不存在?

你在catch区块中显示了这一点。这意味着你得到了一些例外。有一个空的挡块不是一个好主意。抓住异常,看看出了什么问题。

catch(SqlException ex)
{
   MessageBox.Show(ex.Message);
   //handle exception
}

答案 1 :(得分:2)

var cmd = new OdbcCommand(cmTxt);

此命令永远不会与任何类型的连接对象关联(更不用说是打开的连接对象)

catch
    {
        exists = false;
        MessageBox.Show(TblName + " table does not Exist.");
    }

此代码忽略发生的任何异常,并仅报告该表不存在。如果您确实指定了一个包含异常的变量并对其进行了检查,那么您可能已经发现了我提到的最重要的问题。


当你修复它们时,当然,当表不存在时,你的代码(如所写的)不应该抛出异常。当您致电ExecuteScalar时,它会有不同的结果值。

有这么多问题,这就像是一个家庭作业问题。

您可以将后面的部分重写为:

if ((int)cmd.ExecuteScalar() == 1)
{
   MessageBox.Show(TblName + " table exists.");
   return true;
}
else
{
   MessageBox.Show(TblName + " table does not exist.");
   return false;
}

答案 2 :(得分:0)

轻松尝试

bool tabex;
try
{ 
    var cmd = new OdbcCommand(
      "select case when exists((select * from information_schema.tables where table_name = '" + tableName + "')) then 1 else 0 end");

    tabex= (int)cmd.ExecuteScalar() == 1;
}
catch
{
    try
    {
        tabex = true;
        var cmdOthers = new OdbcCommand("select 1 from " + tableName + " where 1 = 0");
        cmdOthers.ExecuteNonQuery();
    }
    catch
    {
        tabex = false;
    }
}

另请检查:Using C#, how do you check if a table exists in SQL?

答案 3 :(得分:0)

当你说它表格不存在时,我假设你的意思是第二个消息框正在显示?这是由抛出异常引起的。你真的需要捕获抛出的异常对象,它会告诉你你的问题是什么。