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

然后在CodeSmith中新建一个模版,并循环输出所有字段名
<%@ CodeTemplate Language=<span>"</span><span>C#</span><span>"</span> TargetLanguage=<span>"</span><span>C#</span><span>"</span> ResponseEncoding=<span>"</span><span>UTF-8</span><span>"</span>%>
<%@ Property Name=<span>"</span><span>SourceTable</span><span>"</span> Type=<span>"</span><span>SchemaExplorer.TableSchema</span><span>"</span> Category=<span>"</span><span>Context</span><span>"</span> Description=<span>"</span><span>数据表</span><span>"</span> %>
<%@ Assembly Name=<span>"</span><span>SchemaExplorer</span><span>"</span> %>
<%@ Import Namespace=<span>"</span><span>SchemaExplorer</span><span>"</span> %>
<%<span>for</span>(<span>int</span> i=<span>0</span>;i<SourceTable.Columns.Count;i++){%>
<%=SourceTable.Columns[i].Name%>
<%}%>运行后得到
<span>Age ID IsOK Name Remark Time</span>
我们可以看到,字段是按照字典顺序排序的,而不是实际数据表中的顺序。虽然这不影响什么,但是一想到自动生成的MODEL层的字段和数据表的不对应,总感觉不太爽。
我甚至将SourceTable.Columns[i].ExtendedProperties这个扩展属性全部输出,也没有得到什么有用的信息。
后来无意中,我在.NET的 OleDbConnection.GetOleDbSchemaTable中得到了字段的顺序,新建一个winform项目,代码如下
一、源码特点企业费用管理系统,有权限分配,登陆验证,新增角色,发布公告等二、功能介绍1、js的兼容性有个地方不行(比如模块排序,那个时候也是雏鸟一只,写了一小撮,现在用jq应该好处理的吧,ie里面没问题,大家发挥吧)2、里面的菜单和对应菜单下面的目录项可以根据需求自己添加的,有对应模块3、可以根据自己设定的角色添加对应的访问页面4、有些操作涉及到按钮权限,对于这种思路,我粗粗的写了2个自定义控件,
0
<span>1</span> <span>string</span> accessConnection = <span>"</span><span>Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password=123456;Data Source=c:\db1.mdb;Persist Security Info=True</span><span>"</span><span>;
</span><span>2</span> OleDbConnection connection = <span>new</span><span> OleDbConnection(accessConnection);
</span><span>3</span> <span>connection.Open();
</span><span>4</span> DataTable schemaColumns = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, <span>new</span> <span>string</span>[] { <span>null</span>, <span>null</span>, <span>"</span><span>test</span><span>"</span>, <span>null</span><span> });
</span><span>5</span> dataGridView2.DataSource =<span> schemaColumns;
</span><span>6</span> connection.Close();我将GetOleDbSchemaTable获取到信息都绑定到一个DataGridView控件中,这样对里面的数据可以有一个比较直观的了解
终于看到了字段真正顺序!那么接下来的事情就比较好办了,我们要在CodeSmith中获取这个SchemaTable,然后根据ORDINAL_POSITION的值重新对SourceTable.Columns进行排序,这样后面编写代码模版的时候,字段顺序就是正常的了。CodeSmith代码如下:
<%@ CodeTemplate Language=<span>"</span><span>C#</span><span>"</span> TargetLanguage=<span>"</span><span>C#</span><span>"</span> ResponseEncoding=<span>"</span><span>UTF-8</span><span>"</span>%>
<%@ Property Name=<span>"</span><span>SourceTable</span><span>"</span> Type=<span>"</span><span>SchemaExplorer.TableSchema</span><span>"</span> Category=<span>"</span><span>Context</span><span>"</span> Description=<span>"</span><span>数据表</span><span>"</span> %>
<%@ Assembly Name=<span>"</span><span>SchemaExplorer</span><span>"</span> %>
<%@ Import Namespace=<span>"</span><span>SchemaExplorer</span><span>"</span> %>
<%@ Import Namespace=<span>"</span><span>System.Data.OleDb</span><span>"</span> %>
<%FixColumns();%>
<%<span>for</span>(<span>int</span> i=<span>0</span>;i<SourceTable.Columns.Count;i++){%>
<%=SourceTable.Columns[i].Name%>
<%}%>
<script runat=<span>"</span><span>template</span><span>"</span>>
<span>//</span><span>由于SourceTable.Columns的顺序默认是按字段名升序排列,因此需要根据"ORDINAL_POSITION"的值来重新排序</span>
<span>public</span> <span>void</span><span> FixColumns()
{
OleDbConnection connection </span>= <span>new</span><span> OleDbConnection(SourceTable.Database.ConnectionString);
connection.Open();
DataTable schemaColumns </span>= connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, <span>new</span> <span>string</span>[] { <span>null</span>, <span>null</span>, SourceTable.Name, <span>null</span><span> });
connection.Close();
</span><span>for</span>(<span>int</span> i=schemaColumns.Rows.Count;i><span>0</span>;i--<span>)
{
</span><span>for</span>(<span>int</span> j=<span>0</span>;j<schemaColumns.Rows.Count;j++<span>)
{
</span><span>if</span>(Convert.ToInt32(schemaColumns.Rows[j][<span>"</span><span>ORDINAL_POSITION</span><span>"</span>].ToString())==<span>i)
{
</span><span>int</span> m=<span>0</span><span>;
</span><span>for</span>(m=<span>0</span>;m<SourceTable.Columns.Count;m++<span>)
{
</span><span>if</span>(SourceTable.Columns[m].Name==schemaColumns.Rows[j][<span>"</span><span>COLUMN_NAME</span><span>"</span><span>].ToString())
{
</span><span>break</span><span>;
}
}
ColumnSchema col</span>=<span>SourceTable.Columns[m];
SourceTable.Columns.RemoveAt(m);
SourceTable.Columns.Insert(</span><span>0</span><span>,col);
}
}
}
}
</span></script>代码不难理解,我用了类似插入排序的思路,从排序最后的字段开始往前查找(即ORDINAL_POSITION值从最大到最小),查找到了后就插入到SourceTable.Columns集合的最前面。这样到最后的结果就是SourceTable.Columns集合按ORDINAL_POSITION值从小到大排序了。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号