OLEDB自定义编码 [英] OLEDB custom encoding

查看:94
本文介绍了OLEDB自定义编码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标



我需要以客户指定的特定格式创建一个.dbf文件。格式为dBase III .dbf,具有kamenicky编码,使用整数,各种长度的字符和双列类型。



问题



我已经做了一切工作,只有一个障碍:darn编码拒绝工作,尽管有一个特定的转换表,将原始字符与那些兼容的kamenicky编码。这意味着输出文件的结尾是,例如,在导入的字符串中指定为十进制值为A0的char的HEX值为。



如果您(-1)这个问题,我非常感谢您为什么在评论中这样做的信息 - 即使是你不充分理解这个问题也是非常有帮助的,因为我知道在哪里继续我的研究(如在这种情况下非常基础的)



我有一种解决问题的方法(见评论),但解决方案是有缺陷的,没有



问题



如何我说服Jet.OLEDB提供商不要混淆编码?



我尝试了什么




  • 使用foxpro提供程序,其实际工作正常,除了我的客户端软件无法读取生成的.dbf文件的细节之外。


  • 插入数据而不使用OleDbParameter(因此输入将无法正确转义)无效


  • 通过CharacterSet = xxx设置几个不同的编码和一些其他的连接字符串修改,我现在不记得,每当A0的输出导致FF。


  • 我已经找到一个AutoTranslate属性在这里,但据我所知它只适用于SQL连接,因为Jet.OLEDB不断给我一个ISAM错误。


  • 我已经尝试用全球化设置,帮助很大。




一些代码



连接字符串:

 Provider = Microsoft.Jet.OLEDB.4.0;数据源= {0};扩展属性= \dBase III; \; 

然后使用OleDbCommand插入数据,单个单元格填充有OleDbParameter类并构造了插入字符串,可能没用,但是代码如下:

 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.Parameters.Clear();
foreach(_props中的PropertyInfo prop)
{
if(_cols.ContainsKey(prop.Name))
{
com mand.Parameters.Add(new OleDbParameter(@+ prop.Name + index,prop.GetValue(data)));
}
}
}

私有字符串constructInsert(int dataNum,string tableName)
{
string insert =INSERT INTO [ + tableName +](;
foreach(_keys.Keys中的字符串键)
{
insert + =[+ key +],;
}
insert = insert.Remove(insert.Length - 1);
insert + =)VALUES;

insert + =(;
foreach(_keys.Keys中的字符串键)
{
insert + =@+ key + dataNum +, ;
}

insert = insert.Remove(insert.Length - 1);
insert + =);;

return insert;
}


解决方案

尝试,似乎正在使用特殊的Unicode字符和正确识别代码页895,因为你正在努力工作。这确实使用了Microsoft的VFP OleDb提供程序。但是,我有4个部分。


  1. 创建具有显式代码页引用的表,通常会导致VFP可读格式。 p>


  2. 为了保持您在dBASE中需要的向后兼容性,请使用COPY TO命令将VFP版本表头转换为较早(应该)dBASE识别格式


  3. 简单插入表格的dBASE版本(也是代码页895)


  4. 检索所有记录并查看Unicode结果。





  //连接到数据路径,但显式地引用连接字符串中的codepage 895 
string connectionString = @Provider = VFPOLEDB.1; Data Source = c:\\YourDataPath\\SomeSubFolder ; CODEPAGE = 895;;
string ans =;

using(OleDbConnection connection = new OleDbConnection(connectionString))
{
//创建一个代码页895的免费表(不是数据库的一部分)的表语法。
string cmd =create table MyTest1 free codepage = 895(oneColumn c(10));
OleDbCommand命令= new OleDbCommand(cmd,connection);

connection.Open();
command.ExecuteNonQuery();

//现在,创建一个脚本来使用MyTest1表并创建MyTest2,其中
//应该以dBASE格式被识别。
string vfpScript = @使用MyTest1
复制到MyTest2类型foxplus;


command.CommandType = CommandType.StoredProcedure;
command.CommandText =ExecScript;
command.Parameters.Add(myScript,OleDbType.Char).Value = vfpScript;
command.ExecuteNonQuery();

//简单插入表的第二个实例
command = new OleDbCommand(insert into Mytest2(oneColumn)values(?),connection);
command.Parameters.AddWithValue(parmForColumn,çšjír_Þ‰);
command.ExecuteNonQuery();

//现在,获取数据。
command = new OleDbCommand(select * from Mytest2,connection);
OleDbDataAdapter da = new OleDbDataAdapter(command);
DataTable oTbl = new DataTable();
da.Fill(oTbl);

if(oTbl.Rows.Count!= 0)
//我们应该有一行,所以从列
//获取字符串,它应该像Unicode样本我插入上面。
ans =(string)oTbl.Rows [0] [oneColumn];
}


显然,你有代码循环遍历列,并设置适用的参数,所以我留下你。


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;
}

解决方案

Here is a quick something I tried and appears to be working with special Unicode characters and proper recognition of codepage 895 as you are trying to work with. This does use the VFP OleDb provider from Microsoft. However, I have as 4 parts.

  1. Create the table with explicit codepage reference which typically results in VFP readable format.

  2. To retain backward compatibility as you mentioned you needed in dBASE, use the COPY TO command to convert the VFP version table header to the older (and should be) dBASE recognized format

  3. Simple insert into the dBASE version of the table (also codepage 895)

  4. Retrieve all records and look at the Unicode results.

// Connection to your data path, but explicitly referencing codepage 895 in connection string
string connectionString = @"Provider=VFPOLEDB.1;Data Source=c:\\YourDataPath\\SomeSubFolder;CODEPAGE=895;";
string ans = "";

using (OleDbConnection connection = new OleDbConnection(connectionString))
{
   // create table syntax for a free table (not part of a database) that is codepage 895.
   string cmd = "create table MyTest1 free codepage=895 ( oneColumn c(10) )";
   OleDbCommand command = new OleDbCommand(cmd, connection);

   connection.Open();
   command.ExecuteNonQuery();

   // Now, create a script to use the MyTest1 table and create MyTest2 which 
   // SHOULD BE recognized in dBASE format.
   string vfpScript = @"use MyTest1
            Copy to MyTest2 type foxplus";


   command.CommandType = CommandType.StoredProcedure;
   command.CommandText = "ExecScript";
   command.Parameters.Add("myScript", OleDbType.Char).Value = vfpScript;
   command.ExecuteNonQuery();

   // Simple insert into the 2nd instance of the table    
   command = new OleDbCommand("insert into Mytest2 ( oneColumn ) values ( ? )", connection);
   command.Parameters.AddWithValue("parmForColumn", "çšjír_Þ‰");
   command.ExecuteNonQuery();

   // Now, get the data back.
   command = new OleDbCommand("select * from Mytest2", connection);
   OleDbDataAdapter da = new OleDbDataAdapter(command);
   DataTable oTbl = new DataTable();
   da.Fill(oTbl);

   if (oTbl.Rows.Count != 0)
      // we should have one row, so get the string from the column
      // and it SHOULD loo like the Unicode sample I inserted above.
      ans = (string)oTbl.Rows[0]["oneColumn"];
}

Obviously you have code to cycle through all columns and set applicable parameters, so I leave that up to you.

这篇关于OLEDB自定义编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