【问题标题】:Check if column name already exists in Access/oledb [duplicate]检查 Access/oledb 中是否已存在列名 [重复]
【发布时间】:2017-08-25 11:28:27
【问题描述】:

我制作了一个简单的 Windows 窗体应用程序,它在访问文件 (mdb) 插入、删除、更新列中创建了一个表。 (我为此使用了 OLEDB 连接。)我编写了这段代码来插入列。

   con.Open();
    OleDbCommand cmd = new OleDbCommand();
    cmd.Connection = con;
    cmd.CommandText = "alter table [" +tableName + "] add [" + columnName + "] long;
    cmd.ExecuteNonQuery();
    con.Close();

现在我想要程序检查用户想要插入的列名是否已经存在于数据库中。我该怎么办?

【问题讨论】:

  • 在数据库中还是在表中?
  • 就在桌子上。

标签: c# sql ms-access oledb


【解决方案1】:

对于MS-Access

由于您是在应用程序代码中执行此操作,因此您可以将其包装在 try .. catch 块中。如果 column 存在,那么它将引发异常,您可以捕获并执行任何需要的操作,例如

try
{
con.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandText = "alter table [" +tableName + "] add [" + columnName + "] long";
cmd.ExecuteNonQuery();
}
catch(Exception ex)
{
  //do your processing
}
finally
{
      con?.Close();
}

如果使用SQL Server 那么

您可以检查sys.columns 系统视图,如

SELECT 1 FROM sys.columns 
        WHERE [name] = N'your_new_columnName' 
        AND [object_id] = OBJECT_ID(N'Your_tableName');

同样,你可以考虑将它包装在一个存储过程中,然后在你的应用程序代码中调用该过程

create procedure usp_altertable(table_name varchar(20), column_name varchar(20))
as
begin
DECLARE @sql varchar(100);
   IF NOT EXISTS(SELECT 1 FROM sys.columns 
            WHERE [name] = N'your_new_columnName' 
            AND [object_id] = OBJECT_ID(N'Your_tableName'))
SET @sql = 'alter table ' +table_name +' add ' + column_name + ' long';
EXEC(@sql);
end

最后,如果 table_namecolumn_name 是来自 UI 的用户输入,那么要警惕 SQL 注入 并改用参数化查询。

【讨论】:

  • 您确定 Access (mdb) 有一个 sys.columns 表,支持存储过程并且有一个 varchar 类型?也许你误以为是 SQL Server?
  • @Heinzi,我的错……完全错过了这一点。看起来我应该删除针对 SQL Server 的不相关部分。
  • @Heinzi,回答已编辑...希望现在有意义。谢谢指点。
猜你喜欢
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2018-06-19
  • 2015-03-04
相关资源
最近更新 更多