Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP C#|导入带有数据集的CSV&;DataTableAdapters_C#_Asp.net_File Upload - Fatal编程技术网

ASP C#|导入带有数据集的CSV&;DataTableAdapters

ASP C#|导入带有数据集的CSV&;DataTableAdapters,c#,asp.net,file-upload,C#,Asp.net,File Upload,我有一个带有ASP:FileUpload功能的imports.aspx 在我的代码背后,我有以下内容: SEPTA_DSTableAdapters.ServiceTBLTableAdapter sta = new SEPTA_DSTableAdapters.ServiceTBLTableAdapter(); SEPTA_DSTableAdapters.RoutesTBLTableAdapter rta = new SEPTA_DSTableAdapters.RoutesTBLTableA

我有一个带有
ASP:FileUpload
功能的
imports.aspx

在我的代码背后,我有以下内容:

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)
这是StackTrace

[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
现在,我有两个问题

  • 我在
    int insertData
    部分得到一个
    行不存在的
    错误,我如何修复该错误

  • 文件的第一行显然是CSV的列名,但插入时需要跳过这一行


  • 提前感谢大家。

    您的第一期在这里:

    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\u id、route\u short\u name、route\u long\u name、route\u desc、agency\u id、route\u type、route\u color、route\u text\u color、route\u 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),以准确确定它的调用。但我怀疑它已经跳过了这一行

    另一方面,您可能需要考虑重新构造代码,使其更具可读性、可维护性和可调试性。请尝试以下方法:

    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
    扩展方法来创建外观更清晰的代码:

    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");
    
    var routeId=行字段(“路由id”);
    var routeShortName=行字段(“路由名称”);
    var routeLongName=行字段(“路由长名称”);
    var routeType=行字段(“路由类型”);
    var routeUrl=行字段(“路由url”);
    
    您可以发布SEPTAdstableAdapters和GenericParserAdapter中的相关代码吗?@Abe Miessler我发布了datatableadapter中使用的查询,并且GenericParserAdapter是一个参考。包含dll以将CSV分割为各个列。您是将参数添加到命令中还是一个严格的文本查询?(即“插入…”)如果您可以发布所获得的异常的完整stacktrace,则会有所帮助。@XstreamINsanity插入在数据集中的DataTableAdapter中,因此它是严格的@Dave Swersky我将发布StackTrace。@Rob我有
    “route\u id”
    它不起作用。我也知道我可以把它缩短,让它更具可读性。知道它是
    “route_id”
    它为什么不工作?@Bry4n,在
    foreach(data.Rows中的DataRow)行上放置一个断点
    ,然后使用Visual Studio调试器查看
    数据
    表以查看它包含哪些列,这将是解决问题的一个很好的起点=)@Rob Yeah现在我得到了这个错误
    列'route_id'不属于表。
    on
    var routeId=Convert.ToInt32(行[“route_id]”)我现在就这么做。@Rob展示了一个8号项目数组,
    [0]=“route\u id”[1]=“route\u short\u name”
    等等etc@Rob
    data.Rows
    ItemArray包含所有行,包括其中的列名。