【发布时间】:2014-09-29 22:56:29
【问题描述】:
我的目标
我需要以客户指定的特定格式创建 .dbf 文件。格式为 dBase III .dbf,kamenicky 编码,使用整数、各种长度的字符和双列类型。
问题
我几乎让所有东西都正常工作,只有一个障碍:该死的编码拒绝工作,尽管编写了一个特定的转换表,它将原始字符与那些与 kamenicky 编码兼容的字符进行切换。这意味着输出文件以例如 FF 的十六进制值结束,该字符在导入的字符串中被指定为 A0 的十六进制值。
如果您要回答 (-1) 问题,我将非常感谢您提供有关您为什么在 cmets 中这样做的信息 - 即使是“您对问题的理解不够充分”也会有很大帮助,因为我会知道在哪里继续我的研究(例如,在这种情况下非常基础)
我已经解决了这个问题(见 cmets),但解决方案有缺陷,实际上根本没有回答给定的问题。
问题
如何说服 Jet.OLEDB 提供者不要乱用编码?
我尝试了什么
使用 foxpro 提供程序,实际上工作正常,除了我的客户端软件无法读取生成的 .dbf 文件的小细节。
在不使用 OleDbParameter 的情况下插入数据(因此输入无法正确转义)无济于事
每次 A0 的输出导致 FF 时,通过 CharacterSet = xxx 和其他一些我现在不太记得的连接字符串修改设置几个不同的编码。
我找到了一个 AutoTranslate 属性 over here,但据我所知,它仅适用于 SQL 连接,因为 Jet.OLEDB 不断给我一个 ISAM 错误。
我曾尝试玩弄globalization settings,但没有多大帮助。
一些代码
连接字符串:
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=\"dBase III;\"";
然后使用 OleDbCommand 插入数据,使用 OleDbParameter 类和构造的插入字符串填充各个单元格。可能没什么用,但这里是代码:
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;
}
【问题讨论】:
-
我已经解决了这个问题,尽管这个解决方案远非完美。 Jet.OLEDB 使用的任何编码似乎(至少对于重要的字符)都是 8 位字符集,kamenicky 编码也是如此。因此,在 OLEDB 提供程序完成文件写入后,我以字节表示形式再次打开它并手动替换字符,以便它们遵守 kamenicky 编码。当然,这不是对原始问题的回答——只是我出于绝望而不得不求助的一个解决方案。