2

私はcsvをデータテーブルに変換してSQLデータベースに挿入できるようにするための非常に簡単な方法を書いています。空の文字列を DBNull.Value に置き換えようとしない限り、正確に機能します。その後、ArrayTypeMismatchException がスローされます。受信するストリームは、データを含む単純なカンマ区切りのファイルです。

問題のコード:

public static DataTable StreamToTable(Stream stream, bool headersAvailable, bool convertBlankToDBNull)
    {

        DataTable data = new DataTable();
        StreamReader reader = new StreamReader(stream);

        if (!reader.EndOfStream)
        {
            if (headersAvailable)
            {
                try
                {
                    //get headers from first line
                    string[] headers = reader.ReadLine().Split(',');

                    //construct headers
                    for (int i = 0; i < headers.Length; i++)
                    {
                        data.Columns.Add(headers[i]);
                    }
                }
                catch (IOException ioEx)
                {
                    return null;
                }
            }

            while (!reader.EndOfStream)
            {
                object[] row = reader.ReadLine().Split(',');

                if (convertBlankToDBNull)
                {
                    for (int i = 0; i < row.Length; i++)
                    {
                        if (row[i].ToString().Equals(""))
                        {
                            row[i] = DBNull.Value; //this is where I get the exception
                        }
                    }
                }
                data.Rows.Add(row);
            }

            return data;
        }
        else return null;
    }

何が間違っているのかわかりません...オブジェクト配列であるため、配列に何かを割り当てることができるはずですが、どのようにして型の不一致が生じるのでしょうか?

4

1 に答える 1

2

安全でない配列の共分散の恐ろしさを発見しました。

rowstring[]安全にキャストされていないobject[]です。そのキャストは成功しますが、配列は依然として でありstring[](それが返されるため)、 .として使用Split()することはできません。 特に、 s ではないものはまだ保持できません。object[]
string

代わりに、新しい を作成しobject[]て、それらstringの sを入力できます。

object[] row = Array.ConvertAll(
    reader.ReadLine().Split(','),
    s => (object)s
);
于 2012-11-27T22:00:21.247 に答える