我有一個 Visual Basic 應用程式,可以在其中連接到 MS SQL 資料庫。我有定義 SqlDataReader、打開連接并執行 ExecuteReader() 命令的代碼。我使用以下代碼從閱讀器中檢索資料
While myDataReader.Read()
Session("menu_PEO") = myDataReader("menu_PEO")
Session("menu_Transfer") = myDataReader("menu_Transfer")
Session("menu_Loan") = myDataReader("menu_loan")
End While
menu_PEO、menu_Transfer 和 menu_loan 是 SQL 回傳的資料中的 3 個列標題。
我現在的任務是將代碼轉換為 C#。我在 c# 中有以下代碼可以作業:
while (dataReader.Read())
{
dbMenuPEO = dataReader.GetString(1);
dbMenuTransfer = dataReader.GetString(2);
dbMenuLoan = dataReader.GetString(3);
}
由于我的 SQL 是一個 SELECT *,我不能保證回傳資料的順序,所以我不想依賴于指定 GetString 的實體。
c# 中是否有一種方法可以指定我想檢索的列名,類似于它在 Visual Basic 中的作業方式?
謝謝!
uj5u.com熱心網友回復:
我有定義 SqlDataReader、打開連接并執行 ExecuteReader() 的代碼
這難道不是必須撰寫的最令人難以置信的乏味代碼嗎?隨著時間的推移,許多人已經想到了這一點,并且已經發明了許多東西來減輕您的乏味。MarkPflug 的回答直接解決了您的問題,但以防萬一您不知道可以顯著提高生產力,我想向您介紹其中一種技術
c# 中是否有一種方法可以指定我想檢索的列名,類似于它在 Visual Basic 中的作業方式?
這里有一個辦法做到這一點,因為當你這樣做,你不必鍵入它。它避免再次輸入您已經輸入的相同內容(兩次 - 一次是變數名,一次是在 SQL 中)
使用Visual Studio 內置的nuget 包管理器來安裝 Dapper
然后假設您有一個保存資料的類:
//C#
record DbMenu(string DbMenuPEO, string DbMenuTransfer, string DbMenuLoan);
'or VB, if you like that sort of thing
Class DbMenu
Public Property DbMenuPEO as String
Public Property DbMenuTransfer As String
Public Property DbMenuLoan As String
End Class
您可以讓 Dapper 進行查詢、添加任何引數、打開您的連接、下載您的資料、填寫一個包含您的類的串列、關閉連接并回傳它......所有這些都在一行代碼中:
//C#
using var conn = ... //code here that gets a connection; doesn't need to be open
var myListOfDbMenus = conn.Query<DbMenu>("SELECT * FROM ... ");
'VB
Using conn = ...
Dim myListOfDbMenus = conn.Query(Of DbMenu)("SELECT * FROM ... ");
End Using
簡短的版本是:您的 c# 類屬性應該與您的列命名相同。如果不是,則最容易AS xyz在 SQL 中使用來均衡名稱。如果要撰寫引數化查詢,請提供@parameterNames與與查詢同時傳遞的匿名物件的屬性名稱相同的名稱:
var q = conn.Query<Type>("SELECT ... WHERE col = @val1", new {val1 = "hello" } );
如果您喜歡撰寫 SQL 并擁有低級控制/不想使用像 EF 這樣的 ORM,那么 Dapper 可讓您繼續直接執行 SQL,但消除了所有重復的周圍樣板檔案
uj5u.com熱心網友回復:
有兩種方法可以做到這一點。簡單的方法是使用命名索引器:
dbMenuPEO = (string)dataReader["menu_PEO"];
這與以下內容基本相同:
dbMenuPEO = (string)dataReader.GetValue(dataReader.GetOrdinal("menu_PEO"));
您可以將序數查找移到回圈之外,這樣效率更高一些。您還可以使用避免強制轉換的強型別訪問器。這在讀取值型別(int、dateTime 等)時很重要,因為它避免了需要對值進行裝箱,而 GetValue 會發生這種情況。
var menuPeoIdx = dataReader.GetOrdinal("menu_PEO");
while(dataReader.Read())
{
dbMenuPEO = dataReader.GetString(menuPeoIdx);
}
一般來說,你應該永遠不會使用select *在生產系統中。始終明確列出您想要的列。原因是它允許更改基礎表而無需修復消耗代碼或過度選擇不需要的列。Select *是用于“探索”資料集的絕佳工具,但只能用作開發工具。
uj5u.com熱心網友回復:
所述SQLDataReader類公開一組的實體方法,其允許以檢索特定型別,例如一個欄位的值GetInt32()和GetString(),其可以結合的使用GetOrdinal()方法
例子
dataReader.GetString(dataReader.GetOrdinal("YOUR FIELD NAME HERE"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/392602.html
標籤:C# sqldatareader
上一篇:如果CancellationTokenSource延遲,則IsCancellationRequested始終為false
