1 回答
TA贡献1784条经验 获得超7个赞
您通过向数据表添加新列来修改数据表的结构,这不会反映在生成的更新/插入/删除 sql 命令中。
看看这个例子:OleDbCommandBuilder Class
很简单:
adapter.Update(table);
只更新服务器中基表中的数据(如果有变化)
1)我期望有什么问题吗?
不,它正在工作,但 MS 访问中的基表结构没有变化
2)哪个参数没有值?
你没有在 SQL 命令中传递参数
3) 适配器、构建器...是否按正确顺序放置?
是的,但删除修改数据表的部分。它没有效果
4) 我有没有其他事情要做,比如调用一个函数来更新带有适配器的 SQL 命令?
用评论查看我的代码。
5) 我怎样才能改进我解决这个问题的方式?例如:有没有什么事件可以帮助我更多地了解正在发生的事情?如何捕捉这样的事件?
您不能通过添加新列来修改数据表的结构
更新
我测试了你的代码,用注释修改了它:
public bool AddColumnOfString_ToDataTable(string tableName, string newColumnName, string defaultCellValue)
{
// Approach: Accessing database at minimum time.
// returns true if column name could not be found and column could be added
DataTable table = new DataTable();
//string strSQL = "SELECT " + tableName; // not valid syntax
string strSQL = "SELECT * from " + tableName;
OleDbDataAdapter adapter = new OleDbDataAdapter(strSQL, myConnectionString);
adapter.Fill(table);
OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
bool result = false;
// remove this code, it has no effect on the underlying base table in MS Access databas
//any change in the structure of datatable has no effect on the database
/*
if (false == table.HasColumn(newColumnName))
{
DataColumn newColumn = new DataColumn(newColumnName, typeof(System.String));
newColumn.DefaultValue = defaultCellValue;
table.Columns.Add(newColumn);
result = true;
}
*/
// code to modify data in DataTable here
//Without the OleDbCommandBuilder this line would fail
adapter.Update(table);
//just to review the generated code
Console.WriteLine(builder.GetUpdateCommand().CommandText);
Console.WriteLine(builder.GetInsertCommand().CommandText);
return result;
}
更新2:
如果您有兴趣向 MS Access 数据库添加新列,可以运行以下代码:
public bool AddColumn(OleDbConnection con,
string tableName,string colName,string colType, object defaultValue)
{
string query = $"ALTER TABLE {tableName} ADD COLUMN {colName} {colType} DEFAULT {defaultValue} ";
var cmd = new OleDbCommand(query, con);
try
{
con.Open();
cmd.ExecuteNonQuery();
Console.WriteLine("Sql Executed Successfully");
return true;
}
catch (OleDbException e)
{
Console.WriteLine("Error Details: " + e);
}
finally
{
Console.WriteLine("closing conn");
con.Close();
}
return false;
}
public void AddColumnTest()
{
OleDbConnection con = new OleDbConnection(myConnectionString);
string tableName="table1";
string colName="country";
string colType="text (30)";
object defaultValue = "USA";
AddColumn(con, tableName, colName, colType, defaultValue);
}
我用 MS Access 测试了代码,它工作正常。
- 1 回答
- 0 关注
- 212 浏览
添加回答
举报