OleDbCommandBuilder 更新 - 至少缺少一个参数值

我做了什么: 我使用 OleDbAdapter 从数据库中读取数据,填充一个新的 DataTable。这很顺利。然后我想在该数据表中添加一列,这也很顺利。

我添加了一个 OleDbCommandBuilder,以使用多一列的 DataTable 更新数据库。我用 OleDbCommandBuilder 的“自动方式”进行了尝试,因为我认为我想要的很简单。但到目前为止,这并没有奏效。

我期望的 是 OleDbCommandBuilder 正在为我编写一个新的 SQL 命令,其中包含“UPDATE”或“INSERT”。我进一步希望,除了 SELECT 命令之外,我无法读取 OleDbAdapter 中的所有命令,因为 OleDbAdapter 在使用它们之前从构建器中获取命令。

我在互联网上读到过,如果我让适配器.Update(...) 调用,则不需要adapter.Fill(...)。但是没有 adapter.Fill(...) 我无法从数据库中获取内容。

终于有一个问题有了名字:

现在,在搜索问题后,我收到以下消息: System.Data.OleDbException:对于至少一个参数没有给出值。

我的问题:

1)我期望有什么问题吗?

2)哪个参数没有值?解决这帮助我理解:https : //docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.parameters?redirectedfrom=MSDN&view= netframework-4.7.2#System_Data_SqlClient_SqlCommand_Parameters

3) 适配器、构建器...是否按正确顺序放置?

4) 我有没有其他事情要做,比如调用一个函数来更新带有适配器的 SQL 命令?

5) 我怎样才能改进我解决这个问题的方式?例如:有没有什么事件可以帮助我更多地了解正在发生的事情?如何捕捉这样的事件?

提前谢谢了!


守着一只汪
浏览 213回答 1
1回答

噜噜哒

您通过向数据表添加新列来修改数据表的结构,这不会反映在生成的更新/插入/删除 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 测试了代码,它工作正常。
打开App,查看更多内容
随时随地看视频慕课网APP