CodeSmith操作Access时字段的排序问题
最近在用CodeSmith操作写ACCESS数据库的代码模版,发现CodeSmith默认的字段顺序与ACCESS中表的字段顺序不一致。 首先在ACCESS数据库中建一个测试表Test,并添加ID、Name等几个字段,如下图所示: 然后在CodeSmith中新建一个模版,并循环输出所有字段名 %@ Cod
最近在用CodeSmith操作写ACCESS数据库的代码模版,发现CodeSmith默认的字段顺序与ACCESS中表的字段顺序不一致。
首先在ACCESS数据库中建一个测试表Test,并添加ID、Name等几个字段,如下图所示:
然后在CodeSmith中新建一个模版,并循环输出所有字段名
"<span>C#</span><span>"</span> TargetLanguage=<span>"</span><span>C#</span><span>"</span> ResponseEncoding=<span>"</span><span>UTF-8</span><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> %> "<span>SchemaExplorer</span><span>"</span> %> "<span>SchemaExplorer</span><span>"</span> %> for(<span>int</span> i=<span>0</span>;i<sourcetable.columns.count> </sourcetable.columns.count>
运行后得到
<span>Age ID IsOK Name Remark Time</span>
我们可以看到,字段是按照字典顺序排序的,而不是实际数据表中的顺序。虽然这不影响什么,但是一想到自动生成的MODEL层的字段和数据表的不对应,总感觉不太爽。
我甚至将SourceTable.Columns[i].ExtendedProperties这个扩展属性全部输出,也没有得到什么有用的信息。
后来无意中,我在.NET的 OleDbConnection.GetOleDbSchemaTable中得到了字段的顺序,新建一个winform项目,代码如下
<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代码如下:
"<span>C#</span><span>"</span> TargetLanguage=<span>"</span><span>C#</span><span>"</span> ResponseEncoding=<span>"</span><span>UTF-8</span><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> %> "<span>SchemaExplorer</span><span>"</span> %> "<span>SchemaExplorer</span><span>"</span> %> "<span>System.Data.OleDb</span><span>"</span> %> for(<span>int</span> i=<span>0</span>;i<sourcetable.columns.count> <script runat="<span">"<span>template<span>"> <span>//<span>由于SourceTable.Columns的顺序默认是按字段名升序排列,因此需要根据"ORDINAL_POSITION"的值来重新排序 <span>public <span>void<span> FixColumns() { OleDbConnection connection = <span>new<span> OleDbConnection(SourceTable.Database.ConnectionString); connection.Open(); DataTable schemaColumns = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, <span>new <span>string[] { <span>null, <span>null, SourceTable.Name, <span>null<span> }); connection.Close(); <span>for(<span>int i=schemaColumns.Rows.Count;i><span>0;i--<span>) { <span>for(<span>int j=<span>0;j<schemaColumns.Rows.Count;j++<span>) { <span>if(Convert.ToInt32(schemaColumns.Rows[j][<span>"<span>ORDINAL_POSITION<span>"].ToString())==<span>i) { <span>int m=<span>0<span>; <span>for(m=<span>0;m<SourceTable.Columns.Count;m++<span>) { <span>if(SourceTable.Columns[m].Name==schemaColumns.Rows[j][<span>"<span>COLUMN_NAME<span>"<span>].ToString()) { <span>break<span>; } } ColumnSchema col=<span>SourceTable.Columns[m]; SourceTable.Columns.RemoveAt(m); SourceTable.Columns.Insert(<span>0<span>,col); } } } } </script></sourcetable.columns.count>
代码不难理解,我用了类似插入排序的思路,从排序最后的字段开始往前查找(即ORDINAL_POSITION值从最大到最小),查找到了后就插入到SourceTable.Columns集合的最前面。这样到最后的结果就是SourceTable.Columns集合按ORDINAL_POSITION值从小到大排序了。

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



DeepSeek cannot convert files directly to PDF. Depending on the file type, you can use different methods: Common documents (Word, Excel, PowerPoint): Use Microsoft Office, LibreOffice and other software to export as PDF. Image: Save as PDF using image viewer or image processing software. Web pages: Use the browser's "Print into PDF" function or the dedicated web page to PDF tool. Uncommon formats: Find the right converter and convert it to PDF. It is crucial to choose the right tools and develop a plan based on the actual situation.

Oracle can read dbf files through the following steps: create an external table and reference the dbf file; query the external table to retrieve data; import the data into the Oracle table.

Table of Contents Astar Dapp Staking Principle Staking Revenue Dismantling of Potential Airdrop Projects: AlgemNeurolancheHealthreeAstar Degens DAOVeryLongSwap Staking Strategy & Operation "AstarDapp Staking" has been upgraded to the V3 version at the beginning of this year, and many adjustments have been made to the staking revenue rules. At present, the first staking cycle has ended, and the "voting" sub-cycle of the second staking cycle has just begun. To obtain the "extra reward" benefits, you need to grasp this critical stage (expected to last until June 26, with less than 5 days remaining). I will break down the Astar staking income in detail,

In Golang, query results can be sorted by using the ORDERBY clause in the database/sql package. Syntax: func(db*DB)Query(querystring,args...interface{})(*Rows,error) Sorting example: SELECT*FROMusersORDERBYnameASC Other sorting options: DESC (descending), multiple columns (comma separated), NULL Value sort order (NULLSFIRST or NULLSLAST) Practical case: Sorting orders in descending order by "order_date": SELECT*FRO

Solve the problem of third-party interface returning 403 in Node.js environment. When we use Node.js to call third-party interfaces, we sometimes encounter an error of 403 from the interface returning 403...

The impact of sharing of Redis connections in Laravel framework and select methods When using Laravel framework and Redis, developers may encounter a problem: through configuration...

The advantage of multithreading is that it can improve performance and resource utilization, especially for processing large amounts of data or performing time-consuming operations. It allows multiple tasks to be performed simultaneously, improving efficiency. However, too many threads can lead to performance degradation, so you need to carefully select the number of threads based on the number of CPU cores and task characteristics. In addition, multi-threaded programming involves challenges such as deadlock and race conditions, which need to be solved using synchronization mechanisms, and requires solid knowledge of concurrent programming, weighing the pros and cons and using them with caution.

How to avoid the third-party interface returning 403 error in the Node environment. When calling the third-party website interface using Node.js, you sometimes encounter the problem of returning 403 error. �...
