当前位置: 首页 > 编程语言 > C#

从SqlDataReader写入多个文件分享

时间:2023-04-10 16:34:14 C#

从SqlDataReader写入多个文件我创建了一个数据读取器流,我正在尝试将结果写入一个文件。由于此表可能返回数百万条记录,因此我想写入多个文件,以便我可以在文本编辑器中毫无问题地打开它们,即。由于文件太大,文本编辑器崩溃了。这就是我现在的大致情况。使用(varconnection=newSqlConnection(connectionString))使用(varstream=newFileStream("directoryLocation",FileMode.Create)){SqlCommand命令=connection.CreateCommand();command.CommandText="从tblTemp中选择*";连接.Open();使用(SqlDataReaderreader=command.ExecuteReader()){vartableName=“tblTemp”;var文件名=表名+".txt";var记录数=0;变种文件计数=0;using(StreamWriterwriter=newStreamWriter(stream.Open())){while(reader.Read()){if(recordCount==500000){//就在这里。需要弄清楚如何关闭旧文件startnewrecordCount=0;writer.Close();fileName=tableName+"_"+(++fileCount).ToString()+".txt";writer=newStreamWriter(文件名);//我知道这行不通。只需sudo代码}recordCount++;writer.WriterLine(recordInfo);//recordInfo也是sudo代码}}}}我不想将usingwriter语句移动到reader循环中,因为这会打开和关闭每条记录的文件连接。关于如何保持我在阅读器中的位置并且只在需要时打开和关闭文件的任何想法?你很接近。您不需要单独的FileStream。循环创建一个新的StreamWriter只要之前的StreamWriter按需要处理即可。使用(varconnection=newSqlConnection(connectionString)){SqlCommand命令=connection.CreateCommand();command.CommandText="从tblTemp中选择*";connection.Open();使用(SqlDataReaderreader=command.ExecuteReader()){vartableName=“tblTemp”;var文件名=表名+".txt";var记录数=0;变种文件计数=0;StreamWriterwriter=null;try{while(reader.Read()){if(writer==null||recordCount==500000){recordCount=0;//关闭上一个文件,如果它是打开的...if(writer!=null){writer.Close();writer.Dispose();}fileName=tableName+"_"+(++fileCount).ToString()+".txt";//打开新文件...writer=newStreamWriter(fileName);}记录计数++;writer.WriterLine(recordInfo);//recordInfo也是sudo代码}}finally{//确保文件被关闭...if(writer!=null){writer.Dispose();}}}}就个人而言,我会使用TextWriter的自定义覆盖来删除使用代码滚动文件名的逻辑。像这样的东西是完全未经测试的,可能不是线程安全的,效率低下(它目前一次只写一个字符!),并且可能是错误的代码:私有只读字符串_fileNameSuffix;私有只读int_maxRecordCount;私有流_innerStream;私人int_recordCount=0;私人int_fileCounter=0;publicRollingFileWriter(stringfilenamePrefix,stringfileNameSuffix=".txt",intmaxRecordCount=500000){_filenamePrefix=filenamePrefix;_fileNameSuffix=文件名后缀;_maxRecordCount=maxRecordCount;_innerStream=newFileStream(_filenamePrefix+"_"+_fileCounter.ToString()+_fileNameSuffix,FileMode.Create);}publicoverrideEncodingEncoding{get{returnEncoding.UTF8;}}publicoverridevoidWrite(charvalue){_innerStream.Write(Encoding.GetBytes(new[]{value}),0,1);}publicoverridevoidWriteLine(stringvalue){if(++_recordCount==_maxRecordCount){SwitchStreams();}base.WriteLine(值);}privatevoidSwitchStreams(){_innerStream.Close();_innerStream.Dispose();_innerStream=newFileStream(_filenamePrefix+"_"+(++_fileCounter).ToString()+_fileNameSuffix,FileMode.Create);_recordCount=0;}protectedoverridevoidDispose(booldisposing){if(disposing){_innerStream.Dispose();然后你可以去掉外层的FileStream,把内层的StreamWriter换成RollingFileWriter,把循环里的其他逻辑全部去掉教程:从SqlDataReader写入多个文件,共享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: