C# SQL 插入到 Netezza。 Netezza 不发送返回,C# 代码超时

Posted

技术标签:

【中文标题】C# SQL 插入到 Netezza。 Netezza 不发送返回,C# 代码超时【英文标题】:C# SQL insert into Netezza. Netezza not sending return, c# code timing out 【发布时间】:2015-07-09 14:44:49 【问题描述】:

我真的很想得到一些建议,因为我现在已经遇到了很多这个问题。我有几个应用程序,无论大小,我都需要使用 Netezza 做一些工作。不幸的是,这似乎是 .net 和 Netezza 的一个常见问题,Netezza 需要一个 sql 命令,执行它(我已经在日志中确认了它),但定期不发送返回,而我的 C# 应用程序中的 OLEDB 连接只是坐在那里超时。在 Netezza 日志中,我还可以看到我的会话只是在那里打开,因为我的应用程序仍在等待 NZ 发回一些东西。这似乎只发生在执行超过 1 个命令的连接上。

无论如何,下面是一些代码,我想要一些关于如何缓解这个问题的建议。我目前正在重试计数,但我真的想要一些更安全的东西。有人对如何处理此类您可能无法收到退货的问题有任何建议吗?

这个特殊的循环大约有 135 条记录更新,通常只需要 1 分钟。没有任何具体记录没有回报。它是完全随机的,并且也发生在其他应用程序中。

任何建议将不胜感激!谢谢!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.OleDb;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using System.Security.Cryptography;
using System.IO;

namespace RemoveVoidedInvoices

class UpdateNetezza

    public bool NetezzaWorkFailure = false;

    private void NetezzaWorkFailed()
    
        NetezzaWorkFailure = true;
    

    public void updateCounts(List<RecordCounts> recordCounts)
    

        string connString = string.Format("Provider=NZOLEDB;Data Source=0;Initial Catalog=EBIDW;User ID=MYUSERNAME;Password=1", Environment, passWord);

        OleDbConnection netezzaConn = null;

        //Due to timeout issues I am making a quick timespan entry so that I can keep track in the log of how long each day the bulk update took
        DateTime Prequery = DateTime.Now;
        int retrycount = 0;

        try
        
            netezzaConn = new OleDbConnection(connString);
            netezzaConn.Open();

            for (int i = 0; i < recordCounts.Count; i++)
            
                try
                
                    if (recordCounts[i].RecordCount.ToString() != recordCounts[i].OrigCount.ToString())
                    
                        string updateStatement = string.Format("UPDATE fct_ourtable SET LINESWRITTENTOFILE = 0 where EXTRACTFILENAME = '1' and LINESWRITTENTOFILE = 2", recordCounts[i].RecordCount.ToString(), recordCounts[i].FileName, recordCounts[i].OrigCount.ToString());

                        Console.WriteLine("Executing query : " + updateStatement);
                        Console.WriteLine("Query start-time - " + DateTime.Now.ToString());

                        OleDbCommand exe = new OleDbCommand(updateStatement, netezzaConn);
                        exe.CommandTimeout = 2000;

                        int rowsUpdated;

                        rowsUpdated = exe.ExecuteNonQuery();

                        Console.WriteLine("Rows Updated = " + rowsUpdated.ToString());
                        Console.WriteLine("Query end-time - " + DateTime.Now.ToString());
                        Console.WriteLine();

                    

                    else
                    
                        Console.WriteLine("No records were removed from the file : " + recordCounts[i].FileName + ". Not updating Netezza.");
                        Console.WriteLine();
                    
                

                catch (OleDbException oledbex)
                
                    retrycount++;

                    if (retrycount > 3)
                    
                        Console.WriteLine("Maximum number of retrys met. Canceling now.");
                        throw new System.Exception();
                    
                    else
                    
                        i = i - 1;
                        Console.WriteLine("Timeout on Query, retrying");
                    
                
            
        

        catch (Exception ex)
        
                Console.WriteLine(ex);
                NetezzaWorkFailed();
        

        finally
        
            if (netezzaConn != null)
            
                netezzaConn.Close();
                netezzaConn = null;
            
            TimeSpan duration = DateTime.Now.Subtract(Prequery);
            Console.WriteLine("Query Time: " + duration);
        
    


【问题讨论】:

【参考方案1】:

这可能更适合作为评论,但我没有足够的代表。

我没有过多地使用 OleDB,但我们以与您使用 ODBC 类似的方式运行查询并且没有遇到任何问题。至少尝试一下会很有趣。

在您的 sn-p 上添加一些 cmets,我怀疑这会对您的问题产生很大影响,但有助于澄清和缩短代码。

在您的连接上拨打 Dispose 而不是 Close。 还有Dispose你的命令对象。 使用参数而不是格式化查询字符串(适用于OleDB 和ODCB)。在循环外创建您的 OleDBCommand 并添加您的三个参数。在循环中,您设置参数的Value 并按照您已经执行的方式执行查询。 使用using 块而不是try-catch 以避免显式调用Dispose。如果您想处理异常,您仍然需要在 using 块内部或外部添加一个 try-catch 块。

【讨论】:

以上是关于C# SQL 插入到 Netezza。 Netezza 不发送返回,C# 代码超时的主要内容,如果未能解决你的问题,请参考以下文章

选择语句从 Netezza 数据库中获取数据并插入 SQL Server 数据库 (SSIS)

查找 Netezza 服务器上的所有数据库名称

从 Python 到 SQL(Aginity、Netezza)的 CREATE/DROP 调用不起作用

win 7 将 IBM netezza 数据库中的 sql 数据表导出到 txt 文件的错误

使用存储过程将值插入到 netezza

如何提升 netezza 插入语句过程