视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
CodeSmith操作Access时字段的排序问题
2020-11-09 07:43:39 责编:小采
文档


最近在用CodeSmith操作写ACCESS数据库的代码模版,发现CodeSmith默认的字段顺序与ACCESS中表的字段顺序不一致。 首先在ACCESS数据库中建一个测试表Test,并添加ID、Name等几个字段,如下图所示: 然后在CodeSmith中新建一个模版,并循环输出所有字段名 %@ Cod

最近在用CodeSmith操作写ACCESS数据库的代码模版,发现CodeSmith默认的字段顺序与ACCESS中表的字段顺序不一致。

首先在ACCESS数据库中建一个测试表Test,并添加ID、Name等几个字段,如下图所示:

然后在CodeSmith中新建一个模版,并循环输出所有字段名

 <%@ CodeTemplate Language="C#" TargetLanguage="C#" ResponseEncoding="UTF-8"%>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="数据表" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>

<%for(int i=0;i
<%=SourceTable.Columns[i].Name%>
<%}%>

运行后得到

Age
ID
IsOK
Name
Remark
Time

我们可以看到,字段是按照字典顺序排序的,而不是实际数据表中的顺序。虽然这不影响什么,但是一想到自动生成的MODEL层的字段和数据表的不对应,总感觉不太爽。
我甚至将SourceTable.Columns[i].ExtendedProperties这个扩展属性全部输出,也没有得到什么有用的信息。

后来无意中,我在.NET的 OleDbConnection.GetOleDbSchemaTable中得到了字段的顺序,新建一个winform项目,代码如下

1 string accessConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=123456;Data Source=c:\\db1.mdb;Persist Security Info=True";
2 OleDbConnection connection = new OleDbConnection(accessConnection);
3 connection.Open();
4 DataTable schemaColumns = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new string[] { null, null, "test", null });
5 dataGridView2.DataSource = schemaColumns;
6 connection.Close();

我将GetOleDbSchemaTable获取到信息都绑定到一个DataGridView控件中,这样对里面的数据可以有一个比较直观的了解

终于看到了字段真正顺序!那么接下来的事情就比较好办了,我们要在CodeSmith中获取这个SchemaTable,然后根据ORDINAL_POSITION的值重新对SourceTable.Columns进行排序,这样后面编写代码模版的时候,字段顺序就是正常的了。CodeSmith代码如下:

<%@ CodeTemplate Language="C#" TargetLanguage="C#" ResponseEncoding="UTF-8"%>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="数据表" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Data.OleDb" %>
<%FixColumns();%>

<%for(int i=0;i
<%=SourceTable.Columns[i].Name%>
<%}%>

代码不难理解,我用了类似插入排序的思路,从排序最后的字段开始往前查找(即ORDINAL_POSITION值从最大到最小),查找到了后就插入到SourceTable.Columns集合的最前面。这样到最后的结果就是SourceTable.Columns集合按ORDINAL_POSITION值从小到大排序了。

下载本文
显示全文
专题