我想知道 c# 中 ms access 数据库表列的确切数据类型(dbtype)

Posted

技术标签:

【中文标题】我想知道 c# 中 ms access 数据库表列的确切数据类型(dbtype)【英文标题】:I Want to know the exact datatype(dbtype) of the ms access database table column in c# 【发布时间】:2012-03-05 06:05:57 【问题描述】:

需要知道使用c#的数据库和包含表的确切信息。 数据库是 MS access。我想获取其中表的完整信息,例如主键、最大长度、ms access 数据库中表中列的不为空等。 那么最好的方法是什么....

感谢任何帮助。

另一个问题是 getschema 以数字方式为我提供数据类型,例如 130,131.. 那么我如何在创建表查询中使用它们,它们会给出错误

让我解释一下我要做什么。我想重新创建我没有任何信息的数据库。我不知道它的大小、表格、数据或任何东西。 实际上我已经在一定程度上取得了成功。我所做的是我得到了数据库名称并使用 CatalogClass 和 getschema(tables) 创建它我得到所有表名并使用从 C# 创建表来创建它们。然后使用更改表的列名.现在我必须给它提供数据库中的约束。 所以,除了我用过的这个方法还有什么我遗漏的。任何简单或更好的方法可以做到这一点。所以,它可以更快

问题仍未解决

【问题讨论】:

我相信您可以使用 DAO 和 c#,so here is a post 使用 VBA 创建架构,这可能会有所帮助。 感谢帮助 remou...但我对这一切都是新手,特别从未学过 VBA。目前正在使用 C#。我正在使用 ado 动态创建数据库、表和列。一切正常,但我只需要向我正在重新创建的列添加约束、键、精确数据类型。并且我必须从其他数据库中获取这些信息.. 所以我想有没有其他简单的方法来获取信息和实施。当 getschema 给我列的数据类型时,它们是数字形式,如 130,5,131.so 有没有一种方法可以给我数字,字符串,日期时间... 您必须建立自己的文本列表。您可以使用 ADODB.DataTypeEnum 查看值或this 或从this page 下载 ADOVBS.inc,它包含 ADO 数据类型列表。 今天我只是检查getschema返回的数据类型。我发现它为备忘录和文本都给出了130。因为我的数据类型不匹配。所以任何其他方法从数据库中获取数据类型.so 我可以比较这些数值。 【参考方案1】:

我相信所有内容都记录在下面的链接中,尝试通过调试逐步运行它,然后您可以检查元素并显示您想要的每个值。

http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx

主键: DataTable.PrimaryKey 最大长度,什么?记录? DataTable.Rows.Count 列? DataTable.Columns.Rows

【讨论】:

那是关于数据表的。我有一个 ms 访问数据库。想在其他位置重新创建它。使用完全相同的约束、键和数据。所以我需要数据库的所有信息,以便我可以使用所有键和约束动态创建它.. 好的,所以如果我理解正确,你需要知道每列的数据类型(例如),你可以从 DataTable.Columns 中获取它 - 那是表的列的集合,并且然后您可以从 DataColumn.DataType 获取每一行的信息。希望对你有帮助 谢谢,但它为我提供了 system.int32 等系统类型。 但我想要在 ms access 中使用的文本、数字、日期时间数据类型。所以我可以在更改表或创建表查询中动态使用它们.. 我已经解释了这个问题,请检查一下。【参考方案2】:

您似乎正在使用模式来返回字段类型。我一直在测试,这些行中的某些内容似乎可以返回您想要的内容。

ADODB.Connection cn = new ADODB.Connection();
ADODB.Recordset rs = new ADODB.Recordset();
string cnStr;

cnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Z:\\Docs\\Test.accdb";
string ssql = "Select * From Table1 where 1=2";

cn.Open(cnStr, null, null, 0);

rs.Open(ssql, cn, ADODB.CursorTypeEnum.adOpenKeyset, 
    ADODB.LockTypeEnum.adLockOptimistic, -1);

foreach (ADODB.Field fld in rs.Fields)

    Console.WriteLine(fld.Type);

Console.Read();

rs.Close();
cn.Close();

对于各种类型,这会返回:

adInteger
adVarWChar = Text
adDate
adInteger
adLongVarWChar = Memo
adVarWChar
adDate
adBoolean

【讨论】:

我会试试这个代码。但是,我已经解释了这个问题。请看一下。 vishal,到目前为止,重新创建 Access 数据库的最佳方法是复制它。访问是基于文件的。之后使用 DAO,或 DAO 和 ADO 的混合物。将返回正确的字段类型,您可以检查超链接字段、字段格式、查找表、字段复选框和许多其他您不会找到的其他内容。正如我之前所说,您可以将 DAO 与 C# 一起使用。 Access 不只是一个数据库,事实上,它根本就不是一个数据库,它是一个 RAD 工具,经常但并不总是使用 Jet/ACE 数据库。 访问在其他地方的客户端,而我在服务器端,所以我认为复制不是一种方式。上传需要太多时间,因为数据太多。 @vishal "Data it too much" 访问文件最大限制为 2GB,如果上游速度很慢,您能不能不安排一次性通宵上传? @MattDonnan 这不仅仅是一次。我正在处理一个应用程序。它的任务就像同步。当用户单击同步时,他的数据库中的数据将同步到服务器。所以首先创建新文件(DB)的时间,下一次只有更新的数据。

以上是关于我想知道 c# 中 ms access 数据库表列的确切数据类型(dbtype)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中更新或刷新与 Ms-access 连接的数据网格视图

C# Ms-access 从数据库中获取详细信息

C# 和 MS Access 之间的数据类型不匹配?

如何从 C# 调用 MS Access 数据库宏

如何使用c#从两个以上的MS Access数据库表中检索数据

将大数据表复制到 MS Access 表 C#