1
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 已经有 1 个名为 '1010' 的表使用创建

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

执行代码,给我的表不存在?任何想法如何解决这个问题..提前非常感谢。

4

4 回答 4

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 块不是一个好主意。捕捉异常,看看出了什么问题。

catch(SqlException ex)
{
   MessageBox.Show(ex.Message);
   //handle exception
}
于 2013-01-03T07:26:57.260 回答
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;
}
于 2013-01-03T07:31:58.170 回答
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;
    }
}

还要检查一下:使用 C#,如何检查 SQL 中是否存在表?

于 2013-01-03T07:31:17.800 回答
0

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

于 2013-01-03T07:31:28.070 回答