[英]How to check if specific column exists in an Access database table
I want to know how to check if a specific column (eg: date) exists in a specific table(eg: myTable) in an Access
database.我想知道如何检查Access
数据库的特定表(例如:myTable)中是否存在特定列(例如:日期)。
I've read this answer which offers a query which results in another query.我已经阅读了这个答案,它提供了一个导致另一个查询的查询。
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
But what I need is a true/false
result.但我需要的是一个true/false
结果。
UPDATE 1更新 1
How can I do that in my C# application?如何在我的 C# 应用程序中做到这一点?
Maybe using SqlCommand.ExecuteScalar()
or something else?也许使用SqlCommand.ExecuteScalar()
或其他什么?
Thanks to everyone who offered a solution, gathering up some of the answers, I came up with my own version of solution. 感谢所有提供解决方案并收集了一些答案的人,我提出了自己的解决方案版本。 Maybe it's not the best solution around, but at least I don't need an extra dll to add to the references or deal with some stored procedures
Access won't support. 也许这不是最好的解决方案,但是至少我不需要额外的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();
Try this: 尝试这个:
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
To use in c#: 要在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();
To use without stored procedure: 要在没有存储过程的情况下使用:
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();
In Access VBA you could use the TableDef.Fields
collection. 在Access VBA中,可以使用TableDef.Fields
集合。 Don't know if you can use these objects from c#. 不知道是否可以使用c#中的这些对象。
Why don't you simply do (pseudocode) 你为什么不简单地做(伪代码)
columnExists = True
try
ExecuteSql "SELECT TOP 1 [Date] FROM myTable"
catch
// Error: column doesn't exist
columnExists = False
As Andre451 mentions in his answer , you can use Access DAO to inspect the Fields
collection of the relevant TableDef
object, like this: 正如Andre451在他的回答中提到的那样,您可以使用Access DAO来检查相关TableDef
对象的Fields
集合,如下所示:
// 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"));
Simple by: 简单通过:
select true
Complete Code: 完整的代码:
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
In case anyone requires this in the future, below is the method I use on my Access databases.如果将来有人需要这个,下面是我在我的 Access 数据库上使用的方法。
void CheckTableFields(OleDbConnection con)
{
var table = "Company";
var field = "Location";
var sSQL = $"SELECT TOP 1 * FROM [{table}]";
using (OleDbConnection con = new OleDbConnection("MsJetOledbConnectionString"))
{
con.Open();
using (var cmd = new OleDbCommand(sSQL, con))
{
try
{
DataTable dtGen = new DataTable();
dtGen.Load(cmd.ExecuteReader());
System.Data.DataColumnCollection columns = dtGen.Columns;
if (!columns.Contains(field))
{
//Field NOT found - add new 'Location2' column
cmd.CommandText = $"ALTER TABLE [{table}] ADD COLUMN {field} TEXT(50)";
var result = cmd.ExecuteNonQuery();
WriteLine($"{DateTime.Now}: Table Column {{{field}}} added successfully");
}
else
{
WriteLine($"{DateTime.Now}: Table Column {{{field}}} already exists");
}
}
catch (Exception ex)
{
WriteLine($"[DataService.CheckCompanyTableFields] Error - {{{ex.Message}}}", false);
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.