2

Excelシートに3つの列があるSQL Server dbにExcelをインポートしています:

id(数字のみ)|データ|パスポート

インポートする前に、次のような特定のことを確認したい:

  • パスポートは文字で始まり、残りの文字は数字でなければなりません
  • 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 が Excel で数値である限り、id の値を確認できます。25h547 の id を持つセルに流れが来ると、b が "" の場合に値が返されます。これには何か理由がありますか? 必要に応じて、コード全体を提供できます。

    4

    2 に答える 2

    2

    発生しているように見えるのは、データが保持データテーブルにインポートされ、列の最初のレコードが英数字である場合、最初のレコードが数値の場合、列のすべてのレコードが英数字であると想定されることです。列は数値であるため、列のどこかに出現する英数字レコードの場合は空白になります。connectionstring を変更して自分で問題を解決しました: "Excel 8.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text"

    「IMEX=1;」は、「混合」(数値、日付、文字列など) のデータ列を常にテキストとして読み取るようにドライバーに指示します。

    于 2012-11-07T04:06:36.383 に答える
    0

    混合値を処理するには、接続文字列で imex モードを指定します

    参照: Excel 行の混合値

    欠損値。Excel ドライバーは、指定されたソースの特定の行数 (既定では 8 行) を読み取り、各列のデータ型を推測します。列にデータ型が混在しているように見える場合、特にテキスト データと数値データが混在している場合、ドライバーは多数派のデータ型を優先することを決定し、他の型のデータを含むセルには null 値を返します。(引き分けでは、数値型が勝ちます。) Excel ワークシートのほとんどのセルの書式設定オプションは、このデータ型の決定に影響を与えないようです。インポート モードを指定することで、Excel ドライバーのこの動作を変更できます。インポート モードを指定するには、[プロパティ] ウィンドウで Excel 接続マネージャーの接続文字列の拡張プロパティの値に IMEX=1 を追加します。

    于 2012-11-06T09:50:54.093 に答える