在 C# 中不使用 ODBC.DataReader 将数据传递给另一个类

Posted

技术标签:

【中文标题】在 C# 中不使用 ODBC.DataReader 将数据传递给另一个类【英文标题】:Passing data to another class without using ODBC.DataReader in C# 【发布时间】:2015-04-17 03:05:45 【问题描述】:

我正在尝试制作一个多线程程序,该程序可以从另一家公司拥有的服务器中提取大量数据线程。目前,一旦线程提取了数据,它就会使用 OdbcDataReader 读取该数据。但最终,我想做的是将该数据传递给另一个不同的线程,该线程将使用阅读器读取和解析数据,以便当前线程可以继续从数据库中提取更多数据。

目前这里是直到读者点的线程代码。

public class plexThread
    
        OdbcConnection connection;
        OdbcCommand command;
        string sqlStatement;
        OdbcDataReader reader;
        string threadNumber;
        DateTime startDate;
        DateTime endDate;

        public plexThread(string threadNumber)
        
            connection = new OdbcConnection("XXXX");
            this.threadNumber = threadNumber;
        

        public void plexthread()
                    
            try
            
                connection.Open();
                startDate = ThreadInfo.useStartDate();
                endDate = ThreadInfo.getEndDate();
                DateTime timerStart = new DateTime();
                DateTime now = DateTime.Now;
                int timeout = 0;
                bool dataCaptured;

                while (startDate <= endDate)
                
                    dataCaptured = false;
                    DateTime startDatePlusDay = startDate.AddDays(+1);
                    Console.WriteLine("Thread" + threadNumber + " is picking up day: " + startDate);
                    string startDateString = startDate.ToString("yyyy-MM-dd");
                    string startDatePlusDayString = startDatePlusDay.ToString("yyyy-MM-dd");
                    sqlStatement = "call sprocXXXX(null, null, '" + startDateString + "', '" + startDatePlusDayString + "', null, null,null,null,'',null,null,null,null,null,null,'', 164407);";
                    command = new OdbcCommand(sqlStatement, connection);

                    while (dataCaptured == false)
                    
                        if (timeout <= 5)
                        
                            try
                            
                                reader = command.ExecuteReader();
                                int fieldCount = reader.VisibleFieldCount;
                                while (reader.Read())
                                
                                    for (int i = 0; i < fieldCount; i++)
                                                                           
                                        string data = reader[i].ToString();
                                    

不确定最好的方法是什么?

【问题讨论】:

【参考方案1】:

始终进行线程安全编程。现在,通过提供线程安全的集合,Microsoft 让开发人员更容易做到这一点。

见:MSDN- Thread-Safe Collections

例如,一个线程可以不断向集合中添加数据,可以是ConcurrentQueue&lt;T&gt;ConcurrentBag&lt;T&gt;BlockingCollection&lt;T&gt;等。 其他线程可以继续读取它。

【讨论】:

【参考方案2】:

看起来您正在实现生产者/消费者模式。

一种可靠的解决方案是使用BlockingCollection。您当前的线程可以将从读取器读取的数据发布到阻塞集合中,并且单独的线程可以从阻塞集合中读取,直到没有更多数据可供使用。

链接的 MSDN 页面底部有一个很好的示例。

【讨论】:

【参考方案3】:

您是否尝试过使用异步阅读器?

参考:https://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.executereaderasync%28v=vs.110%29.aspx

【讨论】:

以上是关于在 C# 中不使用 ODBC.DataReader 将数据传递给另一个类的主要内容,如果未能解决你的问题,请参考以下文章

为啥“as”运算符在 C# 中不使用隐式转换运算符?

标准偏差计算在 C# 中不起作用?

PL/SQL NVL 和 OracleParameter 在 C# 中不起作用

在 C# 中不对称地验证 JWT

RegEx 在 JavaScript 中工作,但在 C# 中不工作

XML(反)序列化无效字符串在c#中不一致?