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)
从 Python 到 SQL(Aginity、Netezza)的 CREATE/DROP 调用不起作用