[英]How can I create schema.ini file? I need to export my .csv file to datagridview
[英]C# import CSV file with schema.ini creates table but doesn't load data
我需要將一些CSV文件導入MDB數據庫中的臨時表。 這些文件來自ASP.NET Web應用程序上的文件上載。
這是我的CSV文件:
"Operating Unit Organization Name";"Year";"Sales Rep Name";"Date";"Week";"Product Number";"Account Name";"Customer Number";"Corporate Brand";"Brand";"Ordered Quantity";"Amount"
"IT Operating Unit";2014;"Name-561004";2014-02-21;"2014 Week08";"123456+";"Buyer name";"456789";"Corp Brand";"Brand";4;147,52
"IT Operating Unit";2014;"Name-561004";2014-02-21;"2014 Week08";"123.012EXP";"Buyer name";"789123";"Corp Brand";"Brand";10;204,9
"IT Operating Unit";2014;"Name-561004";2014-02-17;"2014 Week08";"101S-3";"Buyer name";"234567";"Another Corp Brand";"Another Brand";30;237,5
這是生成 schema.ini
文件的方法。 由於它必須包含CSV文件的名稱,因此每次上傳新CSV時都會生成新的模式文件,因為我需要將它們全部保存在具有特定名稱的文件夾中。
private void CreateCsvSchemaFile()
{
using (FileStream fs = new FileStream(Path.GetDirectoryName(FilePath) + "\\schema.ini", FileMode.Create, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine("[" + Path.GetFileName(FilePath) + "]");
sw.WriteLine("ColNameHeader=True");
//sw.WriteLine("MaxScanRows=0");
sw.WriteLine("Format=Delimited(;)");
sw.WriteLine("DateTimeFormat=yyyy-MM-dd");
sw.WriteLine("CharacterSet=ANSI");
sw.WriteLine("DecimalSymbol=,");
sw.WriteLine("Col1=\"Operating Unit Organization Name\" Text Width 255");
sw.WriteLine("Col2=\"Year\" Long");
sw.WriteLine("Col3=\"Sales Rep Name\" Text Width 255");
sw.WriteLine("Col4=\"Date\" DateTime");
sw.WriteLine("Col5=\"Week\" Text Width 255");
sw.WriteLine("Col6=\"Product Number\" Text Width 255");
sw.WriteLine("Col7=\"Account Name\" Text Width 255");
sw.WriteLine("Col8=\"Customer Number\" Text Width 255");
sw.WriteLine("Col9=\"Corporate Brand\" Text Width 255");
sw.WriteLine("Col10=\"Brand\" Text Width 255");
sw.WriteLine("Col11=\"Ordered Quantity\" Long");
sw.WriteLine("Col12=\"Amount\" Currency");
sw.Close();
sw.Dispose();
}
fs.Close();
fs.Dispose();
}
}
schema.ini
文件始終正確生成,實際上db上的表是使用正確的字段名稱和類型創建的。
這是執行CSV導入的方法。
private void ImportCsvIntoTemp()
{
try
{
CreateCsvSchemaFile();
string query = @"SELECT * INTO TEMP_CSV
FROM [Text;HDR=no;Database={0}].[{1}]";
query = String.Format(query, Path.GetDirectoryName(FilePath), Path.GetFileName(FilePath));
AccessDb.Query(AccessDbConnString, query);
}
catch (Exception ex)
{
string message = String.Format("CSV file import failed. Inner Exception: {0}", ex.Message);
throw new ImportFailedException(message);
}
}
表TEMP_CSV
已正確創建, 但未加載任何數據 。 相反,如果我用Access打開MDB,我會看到8個空行。 我試圖更改schema.ini
文件中的一些參數,例如添加/刪除MaxScnaRows=0
, CharacterSet
等等......在查詢中我也嘗試更改FROM Properties
,但我總是得到相同的結果。
- 編輯添加了AccessDb.Query()方法和數據庫連接字符串 -
我沒有包含Query()
方法,因為AccessDb
只是一個“DB層”類,它包含創建與db的連接並執行帶/不帶參數的查詢/列表查詢/標量的方法。 我在其他頁面以及許多其他應用程序中使用此類。
無論如何,這是AccessDb.Query()
方法。
public static void Query(string connString, string query)
{
OleDbConnection conn = new OleDbConnection(connString);
try
{
conn.Open();
OleDbCommand cmd = conn.CreateCommand();
cmd.CommandText = query;
cmd.ExecuteNonQuery();
cmd.Dispose();
}
catch (OleDbException odbEx)
{
throw odbEx;
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Dispose();
conn.Close();
}
}
這是我的數據庫連接字符串,在Web.config
文件中配置。
<connectionStrings>
<add name="DefaultConnection" providerName="System.Data.OleDb" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Progetti\Personale\Progetti\Infomed\Database\Infomed.mdb;User Id=admin;Password=;" />
</connectionStrings>
您發布的代碼基本上是正確的。 我將其復制並粘貼到一個新的C#項目中,並將其調整到足以讓它運行。 當我確實讓它運行時,它工作正常,創建新表並將所有三(3)行導入其中。
主要區別在於我只是使用以下代碼來執行SELECT * INTO ...
查詢。 代替...
AccessDb.Query(AccessDbConnString, query);
...我用了...
using (OleDbConnection con = new OleDbConnection())
{
con.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=C:\Users\Public\test\CsvImportTest\MyDb.mdb;";
con.Open();
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = con;
cmd.CommandText = query;
cmd.ExecuteNonQuery();
}
con.Close();
}
完整的代碼是:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Data.OleDb;
namespace CsvImportTest
{
class Program
{
static string FilePath = @"C:\Users\Public\test\CsvImportTest\TestData.csv";
static void Main(string[] args)
{
ImportCsvIntoTemp();
Console.WriteLine("Done.");
}
private static void ImportCsvIntoTemp()
{
try
{
CreateCsvSchemaFile();
string query = @"SELECT * INTO TEMP_CSV
FROM [Text;HDR=no;Database={0}].[{1}]";
query = String.Format(query, Path.GetDirectoryName(FilePath), Path.GetFileName(FilePath));
//AccessDb.Query(AccessDbConnString, query);
using (OleDbConnection con = new OleDbConnection())
{
con.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=C:\Users\Public\test\CsvImportTest\MyDb.mdb;";
con.Open();
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = con;
cmd.CommandText = query;
cmd.ExecuteNonQuery();
}
con.Close();
}
}
catch (Exception ex)
{
string message = String.Format("CSV file import failed. Inner Exception: {0}", ex.Message);
Console.WriteLine(message);
//throw new ImportFailedException(message);
}
}
private static void CreateCsvSchemaFile()
{
using (FileStream fs = new FileStream(Path.GetDirectoryName(FilePath) + "\\schema.ini", FileMode.Create, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine("[" + Path.GetFileName(FilePath) + "]");
sw.WriteLine("ColNameHeader=True");
//sw.WriteLine("MaxScanRows=0");
sw.WriteLine("Format=Delimited(;)");
sw.WriteLine("DateTimeFormat=yyyy-MM-dd");
sw.WriteLine("CharacterSet=ANSI");
sw.WriteLine("DecimalSymbol=,");
sw.WriteLine("Col1=\"Operating Unit Organization Name\" Text Width 255");
sw.WriteLine("Col2=\"Year\" Long");
sw.WriteLine("Col3=\"Sales Rep Name\" Text Width 255");
sw.WriteLine("Col4=\"Date\" DateTime");
sw.WriteLine("Col5=\"Week\" Text Width 255");
sw.WriteLine("Col6=\"Product Number\" Text Width 255");
sw.WriteLine("Col7=\"Account Name\" Text Width 255");
sw.WriteLine("Col8=\"Customer Number\" Text Width 255");
sw.WriteLine("Col9=\"Corporate Brand\" Text Width 255");
sw.WriteLine("Col10=\"Brand\" Text Width 255");
sw.WriteLine("Col11=\"Ordered Quantity\" Long");
sw.WriteLine("Col12=\"Amount\" Currency");
sw.Close();
sw.Dispose();
}
fs.Close();
fs.Dispose();
}
}
}
}
檢查您用來實際執行SELECT * INTO ...
查詢的代碼,看看您是否能找到代碼和我的代碼之間的重大差異。
最后我找到了問題所在。 首先,您應該注意要導入的文件的字符集。 如果將schema.ini
文件設置為ANSI,則必須確保是ANSI。 然后我也遇到了一些"DecimalSymbol=,"
選項的麻煩。 刪除后導入工作正常。 無論如何,使用我的語言環境設置(Italia(Italiano))它應該是正確的,因為小數符號是','
...
所以這是創建schema.ini
文件的最終方法。
private void CreateCsvSchemaFile()
{
using (FileStream fs = new FileStream(Path.GetDirectoryName(FilePath) + "\\schema.ini", FileMode.Create, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine("[" + Path.GetFileName(FilePath) + "]");
sw.WriteLine("ColNameHeader=True");
sw.WriteLine("Format=Delimited(;)");
sw.WriteLine("DateTimeFormat=yyyy-MM-dd");
sw.WriteLine("CharacterSet=ANSI");
sw.WriteLine("Col1=\"Operating Unit Organization Name\" Text Width 255");
sw.WriteLine("Col2=\"Year\" Long");
sw.WriteLine("Col3=\"Sales Rep Name\" Text Width 255");
sw.WriteLine("Col4=\"Date\" DateTime");
sw.WriteLine("Col5=\"Week\" Text Width 255");
sw.WriteLine("Col6=\"Product Number\" Text Width 255");
sw.WriteLine("Col7=\"Account Name\" Text Width 255");
sw.WriteLine("Col8=\"Customer Number\" Text Width 255");
sw.WriteLine("Col9=\"Corporate Brand\" Text Width 255");
sw.WriteLine("Col10=\"Brand\" Text Width 255");
sw.WriteLine("Col11=\"Ordered Quantity\" Long");
sw.WriteLine("Col12=\"Amount\" Currency");
sw.Close();
sw.Dispose();
}
fs.Close();
fs.Dispose();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.