検索
ホームページバックエンド開発C#.Net チュートリアル.Net core上でSQL文を直接実行してDataTableを生成する実装方法

.net core は SQL ステートメントを実行できますが、生成できるのは厳密に型指定された戻り結果のみです。たとえば、var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs").ToList() のようになります。 DataSet や DataTable などの弱い型を返すことはできません。この理由により DataTable が .net core に実装されていない可能性がありますが、DataTable は引き続き使用される可能性があります。ここには、ユーザーが自分で SQL のようなステートメントを記述し、それを実行してテーブルに表示できるようにするデータ ウェアハウス要件があります。ステートメントは常に変化するため、ユーザーのステートメントが何を出力するかはわかりません。また、ステートメントを型で定義することもできないため、DataTable メソッドのみを使用できます。

以前は、.net Framework では、dataadapter を通じてデータテーブルに簡単にデータを入力でき、その後、データテーブルのデータをクライアントにプッシュして表示することができました。ただし、.net core では DataTable や DataSet が存在せず、MicroDataTable を自分で実装するしかありません。

ここでも DataTable メソッドに従います。MicroDataTable の列は MicroDataColumn として定義され、行は MicroDataRow として定義されます。コードは次のとおりです。

public class MicroDataTable
{ /// <summary>
/// 整个查询语句结果的总条数,而非本DataTable的条数
/// </summary>
public int TotalCount { get; set; }
public List<MicroDataColumn> Columns { get; set; } = new List<MicroDataColumn>();
public List<MicroDataRow> Rows { get; set; } = new List<MicroDataRow>();
public MicroDataColumn[] PrimaryKey { get; set; }
public MicroDataRow NewRow()
{
return new MicroDataRow(this.Columns, new object[Columns.Count]);
}
}
public class MicroDataColumn
{
public string ColumnName { get; set; }
public Type ColumnType { get; set; }
}
public class MicroDataRow
{
private object[] _ItemArray;
public List<MicroDataColumn> Columns { get; private set; }
public MicroDataRow(List<MicroDataColumn> columns, object[] itemArray)
{
this.Columns = columns;
this._ItemArray = itemArray;
}
public object this[int index]
{
get { return _ItemArray[index]; }
set { _ItemArray[index] = value; }
}
public object this[string columnName]
{
get
{
int i = 0;
foreach (MicroDataColumn column in Columns)
{
if (column.ColumnName == columnName)
break;
i++;
}
return _ItemArray[i];
}
set
{
int i = 0;
foreach (MicroDataColumn column in Columns)
{
if (column.ColumnName == columnName)
break;
i++;
}
_ItemArray[i] = value;
}
}
}

ページングの場合、TotalCount 属性はクエリ ステートメントによってデータベース内でクエリされたすべてのレコードの数を参照するのに対し、MicroDataTable のデータはそのレコードのレコードであることに注意してください。現在のページ。

データベースから DataTable を取得するには、SqlHelper と同様のメソッドを使用して DbContext の ExecuteDataTable 拡張メソッドを記述し、SQL ステートメントと SQL ステートメントのパラメーターを渡して、MicroDataTable を生成します。 .net Framework のコア スキル はい、このプロセスでは、SQL とパラメーターに基づいてネイティブ SQLCommand を作成し、ExecuteReader メソッドを実行して DataReader を返し、DataReader を MicroDataTable に書き込みます。 .net core の IConcurrencyDetector の説明は次のとおりです。この API は Entity Framework Core インフラストラクチャをサポートしており、コードから直接使用することを目的としていません。この API は将来のリリースで変更または削除される可能性があります。最初にこの方法で実装し、後で ef.core を変更できるか、より良い方法が提供できるかを確認することしかできません。

上記のプログラムでは、最後に MicroDataTableHelper.FillDataTable という文があります。このメソッドの主な機能は、DataReader から MicroDataTable にデータを入力することです。

public static MicroDataTable ExecuteDataTable(this DbContext context, string sql, params object[] parameters)
{
var concurrencyDetector = context.Database.GetService<IConcurrencyDetector>();
using (concurrencyDetector.EnterCriticalSection())
{
var rawSqlCommand = context.Database.GetService<IRawSqlCommandBuilder>().Build(sql, parameters);
RelationalDataReader query = rawSqlCommand.RelationalCommand.ExecuteReader(context.Database.GetService<IRelationalConnection>(), parameterValues: rawSqlCommand.ParameterValues);
return MicroDataTableHelper.FillDataTable(query.DbDataReader, 0, int.MaxValue);
}
}
public static MicroDataTable ExecuteDataTable(this DbContext context, string sql, int pageIndex, int pageSize, params object[] parameters)
{
var concurrencyDetector = context.Database.GetService<IConcurrencyDetector>();
using (concurrencyDetector.EnterCriticalSection())
{
var rawSqlCommand = context.Database.GetService<IRawSqlCommandBuilder>().Build(sql, parameters);
RelationalDataReader query = rawSqlCommand.RelationalCommand.ExecuteReader(context.Database.GetService<IRelationalConnection>(), parameterValues: rawSqlCommand.ParameterValues);
return MicroDataTableHelper.FillDataTable(query.DbDataReader, 0, int.MaxValue);
}
}

