我已经有了直接ddl语句的体面的成功。你的权利语法需要一个谷歌搜索清除,但我一直在处理更新本地数据库这种方式一段时间。是否有与您有问题的具体更新? 基本上我写了一些帮助函数来检查表的结构并在需要时附加字段。
public bool doesFieldExist(string table, string field)
{
bool ret = false;
try
{
if (!openRouteCon())
{
throw new Exception("Could not open Route DB");
}
DataTable tb = new DataTable();
string sql = "select top 1 * from " + table;
OleDbDataAdapter da = new OleDbDataAdapter(sql, routedbcon);
da.Fill(tb);
if (tb.Columns.IndexOf(field) > -1)
{
ret = true;
}
tb.Dispose();
}
catch (Exception ex)
{
log.Debug("Check for field:" + table + "." + field + ex.Message);
}
return ret;
}
public bool checkAndAddColumn(string t, string f, string typ, string def = null)
{
// Update RouteMeta if needed.
if (!doesFieldExist(t, f))
{
string sql;
if (def == null)
{
sql = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2} ", t, f, typ);
}
else
{
sql = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2} DEFAULT {3} ", t, f, typ, def);
}
try
{
if (openRouteCon())
{
OleDbCommand cmd = new OleDbCommand(sql, routedbcon);
cmd.ExecuteNonQuery();
string msg = "Modified :" + t + " added col " + f;
log.Info(msg);
if (def != null)
{
try
{
cmd.CommandText = String.Format("update {0} set {1} = {2}", t, f, def);
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
log.Error("Could not update column to new default" + t + "-" + f + "-" + e.Message);
}
}
return true;
}
}
catch (Exception ex)
{
log.Error("Could not alter RouteDB:" + t + " adding col " + f + "-" + ex.Message);
}
}
else
{
return true;
}
return false;
}
你是什么意思它是[不良记录(http://msdn.microsoft.com/en-us/library/bb267262%28v=office.12%29.aspx)?哪种说法对你不清楚?无论如何,你可以在.NET中使用ADOX。例如,请参阅[如何使用ADOX和Visual C#.NET创建Access数据库](http://support.microsoft.com/kb/317881)。 – RedFilter 2012-01-11 14:49:12
感谢您的链接,它看起来像最新版本的Access中的文档已大大改善。还有一个例子:ALTER TABLE页面不包含有效数据类型的列表;例如,我将如何创建一个精度为X,比例尺为Y的新小数,这完全不清楚(在文档中)。同时,我发现了这样一个数据类型关键字表(它在用户注释部分中链接[CREATE TABLE文档](http://msdn.microsoft.com/en-us/library/bb177893.aspx)),但这远离SQL Server BOL的质量。 – Heinzi 2012-01-11 14:56:33
哦,另一个为什么通过DDL管理Access架构不是一个好主意:[架构行集已损坏。](http://social.msdn.microsoft.com/Forums/eu/adodotnetdataproviders/thread/58a17c99-0b23 -4341-a274-db2dd91e0886)我刚刚了解到,OLE DB架构表和ODBC架构表都不会为Access字段返回正确的IS_NULLABLE值。似乎只有*可靠的方法来检查一个Access字段是否为空是使用** DAO **并检查'myField.Required'。那有多可悲?不得不在2012年为.net项目添加DAO引用... – Heinzi 2012-01-12 14:47:54