[英]Command timeout in script task C#
I get this timeout error:我收到此超时错误:
Execution Timeout Expired.
执行超时已过期。 The timeout period elapsed prior to completion of the operation or the server is not responding
操作完成前超时时间已过或服务器未响应
Script task executes stored procedure that takes some time.脚本任务执行需要一些时间的存储过程。 If I change parameter in a stored procedure to retrieve less data then it works fine.
如果我更改存储过程中的参数以检索更少的数据,那么它可以正常工作。 So I am assuming I have to increase the connection timeout in my code.
所以我假设我必须在我的代码中增加连接超时。 But I don't know where exactly should I do that?
但我不知道我到底应该在哪里做?
I tried to change Connect Timeout
in connection manager - but it didn't help.我试图在连接管理器中更改
Connect Timeout
- 但它没有帮助。
I also tried this:我也试过这个:
cmd.CommandTimeout = 500;
But still - no success.但仍然 - 没有成功。
I guess I need to do that somewhere in a code:我想我需要在代码中的某个地方这样做:
public void Main()
{
string datetime = DateTime.Now.ToString("yyyyMMddHHmmss");
DateTime startDate = DateTime.Now.AddMonths(-1).AddDays(1 - DateTime.Now.Day);
DateTime endDate = startDate.AddMonths(1).AddDays(-1);
//var now = DateTime.Now;
//var firstDayCurrentMonth = new DateTime(now.Year, now.Month, 1);
//var lastDayLastMonth = firstDayCurrentMonth.AddDays(-1);
try
{
//Declare Variables
// string ExcelFileName = Dts.Variables["User::ExcelFileName"].Value.ToString() +" "+ String.Format("{0:M-d-yyyy}", endDate);
string ExcelFileName = Dts.Variables["User::NewExcelFileName"].Value.ToString();
string FolderPath = Dts.Variables["User::FolderPath"].Value.ToString();
string StoredProcedureName = Dts.Variables["User::StoredProcedureName"].Value.ToString();
string SheetName = Dts.Variables["User::SheetName"].Value.ToString();
string connStringDB = "MyConnString";
string excelConn = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}{1};Mode=ReadWrite;Extended Properties='Excel 12.0 Xml;HDR=YES';", FolderPath, ExcelFileName);
using (var conn = new SqlConnection(connStringDB))
using (var command = new SqlCommand(StoredProcedureName, conn)
{
CommandType = CommandType.StoredProcedure
})
{
conn.Open();
string queryString = String.Format("EXEC {0}", StoredProcedureName);
SqlDataAdapter adapter = new SqlDataAdapter(queryString, conn);
DataSet ds = new DataSet();
adapter.Fill(ds);
//Get Header Columns
string TableColumns = "";
// Get the Column List from Data Table so can create Excel Sheet with Header
foreach (DataTable table in ds.Tables)
{
foreach (DataColumn column in table.Columns)
{
TableColumns += column + "],[";
}
}
conn.Close();
// Replace most right comma from Columnlist
//TableColumns = ("[" + TableColumns.Replace(",", " Text,").TrimEnd(','));
TableColumns = ("[" + TableColumns.Replace(",", " text,").TrimEnd(','));
TableColumns = TableColumns.Remove(TableColumns.Length - 2);
//Use OLE DB Connection and Create Excel Sheet
using (OleDbConnection connODB = new OleDbConnection(excelConn))
{
connODB.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = connODB;
cmd.CommandTimeout = 500; //Entered by Oleg
cmd.CommandText = String.Format("Create table {0} ({1})", SheetName, TableColumns);
cmd.ExecuteNonQuery();
foreach (DataTable table in ds.Tables)
{
String sqlCommandInsert = "";
String sqlCommandValue = "";
foreach (DataColumn dataColumn in table.Columns)
{
sqlCommandValue += dataColumn + "],[";
}
sqlCommandValue = "[" + sqlCommandValue.TrimEnd(',');
sqlCommandValue = sqlCommandValue.Remove(sqlCommandValue.Length - 2);
sqlCommandInsert = String.Format("INSERT INTO {0} ({1}) VALUES (", SheetName, sqlCommandValue);
int columnCount = table.Columns.Count;
foreach (DataRow row in table.Rows)
{
string columnvalues = "";
for (int i = 0; i < columnCount; i++)
{
int index = table.Rows.IndexOf(row);
var a = table.Rows[index].ItemArray[i].ToString().Replace("'", "''");
columnvalues += "'" + a + "',";
//columnvalues += "'" + table.Rows[index].ItemArray[i] + "',";
}
columnvalues = columnvalues.TrimEnd(',');
var command2 = sqlCommandInsert + columnvalues + ")";
cmd.CommandText = command2;
cmd.ExecuteNonQuery();
}
}
conn.Close();
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
catch (Exception exception)
{
// Create Log File for Errors
using (StreamWriter sw = System.IO.File.CreateText(Dts.Variables["User::FolderPath"].Value.ToString() + "\\" +
Dts.Variables["User::ExcelFileName"].Value.ToString() + datetime + ".log"))
{
sw.WriteLine(exception.ToString());
Dts.TaskResult = (int)ScriptResults.Failure;
}
}
}
#region ScriptResults declaration
/// <summary>
/// This enum provides a convenient shorthand within the scope of this class for setting the
/// result of the script.
///
/// This code was generated automatically.
/// </summary>
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
}
}
Try to set the Command Timeout to 0
instead of 500
尝试将命令超时设置为
0
而不是500
cmd.CommandTimeout = 0;
And also you have to set the SQLAdapter timeout:而且您还必须设置 SQLAdapter 超时:
adapter.SelectCommand.CommandTimeout = 0;
Based on the official documentation基于官方文档
A value of 0 indicates no limit (an attempt to execute a command will wait indefinitely).
值 0 表示没有限制(尝试执行命令将无限期等待)。
You code should look like:您的代码应如下所示:
public void Main()
{
string datetime = DateTime.Now.ToString("yyyyMMddHHmmss");
DateTime startDate = DateTime.Now.AddMonths(-1).AddDays(1 - DateTime.Now.Day);
DateTime endDate = startDate.AddMonths(1).AddDays(-1);
//var now = DateTime.Now;
//var firstDayCurrentMonth = new DateTime(now.Year, now.Month, 1);
//var lastDayLastMonth = firstDayCurrentMonth.AddDays(-1);
try
{
//Declare Variables
// string ExcelFileName = Dts.Variables["User::ExcelFileName"].Value.ToString() +" "+ String.Format("{0:M-d-yyyy}", endDate);
string ExcelFileName = Dts.Variables["User::NewExcelFileName"].Value.ToString();
string FolderPath = Dts.Variables["User::FolderPath"].Value.ToString();
string StoredProcedureName = Dts.Variables["User::StoredProcedureName"].Value.ToString();
string SheetName = Dts.Variables["User::SheetName"].Value.ToString();
string connStringDB = "MyConnString";
string excelConn = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}{1};Mode=ReadWrite;Extended Properties='Excel 12.0 Xml;HDR=YES';", FolderPath, ExcelFileName);
using (var conn = new SqlConnection(connStringDB))
using (var command = new SqlCommand(StoredProcedureName, conn)
{
CommandType = CommandType.StoredProcedure
})
{
conn.Open();
string queryString = String.Format("EXEC {0}", StoredProcedureName);
SqlDataAdapter adapter = new SqlDataAdapter(queryString, conn);
DataSet ds = new DataSet();
adapter.SelectCommand.CommandTimeout = 0;
adapter.Fill(ds);
//Get Header Columns
string TableColumns = "";
// Get the Column List from Data Table so can create Excel Sheet with Header
foreach (DataTable table in ds.Tables)
{
foreach (DataColumn column in table.Columns)
{
TableColumns += column + "],[";
}
}
conn.Close();
// Replace most right comma from Columnlist
//TableColumns = ("[" + TableColumns.Replace(",", " Text,").TrimEnd(','));
TableColumns = ("[" + TableColumns.Replace(",", " text,").TrimEnd(','));
TableColumns = TableColumns.Remove(TableColumns.Length - 2);
//Use OLE DB Connection and Create Excel Sheet
using (OleDbConnection connODB = new OleDbConnection(excelConn))
{
connODB.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = connODB;
cmd.CommandTimeout = 0; //Entered by Oleg
cmd.CommandText = String.Format("Create table {0} ({1})", SheetName, TableColumns);
cmd.ExecuteNonQuery();
foreach (DataTable table in ds.Tables)
{
String sqlCommandInsert = "";
String sqlCommandValue = "";
foreach (DataColumn dataColumn in table.Columns)
{
sqlCommandValue += dataColumn + "],[";
}
sqlCommandValue = "[" + sqlCommandValue.TrimEnd(',');
sqlCommandValue = sqlCommandValue.Remove(sqlCommandValue.Length - 2);
sqlCommandInsert = String.Format("INSERT INTO {0} ({1}) VALUES (", SheetName, sqlCommandValue);
int columnCount = table.Columns.Count;
foreach (DataRow row in table.Rows)
{
string columnvalues = "";
for (int i = 0; i < columnCount; i++)
{
int index = table.Rows.IndexOf(row);
var a = table.Rows[index].ItemArray[i].ToString().Replace("'", "''");
columnvalues += "'" + a + "',";
//columnvalues += "'" + table.Rows[index].ItemArray[i] + "',";
}
columnvalues = columnvalues.TrimEnd(',');
var command2 = sqlCommandInsert + columnvalues + ")";
cmd.CommandTimeout = 0;
cmd.CommandText = command2;
cmd.ExecuteNonQuery();
}
}
conn.Close();
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
catch (Exception exception)
{
// Create Log File for Errors
using (StreamWriter sw = System.IO.File.CreateText(Dts.Variables["User::FolderPath"].Value.ToString() + "\\" +
Dts.Variables["User::ExcelFileName"].Value.ToString() + datetime + ".log"))
{
sw.WriteLine(exception.ToString());
Dts.TaskResult = (int)ScriptResults.Failure;
}
}
}
#region ScriptResults declaration
/// <summary>
/// This enum provides a convenient shorthand within the scope of this class for setting the
/// result of the script.
///
/// This code was generated automatically.
/// </summary>
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
}
}
Reference参考
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.