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
部分得到一个行不存在的错误,我如何修复该错误
提前感谢大家。您的第一期在这里:
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'不属于表。
onvar routeId=Convert.ToInt32(行[“route_id]”)代码>我现在就这么做。@Rob展示了一个8号项目数组,[0]=“route\u id”[1]=“route\u short\u name”
等等etc@Robdata.Rows
ItemArray包含所有行,包括其中的列名。