首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们能否使用OLEDB在MS Access DB 2016中执行多个insert语句而不关闭连接?

问我们能否使用OLEDB在MS Access DB 2016中执行多个insert语句而不关闭连接?
EN

Stack Overflow用户
提问于 2022-08-31 23:22:51
回答 1查看 40关注 0票数 1

我们能否使用OLEDB在MS Access DB 2016中执行多个insert语句而不关闭连接/保持会话活动?我尝试将OleDB命令实例化、con.open()和con.close()移到foreach循环之外,但它不起作用。有什么建议吗?

代码语言:javascript
复制
  foreach (var list in lsobj)
                {
                    OleDbCommand cmd = new OleDbCommand();
                    cmd.Connection = con;
                    cmd.CommandType = CommandType.Text;
                    con.Open();
                    cmd.CommandText = "INSERT INTO tbl(file_dt, name, created_dt)";
                                      "VALUES (@file_dt,@name,@inserted_dt)";

                    cmd.Parameters.AddWithValue("@file_dt", list.file_dt.ToString());
                    cmd.Parameters.AddWithValue("@name", list.name);
                    cmd.Parameters.AddWithValue("@inserted_dt", list.inserted_dt.ToString());
                    
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
EN

回答 1

Stack Overflow用户

发布于 2022-09-01 00:08:22

可以,停那儿吧。通常情况下,在.net之前,打开连接并保持连接开放是非常“正常”的。然而,.net系统倾向于缓存和重用您建立的连接,即使在关闭时也是如此。

但是,在大多数情况下,是的,您可以执行多个语句,并使用相同的连接来执行它们。

那么,假设这个代码示例:

代码语言:javascript
复制
    void TestFun()
    {
        using (OleDbConnection conn = new OleDbConnection(Properties.Settings.Default.AccessDB))
        {
            using (OleDbCommand cmdSQL = new OleDbCommand("", conn))
            {
                conn.Open();
                // save picture as bytes to DB
                byte[] fData = File.ReadAllBytes(txtFile.Text);
                string strSQL =
                    @"INSERT INTO MyPictures (FileName, PictureData)
                    VALUES(@File, @Data)";
                cmdSQL.CommandText = strSQL;
                cmdSQL.Parameters.Add("@File", OleDbType.VarWChar).Value = txtFileName.Text;
                cmdSQL.Parameters.Add("@Data", OleDbType.Binary).Value = fData;
                cmdSQL.ExecuteNonQuery();

                // display data in our grid
                cmdSQL.CommandText = "SELECT ID, FileName FROM MyPIctures";
                cmdSQL.Parameters.Clear();
                DataTable rstData = new DataTable();
                rstData.Load(cmdSQL.ExecuteReader());
                dataGridView1.DataSource = rstData;

                // do more commands - still same connection

            }
        }
    }

现在,您不能像使用SQL server那样在一次"go“中执行多个SQL语句(只需用一个”;;“分隔几个语句即可。

但是,您可以确定创建一个连接(甚至一个命令对象),并反复使用它。

而且,由于连接和cmdSQL对象在一个使用块中,那么这两个对象以及包含您的连接都将在完成之后关闭和清理。

使用参数。加而不加有价值。

现在,在你的情况下?因为它是相同的命令,一遍又一遍-但只有参数变化?

然后这个(空中代码警告)

代码语言:javascript
复制
        OleDbCommand cmd = new OleDbCommand();
        cmd.Connection = con;
        cmd.CommandType = CommandType.Text;
        con.Open();
        cmd.CommandText = @"INSERT INTO tbl (file_dt, name, created_dt)
                            VALUES (@file_dt,@name,@inserted_dt)";


        cmd.Parameters.Add("@file_dt", OleDbType.VarWChar);
        cmd.Parameters.Add("@name", OleDbType.VarWChar);
        cmd.Parameters.Add("@inserted_dt", OleDbType.VarWChar);

        foreach (var list in lsobj)
        {

            cmd.Parameters["@file_dt"].Value = list.file_dt.ToString();
            cmd.Parameters["@name"].Value = list.name;
            cmd.Parameters["@inserted_dt"].Value =  list.inserted_dt.ToString());
            cmd.ExecuteNonQuery();
        }

        con.Close();

现在,我总是把上面放在一个使用的块中。但是,如上所述,我们可以自由地创建一个命令对象,并在第一个示例中将其用于“多”命令。在第二个例子中,我们只需要设置一次参数,然后重复使用相同的连接、相同的命令对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73562838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档