2010-08-26 60 views
0

我有imports.aspxASP:FileUpload函数。ASP C#|使用DataSets和DataTableAdapters导入CSV

在我的代码隐藏我有这样的:

SEPTA_DSTableAdapters.ServiceTBLTableAdapter sta = new SEPTA_DSTableAdapters.ServiceTBLTableAdapter(); 
    SEPTA_DSTableAdapters.RoutesTBLTableAdapter rta = new SEPTA_DSTableAdapters.RoutesTBLTableAdapter(); 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     ServiceDDL.DataBind(); 
    } 
    protected void Submit_Click(object sender, ImageClickEventArgs e) 
    { 
     if (ImportRoutes.HasFile) 
     { 
      //Parse CSV 
      StreamReader reader = new StreamReader(ImportRoutes.FileContent); 
      var pathOfCsvFile = reader; 
      var adapter = new GenericParsing.GenericParserAdapter(pathOfCsvFile); 
      DataTable data = adapter.GetDataTable(); 

      foreach (DataRow row in data.Rows) 
      { 
       int insertData = Convert.ToInt32(rta.InsertRoutes(Convert.ToInt32(row["RouteID"]), ServiceDDL.SelectedValue, row["ShortName"].ToString(), row["LongName"].ToString(), row["Type"].ToString(), row["Url"].ToString())); 
      } 
     } 
    } 

这里是我的导入代码示例:

route_id,route_short_name,route_long_name,route_desc,agency_id,route_type,route_color,route_text_color,route_url 
AIR,AIR,Airport Line, ,SEPTA,2,44697D,FFFFFF, 
CHE,CHE,Chestnut Hill East, ,SEPTA,2,44697D,FFFFFF, 
CHW,CHW,Chestnut Hill West, ,SEPTA,2,44697D,FFFFFF, 
CYN,CYN,Cynwyd, ,SEPTA,2,44697D,FFFFFF, 

我的数据库列:

RouteID 
Category 
ShortName 
LongName 
Type 
Url 

这是我的插入查询:

INSERT INTO [dbo].[RoutesTBL] ([RouteID], [Category], [ShortName], [LongName], [Type], [Url]) VALUES (@RouteID, @Category, @ShortName, @LongName, @Type, @Url) 

这里是堆栈跟踪

[ArgumentException: Column 'RouteID' does not belong to table .] 
    System.Data.DataRow.GetDataColumn(String columnName) +1775301 
    System.Data.DataRow.get_Item(String columnName) +13 
    Import.Submit_Click(Object sender, ImageClickEventArgs e) in c:\Documents and Settings\abpa\Desktop\ASP\SEPTAWeb\Import.aspx.cs:32 
    System.Web.UI.WebControls.ImageButton.OnClick(ImageClickEventArgs e) +108 
    System.Web.UI.WebControls.ImageButton.RaisePostBackEvent(String eventArgument) +118 
    System.Web.UI.WebControls.ImageButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565 

现在,我有两个问题。

  1. 我得到一个错误row does not existint insertData部分,我该怎么解决呢?

  2. 该文件的第一行显然是CSV的列名,但插入时我需要跳过这一行。

预先感谢所有。

+0

是否可以从SEPTA_DSTableAdapters发布任何相关的代码和GenericParserAdapter? – 2010-08-26 16:14:35

+0

@Abe Miessler我发布了在datatableadapter中使用的查询,并且GenericParserAdapter是一个引用.dll,用于将CSV分割成单独的列。 – balexander 2010-08-26 16:18:27

+0

您是将参数添加到命令还是严格的文本查询? (即“INSERT INTO ...”) – XstreamINsanity 2010-08-26 16:25:02

回答

1

你的第一个问题就在这里:

DataTable data = adapter.GetDataTable(); 

foreach (DataRow row in data.Rows) 
{ 
    int insertData = Convert.ToInt32(rta.InsertRoutes(Convert.ToInt32(row["RouteID"]), ServiceDDL.SelectedValue, row["ShortName"].ToString(), row["LongName"].ToString(), row["Type"].ToString(), row["Url"].ToString())); 
} 

正如你的CSV示例所示,在该文件中的列route_id,route_short_name,route_long_name,route_desc,agency_id,route_type,route_color,route_text_color,route_url,但在你的代码你正在试图获得列名为RouteId从行,试试:

int insertData = Convert.ToInt32(rta.InsertRoutes(Convert.ToInt32(row["route_id"]), ServiceDDL.SelectedValue, row["route_short_name"].ToString(), row["route_long_name"].ToString(), row["route_type"].ToString(), row["route_url"].ToString())); 

对于你的第二个问题,有您可以在GenericParserAdapter集来定义的第一行是否为标题或数据处理,看看帮助文件属性(的.chm )伴随它来确定pre明智地它叫什么。我怀疑它已经跳过了这一行。

在附注上,您可能想考虑重构代码以使其更具可读性,可维护性和可调试性。试试这个:

var routeId = Convert.ToInt32(row["route_id"]); 
var routeShortName = Convert.ToString(row["route_short_name"]); 
var routeLongName = Convert.ToString(row["route_long_name"]); 
var routeType = Convert.ToString(row["route_type"]); 
var routeUrl = Convert.ToString(row["route_url"]); 

int insertData = Convert.ToInt32(rta.InsertRoutes(routeId, ServiceDDL.SelectedValue, routeShortName, routeLongName, routeType, routeUrl)); 

更可读,呃?

如果你能添加引用System.Data.DataSetExtensions(即.NET 3.5),然后你可以使用DataRow.Field<T>扩展方法甚至清洁寻找代码:

var routeId = row.Field<int>("route_id"); 
var routeShortName = row.Field<string>("route_short_name"); 
var routeLongName = row.Field<string>("route_long_name"); 
var routeType = row.Field<string>("route_type"); 
var routeUrl = row.Field<string>("route_url"); 
+0

@Rob我确实有''route_id''它没有工作。我也知道我可以缩短它并使其更具可读性。知道它是''route_id''它怎么不起作用? – balexander 2010-08-26 17:46:33

+0

@ Bry4n,在'foreach(DataRow row in data.Rows)'行上放置一个断点,然后使用Visual Studio Debugger查看'data'表来查看它包含的列,这将是一个很好的开始指出工作出了什么错=) – Rob 2010-08-26 17:49:50

+0

@Rob是啊现在我得到这个错误'列'route_id'不属于表'var onId = Convert.ToInt32(row [“route_id”]);'我会现在就这样做。 – balexander 2010-08-26 17:58:48