例如,我正在查看以下 schema.ini:
[test.csv]
ColNameHeader=True
CharacterSet=1252
Format=CSVDelimited
Col1=JET1 Bit
Col2=JET2 Byte
Col3=JET3 Short
Col4=JET4 Integer
Col5=JET5 Currency
Col6=JET6 Single
Col7=JET7 Float
Col8=JET8 Date
Col9=JET9 LongChar Attribute 32
Col10=JET10 LongChar Attribute 32
Col11=ODBC1 Char Width 255
Col12=ODBC2 Float
Col13=ODBC3 Integer
Col14=ODBC4 LongChar Attribute 32
Col15=ODBC5 Date
由以下 C# 生成:
using System;
using System.Data.OleDb;
namespace Sandbox1
{
class Program
{
const string ConnStr =
@"
Provider=Microsoft.ACE.OLEDB.12.0;
Extended Properties=""Text;DATABASE=C:\Test""
";
static void Main(string[] args)
{
using (var conn = new OleDbConnection(ConnStr))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText =
@"
CREATE TABLE [test.csv]
(
JET1 BIT,
JET2 BYTE,
JET3 SHORT,
JET4 LONG,
JET5 CURRENCY,
JET6 SINGLE,
JET7 DOUBLE,
JET8 DATETIME,
JET9 TEXT,
JET10 MEMO,
ODBC1 CHAR,
ODBC2 FLOAT,
ODBC3 INTEGER,
ODBC4 LONGCHAR,
ODBC5 DATE
)
";
cmd.ExecuteNonQuery();
}
//TestPossibleLimit(); // see below (in this SO Q)
}
}
}
我写这篇文章是为了探索以下 MSDN 页面中的描述:
我可以在“文本文件驱动程序编程注意事项”文档中找到的最接近的解释在这里:
LONGCHAR :固定长度或分隔表中 LONGCHAR 列宽度的理论限制为 65500K。文本 ISAM 更有可能提供高达约 32K 的可靠支持。
我的想法是“属性 32”可能表示 LONGCHAR 数据类型的文本文件驱动程序支持的千字节文本数,但我找不到任何进一步的信息来确认这一点。
所以我投入了以下方法来测试这个想法,通过插入比这个限制更短和更长的字符串:
static void TestPossibleLimit()
{
using (var conn = new OleDbConnection(ConnStr))
using (var cmd = conn.CreateCommand())
{
conn.Open();
var possibleLimit = 32 * 1024;
for (var len = possibleLimit - 10;
len <= possibleLimit + 10;
++len)
{
Console.Write("Inserting string of {0} 'x' characters...", len);
cmd.CommandText = string.Format(
"INSERT INTO [test.csv] (ODBC4) VALUES ('{0}')",
new string('x', len));
cmd.ExecuteNonQuery();
Console.WriteLine(" Done!");
}
Console.WriteLine("All done!");
}
}
坏消息(或好消息?)是它运行良好——显示所有输出,没有抛出异常,并且 CSV 反映了插入。
所以,既然这个 Q 的标题可能已经滚出你的视野了:
ACE 文本文件驱动程序数据类型“LongChar Attribute 32”中的“Attribute”是什么意思?
注意:由于我对 ACE 和 Jet 之间的区别并不完全清楚,因此我还使用 Jet 4 提供程序尝试了上述代码,并获得了相同的 schema.ini 和插入行为。