上記のプログラムは段階的に書かれているため、あまり効率的ではありません。最近時間がなく、元の Datatable の読み込みメソッドを分析していません。将来的には最適化する時間があります。

以下は、.net Framework を使用してデータリーダーからデータテーブルへのページング データを取得するプログラムです (参考のみ)。当時、このプログラムは table.beginloaddata/endloaddata メソッドを使用しており、効率が大幅に向上しました。

public static MicroDataTable FillDataTable(DbDataReader reader, int pageIndex, int pageSize)
{
bool defined = false;
MicroDataTable table = new MicroDataTable();
int index = 0;
int beginIndex = pageSize * pageIndex;
int endIndex = pageSize * (pageIndex + 1) - 1;
while (reader.Read())
{
object[] values = new object[reader.FieldCount];
if (!defined)
{
for (int i = 0; i < reader.FieldCount; i++)
{
MicroDataColumn column = new MicroDataColumn()
{
ColumnName = reader.GetName(i),
ColumnType = reader.GetFieldType(i)
};
table.Columns.Add(column);
}
defined = true;
}
if (index >= beginIndex && index <= endIndex)
{
reader.GetValues(values);
table.Rows.Add(new MicroDataRow(table.Columns, values));
}
index++;
}
table.TotalCount = index;
return table;
}

上記は、.Net コアで SQL ステートメントを直接実行して DataTable を生成する方法をエディターが紹介したものです。皆さんのお役に立てれば幸いです。また、PHP 中国語 Web サイトをサポートしていただきありがとうございます。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
C言語のnullの代替案は何ですかC言語のnullの代替案は何ですかMar 03, 2025 pm 05:37 PM

この記事では、CのNull Poernter recerferenceの課題を調査します。問題は、問題はnullではなく、その誤用であると主張しています。 記事では、参照前のチェック、ポインターInitialiなど、非参照を防止するためのベストプラクティスの詳細

次のレベルのCコンパイラを追加する方法次のレベルのCコンパイラを追加する方法Mar 03, 2025 pm 05:44 PM

この記事では、printf内の\ nエスケープシーケンスを使用してcで新しいライン文字を作成し、関数を置く方法について説明します。 機能を詳しく説明し、出力のラインブレークに使用することを示すコード例を提供します。

どの言語コンパイラが優れていますか?どの言語コンパイラが優れていますか?Mar 03, 2025 pm 05:39 PM

この記事は、Cコンパイラの選択に関する初心者を案内しています。 GCCは、使いやすさ、幅広い可用性、広範なリソースが初心者に最適であるため、最適であると主張しています。 ただし、GCC、Clang、MSVC、およびTCCも比較して、その違いを強調しています

nullは、C言語での最新のプログラミングではまだ重要ですか?nullは、C言語での最新のプログラミングではまだ重要ですか?Mar 03, 2025 pm 05:35 PM

この記事では、現代のCプログラミングにおけるNullの継続的な重要性を強調しています。 進歩にもかかわらず、Nullは明示的なポインター管理にとって重要なままであり、有効なメモリアドレスがないことをマークすることにより、セグメンテーションの障害を防ぎます。 最高のPRAC

C言語コンパイラのWebバージョンは何ですか?C言語コンパイラのWebバージョンは何ですか?Mar 03, 2025 pm 05:42 PM

この記事では、初心者向けのオンラインCコンパイラをレビューし、使いやすさとデバッグ機能に焦点を当てています。 OnlineGDBとRepl.itは、ユーザーフレンドリーなインターフェイスと役立つデバッグツールのために強調表示されます。 プログラムやコンパイルなどのその他のオプション

c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約Mar 03, 2025 pm 05:41 PM

この記事では、オンラインCプログラミングプラットフォームを比較し、デバッグツール、IDE機能、標準コンプライアンス、メモリ/実行の制限などの機能の違いを強調しています。 「最良の」プラットフォームはユーザーのニーズに依存していると主張しています。

C言語コンパイラによるコードをコピーする方法C言語コンパイラによるコードをコピーする方法Mar 03, 2025 pm 05:43 PM

この記事では、C IDEでの効率的なコードコピーについて説明します。 コピーはコンパイラ機能ではなくIDE機能であり、IDE選択ツールの使用、コード折りたたみ、検索/交換、テンプラなど、効率を向上させるための詳細戦略であることを強調しています。

C言語コンパイラによって出力ウィンドウをポップアップしないという問題を解決する方法C言語コンパイラによって出力ウィンドウをポップアップしないという問題を解決する方法Mar 03, 2025 pm 05:40 PM

この記事では、Cプログラムのコンパイルでの出力Windowsの欠落をトラブルシューティングします。 実行可能ファイルの実行に失敗し、プログラムエラー、誤ったコンパイラ設定、バックグラウンドプロセス、迅速なプログラム終了などの原因を調べます。ソリューションにはchが含まれます

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。