积极答复者
C#判断数据表存在的两种方法。

问题
-
有两种判断的判断数据表存在的方法,大家看看哪个比较好一些,问题有哪些?
第一种:采用普通的查询系统表的方式(目前问题是,在一个大的事务里面,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;
}}
大家看看哪个好一些,对于到第一种方式,如何能避免锁表后引起的死锁呢。
谢谢
答案
-
要我说,两种方法都不好。 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
这样就可以知道是否有这张表存在了。
- 已标记为答案 mldarkMember 2010年4月26日 14:00
-
用object_id函数 http://lyc7735.blog.163.com/blog/static/94797637200911662655937/ 肖小勇的提问 我解答一下 如果一种情况需求 后台网页上输入纯sql动态查询 输入的表名不存在的话 返回一个友好的字符串输出...... 不是错误页面
- 已标记为答案 mldarkMember 2010年4月26日 13: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
这样就可以知道是否有这张表存在了。
- 已标记为答案 mldarkMember 2010年4月26日 14:00
-
要我说,两种方法都不好。 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
这样就可以知道是否有这张表存在了。
你好,你的这种方式和我到第一种方式是一样的。我也这样试过。 -
用object_id函数 http://lyc7735.blog.163.com/blog/static/94797637200911662655937/ 肖小勇的提问 我解答一下 如果一种情况需求 后台网页上输入纯sql动态查询 输入的表名不存在的话 返回一个友好的字符串输出...... 不是错误页面
- 已标记为答案 mldarkMember 2010年4月26日 13:59