c#中的输入字符串格式不正确,int值格式不正确

时间:2014-12-25 09:56:48

标签: c# sql .net csv int32

以下是它的代码:

protected void Upload(object sender, EventArgs e)
        {
            if (FileUpload1.HasFile)
            {
                //Upload and save the file
                string csvPath = Server.MapPath("~/App_Data/") + Path.GetFileName(FileUpload1.PostedFile.FileName);
                FileUpload1.SaveAs(csvPath);


            DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[7] 
            {
            new DataColumn("pataintno", typeof(int)),
            new DataColumn("Firstname", typeof(string)),
            new DataColumn("Lastname",typeof(string)),
            new DataColumn("Age", typeof(int)),
            new DataColumn("Address", typeof(string)),
            new DataColumn("Email", typeof(string)),
            new DataColumn("Phno", typeof(int)),});


            string csvData = File.ReadAllText(csvPath);
            foreach (string row in csvData.Split('\n'))
            {
                if (!string.IsNullOrEmpty(row))
                {
                    dt.Rows.Add();
                    int i = 0;
                    foreach (string cell in row.Split(','))
                    {
                        dt.Rows[dt.Rows.Count - 1][i] = cell;
                        i++;
                    }
                }
            }

            string consString = ConfigurationManager.ConnectionStrings["cnstr"].ConnectionString;
            using (SqlConnection con = new SqlConnection(consString))
            {
                using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
                {
                    //Set the database table name
                    sqlBulkCopy.DestinationTableName = "Pataint";
                    con.Open();
                    sqlBulkCopy.WriteToServer(dt);
                    con.Close();
                    Array.ForEach(Directory.GetFiles((Server.MapPath("~/App_Data/"))), File.Delete);
                }
            }
        }
        else
        {
            Label1.Text = "PlZ TRY AGAIN";
        }
    }

3 个答案:

答案 0 :(得分:1)

您有一个包含3个整数类型字段的DataTable,错误表明从您的文件中提取的一个或多个数据不是有效整数。

所以你需要检查输入错误(在这些情况下一如既往)

    // Read all lines and get back an array of the lines
    string[] lines = File.ReadAllLines(csvPath);

    // Loop over the lines and try to add them to the table
    foreach (string row in lines)
    {
        // Discard if the line is just null, empty or all whitespaces
        if (!string.IsNullOrWhiteSpace(row))
        {
            string[] rowParts = row.Split(',');

            // We expect the line to be splittes in 7 parts. 
            // If this is not the case then log the error and continue
            if(rowParts.Length != 7)
            {
                // Log here the info on the incorrect line with some logging tool
                continue;
            }

            // Check if the 3 values expected to be integers are really integers
            int pataintno;
            int age;
            int phno;

            if(!Int32.TryParse(rowParts[0], out pataintno))
            {
               // It is not an integer, so log the error
               // on this line and continue
               continue;
            }
            if(!Int32.TryParse(rowParts[3], out age))
            {
               // It is not an integer, so log the error
               // on this line and continue
               continue;
            }
            if(!Int32.TryParse(rowParts[6], out phno))
            {
               // It is not an integer, so log the error
               // on this line and continue
               continue;
            }

            // OK, all is good now, try to create a new row, fill it and add to the 
            // Rows collection of the DataTable
            DataRow dr = dt.NewRow();
            dr[0] = pataintno;
            dr[1] = rowParts[1].ToString();
            dr[2] = rowParts[2].ToString();
            dr[3] = age
            dr[4] = rowParts[4].ToString();
            dr[5] = rowParts[5].ToString();
            dr[6] = phno;
            dt.Rows.Add(dr);
        }
    }

使用Int32.TryParse检查您的输入,如果字符串无法转换为整数,则返回false。在这种情况下,你应该编写一些错误日志来查看循环完成时发现哪些行不正确并修复它们。

另请注意,我在某些方面更改了您的代码:使用File.ReadAllLines,因此您已经在每个新行分割了您的输入(如果换行只是\n或{{1},则没有问题代码),向数据表添加新行的代码也应遵循以下模式:创建新行,用值填充,将新行​​添加到现有集合。

答案 1 :(得分:0)

我检查了代码,看起来很好。我建议你检查csv文件,确保没有任何列的标题。

答案 2 :(得分:0)

我今天在将 csv 解析为 sql 表时遇到了这个问题。我的解析器自一年以来一直运行良好,但今天突然抛出 int 转换错误。 SQL 批量复制的信息量并不大,查看 csv 文件也没有显示数据有任何错误。我在 csv 中的所有数字列都有有效的数值。

所以为了找到错误,我写了下面的自定义方法。错误立即出现在第一条记录上。实际问题是供应商更改了数值的 csv 格式,现在开始呈现十进制值代替整数。因此,例如,代替值 1,csv 文件具有 1.0.0。当我打开 csv 文件时,它只反映 1,但在记事本中,它显示 1.0.0。我的 sql 表具有所有整数值,不知何故 SQL BulkCopy 无法处理这种转换。花了大约 3 个小时来找出这个错误。
解决方案灵感来自 - https://sqlbulkcopy-tutorial.net/type-a-cannot-be-converted-to-type-b

  private void TestData(CsvDataReader dataReader)
    {
        int a = 0;
        while(dataReader.Read())
        {
            try
            {
                a = int.Parse(dataReader[<<Column name>>].ToString());
            }
            catch (Exception ex){}
        }
    }