[ad_1]
テーブルに対するクエリから、2 つのデータ (2 つの列) を取得しています。
なぜこれが起こっているのか理解できません。
ありとあらゆる方法を試しましたが変化なし。
元のテーブルには、各行に 1 行のデータしかありません。
// Now let's try to get the data DataTable dt = new DataTable(); BindingSource SBind = new BindingSource(); List<object> rows = new List<object>(); rows = (List<object>)Get_All_Items_For_A_Table(SelectedTableName); SBind.DataSource = rows; dataGridView1.DataSource = SBind; // Why the hell am I getting double data in each row of the DataGridView? The data row is too long to post here. public static object Get_All_Items_For_A_Table(string tableName) { object output = null; string dBaseName = ConfigurationManager.AppSettings.Get("dBaseName"); using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(ConnectionStringHelper.CnnVal(dBaseName))) { output = connection.Query<object>("dbo.Select_All_From_Table_By_Table_Name", new { Table_Name = tableName }, commandType: CommandType.StoredProcedure); return output; } }
いつものように、datagridview の各行に対して 1 つの行を取得することを期待していました。
このクエリと正常に動作する他のクエリとの唯一の違いは、特定のデータ モデルを使用してサーバーからデータを収集することです。
今回は、ジェネリック モデル (オブジェクト) を使用し、テーブル名に変数を使用してクエリを実行したいと考えました。
Datagridview にバインドするまでは、すべてうまくいきます。
私が試したこと:
ここや他のサイトで提案されているすべての方法を試しましたが、どれも問題を解決しません。
ストアドプロシージャも投稿する必要があると思いました:
CREATE PROCEDURE [dbo].[Select_All_From_Table_By_Table_Name] @Table_Name nvarchar (128) AS BEGIN SET NOCOUNT ON; SET @table_Name = @Table_Name DECLARE @sql NVARCHAR(100) = 'SELECT * FROM ' + @table_name; EXECUTE (@sql); END GO
更新: ストアド プロシージャをテストしたところ、期待どおりの結果が得られました。 TableName の値を確認しましたが、期待どおりです。
これを解決する試みをしばらく中止し、各テーブルのデータ モデルを使用して複数のクエリを開発する必要があると思います。
歓声と応答に感謝します。
解決策 2
正確に何が起こっているのかはわかりませんが、最も可能性の高い問題は tableName
あなたが思っていることが含まれていないので、そこから始めてください。
デバッガーを使用して、渡した内容を正確に調べ、メソッドを 1 ステップ実行して、クエリが返す内容を正確に確認します。
申し訳ありませんが、私たちはあなたのためにそれを行うことはできません!
解決策 3
これは非常に危険なストアド プロシージャです。 もしあなたの tableName
パラメータがエンドユーザーによって何らかの方法で影響を受ける可能性がある場合、コードは脆弱になります SQL インジェクション[^].
少なくとも、ストアド プロシージャでテーブル名を検証する必要があります。
CREATE PROCEDURE [dbo].[Select_All_From_Table_By_Table_Name] @Table_Name nvarchar (128) AS BEGIN SET NOCOUNT ON; DECLARE @RealTableName sysname, @SchemaName sysname; SELECT @RealTableName = name, @SchemaName = SCHEMA_NAME(schema_id) FROM sys.tables WHERE name = @Table_Name; DECLARE @sql nvarchar(max) = N'SELECT * FROM ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@RealTableName); EXECUTE (@sql); END GO
理想的には、テーブル名が、データベース内のランダムなテーブルだけでなく、このストアド プロシージャで使用することを意図したテーブルの特定のリストに由来することを検証する必要があります。
[ad_2]
コメント