2010-08-26 37 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