gpt4 book ai didi

c# - 如何使用 .NET 提取 FoxPro 备注字段中的数据?

转载 作者:行者123 更新时间:2023-11-30 15:13:06 25 4
gpt4 key购买 nike

我正在编写一个 C# 程序来将 FoxPro 数据库转换为 XML,除备注字段为空白外,一切正常。我是否缺少转换该位的内容?

我正在使用 C# .Net 3.5 SP1、Visual FoxPro 9 SP 1 OLE DB 驱动程序。连接字符串没问题,因为所有其他数据都已正确提取。

当我将FoxPro数据库转换成SQL Server时,那里的备注字段也是空白的,所以我无法转换两次。

最佳答案

最终不得不自己做一些工作,但也许它可以在将来帮助其他人:

        public static object GetDbaseOrFoxproRawValue(string DBPath, string TableName, string ColumnName, 
string CompareColumnName, string CompareValue, bool CompareColumnIsAutoKey)
{
using (BinaryReader read = new BinaryReader(File.Open(
Path.Combine(DBPath, TableName + ".dbf"), FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
{
// Is it a type of file that I can handle?
if (new byte[] { 0x02, 0x03, 0x30, 0x43, 0x63, 0x83, 0x8b,
0xcb, 0xf5, 0xfb }.Contains(read.ReadByte()))
{
// Skip date.
read.BaseStream.Seek(3, SeekOrigin.Current);

// Read useful datas...
uint RecordCount = read.ReadUInt32();
ushort FirstRecord = read.ReadUInt16();
ushort RecordLength = read.ReadUInt16();
int FieldCount = FirstRecord - 296 / 32;

// Make sure things aren't stupid.
ColumnName = ColumnName.ToLower();
CompareColumnName = CompareColumnName.ToLower();

// Find target column (field)
string temp;
UInt32 CompareFieldOffset = uint.MaxValue, FieldOffset = uint.MaxValue;
byte CompareFieldLength = 0, FieldLength = 0;
char FieldType = ' ';
for (int i = 0; i < FieldCount; i++)
{
read.BaseStream.Seek(32 + (i * 32), SeekOrigin.Begin);
temp = Encoding.ASCII.GetString(read.ReadBytes(11)).Replace("\0", "").ToLower();
if (temp == CompareColumnName)
{
read.ReadChar();
CompareFieldOffset = read.ReadUInt32();
CompareFieldLength = read.ReadByte();
}
if (temp == ColumnName)
{
FieldType = read.ReadChar();
FieldOffset = read.ReadUInt32();
FieldLength = read.ReadByte();
}

if (CompareFieldOffset != uint.MaxValue && FieldOffset != uint.MaxValue)
break;
}

// Make sure we can continue.
if (CompareFieldOffset == uint.MaxValue ||
FieldOffset == uint.MaxValue) return null;

// Iterate through each record to find the one we want.
for (int index = 0; index < RecordCount; index++)
{
read.BaseStream.Seek(FirstRecord + (index * RecordLength) + CompareFieldOffset, SeekOrigin.Begin);
temp = Encoding.Default.GetString(read.ReadBytes(CompareFieldLength)).Replace("\0", "");
if (temp == CompareValue)
{
read.BaseStream.Seek(FirstRecord + (index * RecordLength) + FieldOffset, SeekOrigin.Begin);
switch (FieldType)
{
case 'M':
case 'I': return read.ReadUInt32();
case 'C':
default: return Encoding.Default.GetString(read.ReadBytes(FieldLength)).Replace("\0", "");
}
}
}
}
else
{
return null;
}
}

return null;
}

只需从中获取结果并将其用作备忘录文件的索引(该代码使用 MSDN 文档非常简单)。

关于c# - 如何使用 .NET 提取 FoxPro 备注字段中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/428237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com