我有一個查詢通過SqlDataReader
獲取報告數據,並將SqlDataReader
發送到將內容導出到.CSV
文件的方法;但是,列名顯示在.CSV
文件中,它們出現在數據庫中的方式並不理想。SqlDataReader在導出到csv時更改列名稱
我不想更改查詢本身(更改名稱以具有空格),因爲此查詢在其映射到對象且空間不起作用的另一個位置中調用。我不想創建重複的查詢,因爲維護可能有問題。我也不想修改寫出.CSV
的方法,因爲這是一種全局使用的方法。
我可以在填充數據閱讀器之後但在將其發送到.CSV
方法之前修改列名稱?如果是這樣,怎麼樣?
如果我不能這樣做,我可以這樣做,如果它是DataTable
而不是?
這裏的一般流程:
public static SqlDataReader RunMasterCSV(Search search)
{
SqlDataReader reader = null;
using (Network network = new Network())
{
using (SqlCommand cmd = new SqlCommand("dbo.MasterReport"))
{
cmd.CommandType = CommandType.StoredProcedure;
//Parameters here...
network.FillSqlReader(cmd, ref reader);
<-- Ideally would like to find a solution here -->
return reader;
}
}
}
public FileInfo CSVFileWriter(SqlDataReader reader)
{
DeleteOldFolders();
FileInfo file = null;
if (reader != null)
{
using (reader)
{
var WriteDirectory = GetExcelOutputDirectory();
double folderToSaveInto = Math.Ceiling((double)DateTime.Now.Hour/Folder_Age_Limit.TotalHours);
string uploadFolder = GetExcelOutputDirectory() + "\\" + DateTime.Now.ToString("ddMMyyyy") + "_" + folderToSaveInto.ToString();
//Add directory for today if one does not exist
if (!Directory.Exists(uploadFolder))
Directory.CreateDirectory(uploadFolder);
//Generate random GUID fileName
file = new FileInfo(uploadFolder + "\\" + Guid.NewGuid().ToString() + ".csv");
if (file.Exists)
file.Delete();
using (file.Create()) { /*kill the file stream immediately*/};
StringBuilder sb = new StringBuilder();
if (reader.Read())
{
//write the column names
for (int i = 0; i < reader.FieldCount; i++)
{
AppendValue(sb, reader.GetName(i), (i == reader.FieldCount - 1));
}
//write the column names
for (int i = 0; i < reader.FieldCount; i++)
{
AppendValue(sb, reader[i] == DBNull.Value ? "" : reader[i].ToString(), (i == reader.FieldCount - 1));
}
int rowcounter = 1;
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
AppendValue(sb, reader[i] == DBNull.Value ? "" : reader[i].ToString(), (i == reader.FieldCount - 1));
}
rowcounter++;
if (rowcounter == MaxRowChunk)
{
using (var sw = file.AppendText())
{
sw.Write(sb.ToString());
sw.Close();
sw.Dispose();
}
sb = new StringBuilder();
rowcounter = 0;
}
}
if (sb.Length > 0)
{
//write the last bit
using (var sw = file.AppendText())
{
sw.Write(sb.ToString());
sw.Close();
sw.Dispose();
sb = new StringBuilder();
}
}
}
}
}
return file;
}
沒有看到你如何實際使用讀卡器來寫,很難給你一個確切的答覆文件,但爲什麼不乾脆改列名,當你將其導出爲CSV文件? – Tim 2015-04-03 20:04:08
但是,如前所述,我已經包含了編寫CSV的代碼,但我不想爲此報告定製此方法,因爲它是全局使用的方法。謝謝 – 2015-04-03 20:19:41
您使用的是哪個版本的Sql Server? – 2015-04-03 20:33:27