【解決方法】テーブルに対するクエリから二重のデータを取得しています。


テーブルに対するクエリから、2 つのデータ (2 つの列) を取得しています。
なぜこれが起こっているのか理解できません。
ありとあらゆる方法を試しましたが変化なし。
元のテーブルには、各行に 1 行のデータしかありません。

C#
	// 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 にバインドするまでは、すべてうまくいきます。

私が試したこと:

ここや他のサイトで提案されているすべての方法を試しましたが、どれも問題を解決しません。

ストアドプロシージャも投稿する必要があると思いました:

SQL
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 インジェクション[^].

少なくとも、ストアド プロシージャでテーブル名を検証する必要があります。

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

理想的には、テーブル名が、データベース内のランダムなテーブルだけでなく、このストアド プロシージャで使用することを意図したテーブルの特定のリストに由来することを検証する必要があります。

コメント

タイトルとURLをコピーしました