首頁 資料庫 mysql教程 CodeSmith操作Access时字段的排序问题

CodeSmith操作Access时字段的排序问题

Jun 07, 2016 pm 03:38 PM
access 欄位 排序 操作 問題

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

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

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

CodeSmith操作Access时字段的排序问题

然后在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操作Access时字段的排序问题

终于看到了字段真正顺序!那么接下来的事情就比较好办了,我们要在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值从小到大排序了。

 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

deepseek怎麼轉換pdf deepseek怎麼轉換pdf Feb 19, 2025 pm 05:24 PM

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

oracle怎麼讀取dbf文件 oracle怎麼讀取dbf文件 May 10, 2024 am 01:27 AM

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

解讀 Botanix:網路資產管理去中心化的 BTC L2(附互動教學) 解讀 Botanix:網路資產管理去中心化的 BTC L2(附互動教學) May 08, 2024 pm 06:40 PM

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

Astar質押原理、收益拆解、空投項目及策略 & 操作保姆級攻略 Astar質押原理、收益拆解、空投項目及策略 & 操作保姆級攻略 Jun 25, 2024 pm 07:09 PM

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

如何在Node.js環境中解決第三方接口返回403的問題? 如何在Node.js環境中解決第三方接口返回403的問題? Mar 31, 2025 pm 11:27 PM

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

如何對 Golang 中的資料庫記錄進行排序? 如何對 Golang 中的資料庫記錄進行排序? Jun 03, 2024 pm 01:30 PM

在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連接共享:為何select方法會影響其他連接? Apr 01, 2025 am 07:45 AM

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

c#多線程的好處有哪些 c#多線程的好處有哪些 Apr 03, 2025 pm 02:51 PM

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

See all articles