我如何更改文本文件中的数据类型以读取字符串而不是整数(C ++ / CLI,OleDb)?

时间:2019-05-06 12:31:03

标签: c++-cli oledb oledbdatareader

我的目标是从文本文件中读取。该文本文件为每个值包含不同的列和行。只要不更改Windows自行设置的数据类型,我就可以读取该文件。但是我不希望“ plz”和“ nr”列为数字(整数),而是文本(字符串)值,因为plz可能包含“ 01979”之类的值,而nr可能包含“ 4a”之类的值。作为数字,开头的零将丢失,因此像明信片这样的东西永远不会到达其预期的目的地。

这样,我需要在“ schema.ini”文件中更改数据类型。但这是行不通的。我认为我犯了一些错误,并且没有按照本教程的要求进行操作:"Schema.ini File"

每次我尝试读取一个字符串时,都会得到一个异常,因为它仍然想读取我需要转换为字符串的Int32值。

我确实将文件命名为“ kunde.txt”

knr|nachname|vorname|plz|ort|strasse|nr
1|Müller|Johan|12345|Muster|Musterstr|1
2|Kummer|Freude|23456|Feeling|Gefühlswelt|4a

Col 0 = knr,1 = nachname,2 = vorname,3 = plz,4 = ort,5 = strasse,6 = nr

con->ConnectionString =
    "Provider=Microsoft.JET.OLEDB.4.0;" +
    "Data Source=D:/C++/Quellen;" +
    "Extended Properties=text";
// ....
meineKunden->CommandText =
    "SELECT knr, nachname, vorname, plz, ort, strasse, nr " +
    "FROM kunde.txt ";
// ....
String ^ str;
while(reader->Read()){
    str += Convert::ToString(reader->GetInt32(0));
    str += " ";
    str += reader->GetString(3);
    str += " ";
    str += reader->GetString(6);
    str += "\r\n";
}
this->txb_Insert->Text = str;

我的schema.ini

[kunde.txt]
ColNameHeader=True  
Format=Delimited(|) 
3=plz Char Width 5
6=nr Char Width 10

我确实尝试使用“ Col3”而不是“ 3”。我确实使用了“文本”而不​​是棕褐色的“ Char”,甚至尝试了不使用宽度的情况。但是每次我收到相同的失败消息。即使我使用4或7,因为我不确定ini / txt文件中的计数方式。

例外:

System.InvalidCastException: Die angegebene Umwandlung ist ungültig.
bei System.Data.OleDb.ColumnBinding.ValueString()
bei System.Data.OleDb.OleDbDataReader.GetString(Int32 ordinal)

例外是str + = reader-> GetString(3)已调用 如果我是正确的,则第3列包含plz。

有人可以说出我对schema.ini文件有何理解错误吗? 因为只要我不尝试在某些列中具体更改数据类型,我就可以毫无错误地读取文件,因此ini文件就必须解决问题。至少我是这样认为的。

编辑:我确实将ini文件更改为:

[kunde.txt]
ColNameHeader=True  
Format=Delimited(|) 
Col1="knr" Integer
Col2="nachname" Text
Col3="vorname" Text
Col4="plz" Text
Col5="ort" Text
Col6="strasse" Text
Col7="nr" Text

现在它适用于“ plz”,但是当我调用“ nr”时在最后一行中调用了异常。 WTF?

1 个答案:

答案 0 :(得分:0)

您必须保持从文件中读取数据的方式适合其写入方式。

因此,如果文件不是由您编写的,而您必须使用它,请尝试了解它是否具有特定的结构(例如:定长记录定界字段,定长记录定长字段等),然后使用一种适合于此结构的阅读方式。

还要尝试了解记录字段的详细信息,因为读取的方式与写入的方式相同。