为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
守着一只汪 2021-12-05 16:31:34
我做了什么: 我使用 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_Parameters3) 适配器、构建器...是否按正确顺序放置?4) 我有没有其他事情要做,比如调用一个函数来更新带有适配器的 SQL 命令?5) 我怎样才能改进我解决这个问题的方式?例如:有没有什么事件可以帮助我更多地了解正在发生的事情?如何捕捉这样的事件?提前谢谢了!
查看完整描述

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 测试了代码,它工作正常。


查看完整回答
反对 回复 2021-12-05
  • 1 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信