2

我正在将 excel 导入 sql server db,excel 表有三列:

id(仅限数字)|数据|护照

在导入它之前,我想检查某些事情,例如:

  • 护照应该以字母开头,其余字符必须是数字
  • id 只能是数字
  • 我可以检查护照,但即使我使用与检查护照相同的代码,我也无法检查身份证。

                 using (DbDataReader dr = command.ExecuteReader())
            {
                // SQL Server Connection String
                string sqlConnectionString = "Data Source=DITSEC3;Initial Catalog=test;Integrated Security=True";
    
                con.Open();
                DataTable dt7 = new DataTable();
                dt7.Load(dr);
                DataRow[] ExcelRows = new DataRow[dt7.Rows.Count];
                DataColumn[] ExcelColumn = new DataColumn[dt7.Columns.Count];
    
                //=================================================
                for (int i1 = 0; i1 < dt7.Rows.Count; i1++)
                {
    
                    if (dt7.Rows[i1]["passport"] == null)
                    {
                        dt7.Rows[i1]["passport"] = 0;
    
                    }
                    if (dt7.Rows[i1]["id"] == null)
                    {
                        dt7.Rows[i1]["id"] = 0;
                    }
    
                    string a = Convert.ToString(dt7.Rows[i1]["passport"]);
                    string b = dt7.Rows[i1]["id"].ToString();
    
                    if (!string.IsNullOrEmpty(b))
                    {
                        int idlen = b.Length;
    
                        for (int j = 0; j < idlen; j++)
                        {
                            if (Char.IsDigit(b[j]))
                            {
                                //action
                            }
                            if(!Char.IsDigit(b[j]))
                            {
                                flag = flag + 1;
                                int errline = i1 + 2;
                                Label12.Text = "Error at line: " + errline.ToString();
                                //Label12.Visible = true;
                            }
                        }
                        if (!String.IsNullOrEmpty(a))
                        {
                            int len = a.Length;
    
                            for (int j = 1; j < len; j++)
                            {
                                if (Char.IsLetter(a[0]) && Char.IsDigit(a[j]) && !Char.IsSymbol(a[j]))
                                {
                                    //action
                                }
                                else
                                {
                                    flag = flag + 1;
                                    int errline = i1 + 2;
                                    Label12.Text = "Error at line: " + errline.ToString();
                                    //Label12.Visible = true;
                                }
    
    
                        }
                    }
    
    
    
    
                     }
    

    出于某种奇怪的原因,当我使用断点时,我可以看到 id 的值,只要 id 是 excel 中的数字,当流到达 id 为 25h547 的单元格时,如果 b 转为“”,这个值有什么原因吗?如果你需要,我可以给你完整的代码。

    4

    2 回答 2

    2

    似乎正在发生的事情是,当数据被导入保存数据表并且列中的第一条记录是字母数字时,如果第一个是数字,它将假定列中的所有记录都是字母数字,它将假定所有记录在列是数字,因此对于出现在列中某处的字母数字记录将是空白的。我自己通过修改连接字符串解决了这个问题:“Excel 8.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text”

    “IMEX=1;” 告诉驱动程序始终将“混合”(数字、日期、字符串等)数据列作为文本读取。

    于 2012-11-07T04:06:36.383 回答
    0

    在连接字符串中指定 imex 模式以处理混合值

    请参阅:Excel 行中的混合值

    缺失值。Excel 驱动程序读取指定源中的一定数量的行(默认为 8 行)来猜测每列的数据类型。当一列似乎包含混合数据类型,尤其是数字数据与文本数据混合时,驱动程序决定支持多数数据类型,并为包含其他类型数据的单元格返回空值。(在平局中,数字类型获胜。)Excel 工作表中的大多数单元格格式选项似乎不会影响此数据类型的确定。您可以通过指定导入模式来修改 Excel 驱动程序的这种行为。要指定导入模式,请将 IMEX=1 添加到属性窗口中 Excel 连接管理器的连接字符串中的扩展属性的值

    于 2012-11-06T09:50:54.093 回答