Я использую задачу потока данных для подключения к источнику oledb и запуска кода SQL, который создает миллионы строк.Каждая строка представляет собой содержимое XML, существует только один столбец (nvarchar (max)).Я подключаю это к назначению компонента скрипта, причина в том, что когда количество строк достигает 10 КБ, я хочу остановиться и записать в другой файл.
Это прекрасно работает, когда я использую точку останова, поэтому, если есть 100 строк, и яхочу 10 строк в каждом файле, когда я использую точку останова, он создает 10 файлов.Но когда я запускаю pacakge без точек останова, он создает случайное количество файлов.Например: он создает 6 файлов, 3 из которых содержат 10 строк, а остальные 70 разбиты на другие файлы.
Я прочитал документы и блоги, чтобы увидеть, является ли входной буфер синхронным, и кажется, что это так.т.е. каждая строка обрабатывается по одному, по крайней мере, таково мое понимание, поэтому я не уверен, что является основной причиной этой проблемы?Может кто-нибудь, пожалуйста, пролить немного света.Ниже приведен код, который я использую для разделения файлов в Script Componenet
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
StreamWriter writer;
int rowCount = 0;
int rowLimit = 50;
String RunFileName = "C:\\Users\\Desktop\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt";
public override void PreExecute()
{
base.PreExecute();
writer = new System.IO.StreamWriter(RunFileName, true);
rowCount = 0;
}
public override void PostExecute()
{
base.PostExecute();
writer.Dispose();
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (rowCount == rowLimit)
{
writer.Dispose();
rowCount = 0;
RunFileName = "C:\\Users\\Desktop\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt";
writer = new System.IO.StreamWriter(RunFileName, true);
}
var data = System.Text.Encoding.Unicode.GetString(Row.XMLInnerText.GetBlobData(0, Convert.ToInt32(Row.XMLInnerText.Length)));
writer.WriteLine(data);
rowCount++;
}
}