none
C#判断数据表存在的两种方法。 RRS feed

  • 问题

  • 有两种判断的判断数据表存在的方法,大家看看哪个比较好一些,问题有哪些?

    第一种:采用普通的查询系统表的方式(目前问题是,在一个大的事务里面,SQL Server数据库中 ,如果前面有执行修改表结构或者创建表等DLL语句,会出现锁sysobjects表而导致判断表语句执行事务超时的问题 )

    public static bool IsTableExistsInDB(string tableName, IGSPDatabase db)

    {

    string sql  = string.Empty();  

             switch (database.DbType)
                {
                    case GSPDbType.Oracle:
                        sql = string.Format("select 1 from user_tables where upper(table_name) = upper('{0}')".ToUpper(), tableName);
                        break;
                    case GSPDbType.SQLServer:
                        sql = string.Format("select 1 from sysobjects where id = object_id('{0}') and type = 'U'".ToUpper(), tableName);
                       break;
                   default:
                       throw new Exception(string.Format("IsTableExistsInDB不支持 {0} 类型数据库", db.DbType.ToString()));
                }

                return Convert.ToInt16(db.ExecuteScalar(sql)) != 0;

    }

    第二种:采用查询表,然后判断是否出现异常的方式来进行 

    public static bool IsTableExistsInDB(string tableName, IGSPDatabase db)
            {
                 string sql = string.Format("SELECT * FROM {0}", tableName);

                try
                {
                    db.ExecSqlStatement(sql);
                    tableExistDict.Add(tableName, true);
                    return true;
                }
                catch
                {
                    tableExistDict.Add(tableName, false);
                    return false;
                }

    }

     

    大家看看哪个好一些,对于到第一种方式,如何能避免锁表后引起的死锁呢。

     

    谢谢

    2010年4月21日 2:59

答案

  • 要我说,两种方法都不好。 SQL SERVER 是通过系统表对SQL SERVER 数据库对象进行管理的。你可以查询SQL SERVER 系统表来判断某个存储过程或者数据表是否存在。

    比如要判断TB_UserInfo 表是否在当前数据库中存在,可以写一个存储过程:

    CREATE PROCEDURE SP_TableExist

    @TableName VARCHAR(128),

    @IsExist BIT OUTPUT

    AS

    BEGIN

    SET @IsExist = 0

    SELECT @IsExist = 1 FROM sysobjects WHERE name = @TableName

    END

     

    这样就可以知道是否有这张表存在了。

     

    2010年4月21日 5:37
  • 用object_id函数 http://lyc7735.blog.163.com/blog/static/94797637200911662655937/ 肖小勇的提问 我解答一下 如果一种情况需求 后台网页上输入纯sql动态查询 输入的表名不存在的话 返回一个友好的字符串输出...... 不是错误页面
    2010年4月22日 17:18
    版主

全部回复

  • 要我说,两种方法都不好。 SQL SERVER 是通过系统表对SQL SERVER 数据库对象进行管理的。你可以查询SQL SERVER 系统表来判断某个存储过程或者数据表是否存在。

    比如要判断TB_UserInfo 表是否在当前数据库中存在,可以写一个存储过程:

    CREATE PROCEDURE SP_TableExist

    @TableName VARCHAR(128),

    @IsExist BIT OUTPUT

    AS

    BEGIN

    SET @IsExist = 0

    SELECT @IsExist = 1 FROM sysobjects WHERE name = @TableName

    END

     

    这样就可以知道是否有这张表存在了。

     

    2010年4月21日 5:37
  • 说不定是因为你没有权限呢
    2010年4月21日 16:55
  • 要我说,两种方法都不好。 SQL SERVER 是通过系统表对SQL SERVER 数据库对象进行管理的。你可以查询SQL SERVER 系统表来判断某个存储过程或者数据表是否存在。

    比如要判断TB_UserInfo 表是否在当前数据库中存在,可以写一个存储过程:

    CREATE PROCEDURE SP_TableExist

    @TableName VARCHAR(128),

    @IsExist BIT OUTPUT

    AS

    BEGIN

    SET @IsExist = 0

    SELECT @IsExist = 1 FROM sysobjects WHERE name = @TableName

    END

     

    这样就可以知道是否有这张表存在了。

     


    你好,你的这种方式和我到第一种方式是一样的。我也这样试过。

     

     

    2010年4月21日 17:08
  • 个人觉得从系统表中 查询要好点。


    Microsoft Online Community Support
    2010年4月22日 3:46
  • 你好!

    第一种会更好!另外想请问下,为什么要判断表是否存在呢?


    知识改变命运,奋斗成就人生!
    2010年4月22日 9:46
    版主
  • 用object_id函数 http://lyc7735.blog.163.com/blog/static/94797637200911662655937/ 肖小勇的提问 我解答一下 如果一种情况需求 后台网页上输入纯sql动态查询 输入的表名不存在的话 返回一个友好的字符串输出...... 不是错误页面
    2010年4月22日 17:18
    版主
  • 判断数据表是否存在,然后以进行下一步操作,比如建表或者查询等
    2010年5月24日 14:51
  • 如果是在一个库上操作,是否可以将这个库上的所有表查询出来,才后缓存,就不会存在重复查询,导致锁的问题,而且提高效率。
    2010年5月25日 2:18