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值从小到大排序了。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

DeepSeek 無法直接將文件轉換為 PDF。根據文件類型,可以使用不同方法:常見文檔(Word、Excel、PowerPoint):使用微軟 Office、LibreOffice 等軟件導出為 PDF。圖片:使用圖片查看器或圖像處理軟件保存為 PDF。網頁:使用瀏覽器“打印成 PDF”功能或專用的網頁轉 PDF 工具。不常見格式:找到合適的轉換器,將其轉換為 PDF。選擇合適的工具並根據實際情況制定方案至關重要。

Oracle 可以透過以下步驟讀取 dbf 檔案:建立外部表,引用 dbf 檔案;查詢外部表,檢索資料;將資料匯入 Oracle 表。

昨日,BotanixLabs宣布累計完成1,150萬美元融資,PolychainCapital、PlaceholderCapital等參投。融資將用於建構去中心化的EVM等效BTCL2Botanix。 Spiderchain結合了EVM的易用性與比特幣的安全性。自2023年11月測試網路上線以來,已有超過20萬個活躍位址。 Odaily將於本文解析Botanix的特色機制與測試網交互流程。 Botanix依照官方定義,Botanix是基於比特幣建構的去中心化的圖靈完備L2EVM,由兩個核心組件以太坊虛

目錄Astar Dapp 質押原理質押收益 拆解潛在空投項目:AlgemNeurolancheHealthreeAstar Degens DAOVeryLongSwap 質押策略 & 操作“AstarDapp質押”今年初已升級至V3版本,對質押收益規則做了不少調整。目前首個質押週期已結束,第二質押週期的「投票」子週期剛開始。若要獲得「額外獎勵」收益,需掌握此關鍵階段(預計持續至6月26日,現餘不到5天)。我將細緻拆解Astar質押收益,

在Node.js環境中解決第三方接口返回403的問題當我們在使用Node.js調用第三方接口時,有時會遇到接口返回403錯誤�...

在Golang中,可以透過使用database/sql套件中的ORDERBY子句對查詢結果進行排序。語法:func(db*DB)Query(querystring,args...interface{})(*Rows,error)排序範例:SELECT*FROMusersORDERBYnameASC其他排序選項:DESC(降序)、多個欄位(逗號分隔)、NULL值排序順序(NULLSFIRST或NULLSLAST)實戰案例:依"order_date"降序排列訂單:SELECT*FRO

Laravel框架中Redis連接的共享與select方法的影響在使用Laravel框架和Redis時,開發者可能會遇到一個問題:通過配置...

多線程的好處在於能提升性能和資源利用率,尤其適用於處理大量數據或執行耗時操作。它允許同時執行多個任務,提高效率。然而,線程過多會導致性能下降,因此需要根據 CPU 核心數和任務特性謹慎選擇線程數。另外,多線程編程涉及死鎖和競態條件等挑戰,需要使用同步機制解決,需要具備紮實的並發編程知識,權衡利弊並謹慎使用。
