【问题标题】:Import Specific fields from .csv to SQL Serverl using File Upload in Asp.net C#使用 Asp.net C# 中的文件上传将特定字段从 .csv 导入 SQL Server
【发布时间】:2013-12-05 19:51:00
【问题描述】:

具有 20 列的 csv 文件,我已经使用 FileUpload Control 上传了该文件,现在我只想从这 20 列中在数据库中添加一列数据,我该如何实现这一点.. 我的代码是-

    DataTable tblReadCSV = new DataTable();
    tblReadCSV.Columns.Add("EmailId");
    string path = System.IO.Path.GetFileName(fupEmails.PostedFile.FileName);
    fupEmails.PostedFile.SaveAs(Server.MapPath("~/Contacts/" + path));
    path = Server.MapPath("~/Contacts/" + path);
    TextFieldParser csvParser = new TextFieldParser(path);
    csvParser.Delimiters = new string[] { "," };
    csvParser.TrimWhiteSpace = true;
    //csvParser.ReadLine();
    while (!csvParser.EndOfData)
    {
        string[] fields = csvParser.ReadFields();
        tblReadCSV.Rows.Add(fields.);
    }
    string connection = @"Data Source=ANURAG-PC; Initial Catalog=MailServer; Persist Security Info=True; User ID=xx; Password=xxxxxx";
    string strSql = "Insert into EmailData(EmailId) Values(@Email)";
    SqlConnection con=new SqlConnection(connection);
    SqlCommand cmd=new SqlCommand();
    cmd.CommandType=CommandType.Text;
    cmd.CommandText=strSql;
    cmd.Connection=con;
    cmd.Parameters.Add("@Email",SqlDbType.NVarChar,250,"EmailId");
    SqlDataAdapter daAdapter=new SqlDataAdapter();
    daAdapter.InsertCommand=cmd;
    int result=daAdapter.Update(tblReadCSV);
    lblError.Text="Send Successfully";

问题出在这三行——

while (!csvParser.EndOfData)
{
    string[] fields = csvParser.ReadFields();
    tblReadCSV.Rows.Add(fields.Equals("Email");
}

这里的字段包含所有的列标题,所以我只想要一个字段的电子邮件,我怎么能做到这一点,上面的行不适用于这个。

【问题讨论】:

  • 我认为在互联网上发布(在您的连接字符串中)您的用户名和密码是不明智的。即使它在SO上。我已经把它们“x'd”了。

标签: c# asp.net .net c#-4.0 csv


【解决方案1】:

您需要创建一个与您的数据表架构匹配的DataRow,然后将已解析的CSV 值行中的正确值插入该行,然后将该行添加到DataTable。大致如下

while (!csvParser.EndOfData)
{
    var fields = csvParser.ReadFields();
    var row = tblReadCSV.NewRow();
    row["EmailId"] = fields[ordinalPositionOfEmailField];
    tblReadCSV.Rows.Add(row)
}

【讨论】:

  • 非常感谢您的建议,但它与我之前的代码相同,它还添加了第一行,它是 csv 文件中列的标题,我不想要第一行。
  • 您之前的代码无法编译。您也可以在进入循环之前通过阅读一次来跳过第一行...
【解决方案2】:

在您的 while 循环之前添加以下行

var FirstRowfields = csvParser.ReadFields();
while(!csvParser.EndOfData)
{
  //your code
}

这将读取第一行,然后开始您的循环将从第二行开始读取,因此您不会标题列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2018-10-19
    • 2013-02-20
    相关资源
    最近更新 更多