gpt4 book ai didi

c# - PostgreSQL:命令已经在进行中

转载 作者:行者123 更新时间:2023-12-01 21:57:45 26 4
gpt4 key购买 nike

我的异步函数试图从表中选择一条记录。此函数接受从另一个函数传递的一些参数。

因此,一些进程(至少 6 个)可以同时使用它。我经常收到错误消息“命令已经在进行中”

我知道问题隐藏在阅读器中,因为当另一个进程试图访问它时,阅读器正忙。

让我在下面发布完整的代码:

async private void InsertToLog(List<Printer> APrinter, List<PrinterToGridBinds> AGridBind, int index)
{
if (!String.IsNullOrEmpty(APrinter[index].Type.Trim()) && !String.IsNullOrEmpty(AGridBind[index].extBatchNumber.Trim()) && !String.IsNullOrEmpty(AGridBind[index].extBatchCounter.Trim()) && !String.IsNullOrEmpty(AGridBind[index].extDIOCounter.Trim()))
{
string dio_count = "0";
string GetDIOCounter = string.Format(@"SELECT dio_counter FROM {0} WHERE device_type = '{1}' AND batch_number = '{2}' ORDER BY id DESC
LIMIT 1;", log_table_name, lst_PrinterStruct[index].Type, AGridBind[index].extBatchNumber);

try
{
NpgsqlCommand db_getCounter = new NpgsqlCommand(GetDIOCounter, conn);
if (conn.State != ConnectionState.Open)
conn.Open();
using (DbDataReader reader = await db_getCounter.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
dio_count = reader[0].ToString().Trim();
}

AGridBind[index].extDIOCounter = (Int32.Parse(dio_count) + Int32.Parse(AGridBind[index].extDIOCounter.Trim())).ToString();
string Insert_SQL = String.Format(@"INSERT INTO {0} (device_type, batch_number, start_date, batch_counter, dio_counter) VALUES ('{1}', '{2}', '{3}', '{4}', '{5}') ON CONFLICT ON CONSTRAINT unique_log_key DO UPDATE SET batch_counter='{4}', dio_counter='{5}';", log_table_name, APrinter[index].Type.Trim(),
AGridBind[index].extBatchNumber.Trim(), DateTime.Now.ToString(), AGridBind[index].extBatchCounter.Trim(), AGridBind[index].extDIOCounter.Trim());

var db_cmd = new NpgsqlCommand(Insert_SQL, conn);
int res = await db_cmd.ExecuteNonQueryAsync();
}
catch (Exception e)
{
string FMessage = String.Format("Printer {0} \r\n Can not write to table\r\n Error: {1}",
lst_PrinterStruct[index].Name, e.Message);
MessageBox.Show(FMessage);
}

finally
{
conn.Close();
}
}
}

如您所见,此处通过使用 包装了阅读器。

无论如何,我有我有(一个错误)。所以,我的问题是如何避免此错误消息(我是关于“命令已在进行中”)?

我对可能的决定有一些想法。也许:

  1. DbDataReader 设置为参数。而读者的名字可以通过Random函数生成。但我不知道该怎么做。

  2. 等到当前进程完成并关闭阅读器,然后运行第二个等等。但我不知道如何告诉新进程等到前一个进程完成。

    <

所以,伙计们,我需要你们的帮助。

最佳答案

如果多个线程共享一个数据库连接,您必须同步它们以便只有其中一个线程同时使用该连接。在 PostgreSQL 数据库 session 中一次只能运行一条语句。

由于同步很麻烦并且可能会损害您的并发性,因此您最好使用连接池,并且每个线程在需要时都从池中请求一个连接。

关于c# - PostgreSQL:命令已经在进行中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55530196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com