我们能否使用OLEDB在MS Access DB 2016中执行多个insert语句而不关闭连接/保持会话活动?我尝试将OleDB命令实例化、con.open()和con.close()移到foreach循环之外,但它不起作用。有什么建议吗?
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();
}发布于 2022-09-01 00:08:22
可以,停那儿吧。通常情况下,在.net之前,打开连接并保持连接开放是非常“正常”的。然而,.net系统倾向于缓存和重用您建立的连接,即使在关闭时也是如此。
但是,在大多数情况下,是的,您可以执行多个语句,并使用相同的连接来执行它们。
那么,假设这个代码示例:
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对象在一个使用块中,那么这两个对象以及包含您的连接都将在完成之后关闭和清理。
使用参数。加而不加有价值。
现在,在你的情况下?因为它是相同的命令,一遍又一遍-但只有参数变化?
然后这个(空中代码警告)
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();现在,我总是把上面放在一个使用的块中。但是,如上所述,我们可以自由地创建一个命令对象,并在第一个示例中将其用于“多”命令。在第二个例子中,我们只需要设置一次参数,然后重复使用相同的连接、相同的命令对象。
https://stackoverflow.com/questions/73562838
复制相似问题