我的目标是从文本文件中读取。该文本文件为每个值包含不同的列和行。只要不更改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?
答案 0 :(得分:0)
您必须保持从文件中读取数据的方式适合其写入方式。
因此,如果文件不是由您编写的,而您必须使用它,请尝试了解它是否具有特定的结构(例如:定长记录定界字段,定长记录定长字段等),然后使用一种适合于此结构的阅读方式。
还要尝试了解记录字段的详细信息,因为读取的方式与写入的方式相同。