2010-08-26 83 views
1

通過Web應用程序將CSV導入數據庫最簡單的方法是什麼?將逗號分隔數據導入數據表

UPDATE:

CSV的小例子:

stop_id, stop_name, stop_desc, stop_lat, stop_lon, zone_id, stop_url 
TR, Trenton, , 40.2177778, -74.7550000, 6, 
LVTN, Levittown-Tullytown, , 40.1402778, -74.8169444, 5, 
BRST, Bristol, , 40.1047222, -74.8547222, 4, 
CROY, Croydon, , 40.0936111, -74.9066667, 4, 
EDGT, Eddington, , 40.0830556, -74.9336111, 4, 
CORN, Cornwells Heights, , 40.0716667, -74.9522222, 3, 
TORR, Torresdale, , 40.0544444, -74.9844444, 3, 
HOLM, Holmesburg Jct, , 40.0327778, -75.0236111, 2, 
+0

[如何將csv文件讀入.net數據表](http://stackoverflow.com/questions/1050112/how-to-read-a-csv-file-into-a-net- datatable) – Rob 2010-08-26 14:10:27

+0

CSV代表「逗號分隔值」,這是「逗號分隔」的另一種說法。如果你確定這不是你的文本文件的情況,請向我們展示一個你問題中的內容樣本=)你還需要更清楚你所說的「直接導入」的意思,編寫一個小的Windows控制檯應用程序是否可以接受? – Rob 2010-08-26 14:14:31

+0

哦,真的沒有你的權利哈哈。但那裏的答案看起來像一個網頁插入,而不是直接導入。還是我仍然錯了? – balexander 2010-08-26 14:15:43

回答

1

如果拿Portable and Efficient Generic Parser for Flat Files和創建有它的一個引用一個新的Visual C#控制檯應用程序,下面的代碼將一個CSV文件的內容加載到數據表:

using GenericParsing; 
using System.Data; 

namespace CsvToDataTable 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      var pathOfCsvFile = @"C:\MyFile.csv"; 
      var adapter = new GenericParsing.GenericParserAdapter(pathOfCsvFile); 
      DataTable data = adapter.GetDataTable(); 
     } 
    } 
} 

下一步是將數據data保存到數據庫服務器。此代碼假定CSV文件的結構相匹配正是一個表的數據庫稱爲TableName

private static void SaveDataToDatabase(DataTable data) 
{ 
    var connectionString = "CONNECTION STRING GOES HERE"; 
    var commandText = "INSERT INTO [databasename].[dbo].[TableName] " + 
     "(stop_id, stop_name, stop_desc, stop_lat, stop_lon, zone_id, stop_url) " + 
     "VALUES (@stop_id, @stop_name, @stop_desc, @stop_lat, @stop_lon, @zone_id, @stop_url)"; 

    using (var connection = new SqlConnection(connectionString)) 
    { 
     connection.Open(); 
     foreach (DataRow row in data.Rows) 
     { 
      using (var command = new SqlCommand(commandText, connection)) 
      { 
       command.Parameters.AddWithValue("@stop_id", row["stop_id"]); 
       command.Parameters.AddWithValue("@stop_name", row["stop_name"]); 
       command.Parameters.AddWithValue("@stop_desc", row["stop_desc"]); 
       command.Parameters.AddWithValue("@stop_lat", row["stop_lat"]); 
       command.Parameters.AddWithValue("@stop_lon", row["stop_lon"]); 
       command.Parameters.AddWithValue("@zone_id", row["zone_id"]); 
       command.Parameters.AddWithValue("@stop_url", row["stop_url"]); 

       command.ExecuteNonQuery(); 
      } 
     } 
    } 
} 

你會再想要在你的Main方法添加到SaveDataToDatabase通話。我認爲這裏有足夠的代碼讓你調整它來適應你的目的。

+0

@Rob你可以請,如果你不介意。我正在下載該解析器。另外,我知道這可能聽起來很愚蠢,但在添加引用.dll文件之後,是否將上面的代碼放在Web表單中?如果不是什麼文件類型。 – balexander 2010-08-26 14:31:28

+0

@ Bry4n,這是一個「控制檯應用程序」。如果你願意,你可以在WebForm中完成,但總體原則是一樣的! =) – Rob 2010-08-26 14:39:03

+0

@Rob創建Web應用程序更容易嗎?我認爲我的老闆最終會在網絡應用程序中要求哈哈。感謝您的幫助Rob。 – balexander 2010-08-26 14:40:42

0

這真的要取決於你的情況。這是一個內部文本文件被加載到SqlServer 2005或更高版本的數據庫(也是內部)嗎?如果是這樣,您可以編寫一個SSIS包(或者更簡單地說,使用SQL Server的「導入數據...」嚮導),它只會爲您讀取它。

是否有理由擔心未轉義的逗號(比如說,名稱格式在Last,First中的名稱列)?那麼你需要彌補這一點...(在這個問題上,這裏有很多關於SO的問題)。

文件不是內部的,也就是說,有人正在上傳它,它需要實時閱讀嗎?然後,SSIS包仍然是你最好的選擇,並且設置一些代碼(現代FTP服務器通常可以調用可執行文件或批處理文件)以在文件到達時啓動SSIS包。

這確實是一個非常廣泛的各種問題,並沒有更詳細的,我不知道具體怎麼你會得到的將是答案...

+0

我明白這是廣泛的。現在它將會是內部的,但可能會成長爲在線,讓人們只是去上傳並更新數據。這可能意味着我應該走這條路。我不相信未轉義的逗號是一個問題。 – balexander 2010-08-26 14:24:28