我想知道如何检查Access
数据库中特定表(例如:myTable)中是否存在特定列(例如:date)。
我已阅读this answer,其中提供了导致其他查询的查询。
IF NOT EXISTS(SELECT *
FROM sys.columns
WHERE [name] = N'columnName'
AND [object_id] = OBJECT_ID(N'tableName'))
BEGIN
ALTER TABLE ADD COLUMN MYCOLUMN
END
但我需要的是true/false
结果。
更新1
我如何在C#应用程序中执行此操作?
也许使用SqlCommand.ExecuteScalar()
或其他什么?
答案 0 :(得分:5)
感谢所有提供解决方案的人,收集了一些答案,我想出了自己的解决方案版本。也许它不是最好的解决方案,但至少我不需要额外的dll来添加引用或处理一些stored procedures
Access不支持。
OleDbConnection con = new OleDbConnection("my database address");
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT TOP 1 date FROM myTable";
con.Open();
bool exists = true;
try
{
var x = cmd.ExecuteScalar();
}
catch (Exception e)
{
exists = false;
}
con.Close();
答案 1 :(得分:2)
试试这个:
BEGIN
IF NOT EXISTS(SELECT * FROM sys.columns
WHERE [name] = N'columnName' AND [object_id] = OBJECT_ID(N'tableName'))
SELECT 0
ELSE
SELECT 1
END
在c#中使用:
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "StoredProcedure3";
con.Open();
var x = cmd.ExecuteScalar();
MessageBox.Show(x.ToString());
con.Close();
无需存储过程即可使用:
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "IF NOT EXISTS(SELECT * FROM sys.columns WHERE [name] = N'columnName' AND [object_id] = OBJECT_ID(N'tableName')) SELECT 0 ELSE SELECT 1 ";
con.Open();
var x = (int)cmd.ExecuteScalar();
MessageBox.Show(x.ToString());
con.Close();
答案 2 :(得分:2)
在Access VBA中,您可以使用TableDef.Fields
集合。不知道你是否可以使用c#中的这些对象。
为什么不简单地做(伪代码)
columnExists = True
try
ExecuteSql "SELECT TOP 1 [Date] FROM myTable"
catch
// Error: column doesn't exist
columnExists = False
答案 3 :(得分:2)
正如Andre451在他的answer中提到的那样,您可以使用Access DAO来检查相关Fields
对象的TableDef
集合,如下所示:
// test data
string dbFileSpec = @"C:\Users\Public\Database1.accdb";
string tblName = "Clients";
string colName = "LastName";
// COM reference required for project:
// Microsoft Office 14.0 Access Database Engine Object Library
//
var dbe = new Microsoft.Office.Interop.Access.Dao.DBEngine();
Microsoft.Office.Interop.Access.Dao.Database db = dbe.OpenDatabase(dbFileSpec);
Microsoft.Office.Interop.Access.Dao.TableDef tbd = db.TableDefs[tblName];
bool colExists = false;
foreach (Microsoft.Office.Interop.Access.Dao.Field fld in tbd.Fields)
{
if (fld.Name.Equals(colName, StringComparison.InvariantCultureIgnoreCase))
{
colExists = true;
break;
}
}
db.Close();
Console.WriteLine("Column " + (colExists ? "exists" : "does not exist"));
答案 4 :(得分:0)
简单:
select true
完整代码:
IF NOT EXISTS(SELECT * FROM sys.columns
WHERE [name] = N'columnName' AND [object_id] = OBJECT_ID(N'tableName'))
BEGIN
select true
END
ELSE
BEGIN
select false
END