ASP C # |Импорт CSV с помощью DataSets и DataTableAdapters - PullRequest
0 голосов
/ 26 августа 2010

У меня imports.aspx с функцией ASP:FileUpload.

В моем коде есть:

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

Теперь у меня есть два вопроса.

  1. Я получаю row does not exist ошибку в части int insertData, как я могу это исправить?

  2. В первой строке файла четко указаны имена столбцов в CSV, но при вставке мне нужно пропустить эту строку.

Заранее всем спасибо.

1 Ответ

1 голос
/ 26 августа 2010

Ваша первая проблема здесь:

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), который сопровождает его, чтобы точно определить, как он называется.Я подозреваю, что он уже пропускает эту строку.

Кстати, вы можете подумать о реструктуризации вашего кода, чтобы сделать его более читабельным, обслуживаемым и отлаживаемым.Попробуйте вместо этого:

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...