My goal
I need to create a .dbf file in a specific format, specified by a client. The format being dBase III .dbf with kamenicky encoding, using Integer, Character of various lengths and Double column types.
Problem
I got pretty much everything working, with only one hurdle in the way: the darn encoding refuses to work, in spite of a specific conversion table being written which switches original chars with those compatible with kamenicky encoding. This means that the output file ends up with, for example, HEX value of FF for a char which was specified as hex value of A0 in the imported string.
If you're going to (-1) the question, I would greatly appreciate information as to why are you doing so in comments - even a "You don't understand the issue sufficiently" would be of great help as I would know where to continue my research (as in, at very basics in that case)
I have kind of, sort of solved the problem (see comments), but the solution is flawed and doesn't actually answer the given question at all.
Question
How can I persuade the Jet.OLEDB provider to not mess with the encoding?
What have I tried
Using foxpro provider, which actually worked fine, except for the little detail that my client's software was unable to read the resulting .dbf file.
Inserting the data without using OleDbParameter (so the input wouldn't get properly escaped) to no avail
Setting a couple of different encodings via CharacterSet = xxx and some other connection string modifications that I don't quite recall right now, every time the output of A0 resulted in FF.
I have found an AutoTranslate property over here, but as far as I can tell it only works for SQL connections as Jet.OLEDB keeps giving me an ISAM error.
I have tried toying around with globalization settings, didn't help much.
Some code
Connection string:
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties="dBase III;"";
Then data gets inserted using OleDbCommand, with the individual cells being filled with OleDbParameter class and constructed insert string. Might be quite useless, but here's the code:
private void insertRows(T[] data, OleDbConnection connection)
{
using (OleDbCommand command = connection.CreateCommand())
{
for (int i = 0; i < data.Count(); i++)
{
constructParams(data[i], i, command);
command.CommandText = constructInsert(i, _fileName);
command.ExecuteNonQuery();
}
}
}
private void constructParams(T data, int index, OleDbCommand command)
{
command.Parameters.Clear();
foreach (PropertyInfo prop in _props)
{
if(_cols.ContainsKey(prop.Name))
{
command.Parameters.Add(new OleDbParameter("@" + prop.Name + index, prop.GetValue(data)));
}
}
}
private string constructInsert(int dataNum, string tableName)
{
string insert = "INSERT INTO [" + tableName + "] (";
foreach(string key in _cols.Keys)
{
insert += "[" + key + "],";
}
insert = insert.Remove(insert.Length - 1);
insert += ") VALUES";
insert += " (";
foreach (string key in _cols.Keys)
{
insert += "@" + key + dataNum + ",";
}
insert = insert.Remove(insert.Length - 1);
insert += ");";
return insert;
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…