C#和SQL Server查詢在大表上返回空列

.net .net-core c# dapper sql-server

我在一個有大約600列的表上運行以下查詢:

SELECT * 
FROM Table 
WHERE [Owner] = 1234

我使用EF代碼優先和Dapper運行此查詢,我遇到了同樣的問題。

那些有返回的值,特別是許多行DBNull從查詢(我使用驗證SQL Server Management Studio中的列有數據)。奇怪的是,它只發生在請求所有列時(無論是使用*還是顯式拉動它們)。

例如,如果列Status具有值"A" ,則查詢將DBNull作為其值返回。但如果不是上面的代碼(拉動600列),我使用此查詢:

SELECT [Status] 
FROM Table 
WHERE [Owner] = 1234

Status列已正確填充。

這是我用來處理結果的Dapper代碼:

public IList<Dictionary<string, string>> GetData() {
    var sql = "SELECT * FROM Table WHERE [Owner] = 1234";
    var cn = new SqlConnection(serverConnectionString);
    var rows = new List<Dictionary<string, string>>();

    using (var reader = cn.ExecuteReader(sql))
    {
        while (reader.Read())
        {
            var dict = new Dictionary<string, string>();

            for (var i = 0; i < reader.FieldCount; i++)
            {
                var propName = reader.GetName(i).ToLowerInvariant();

                // This is set to DBNull for most, but not all,
                // columns if querying the ~600 columns in the Table
                var propValue = reader.GetValue(i); 

                dict[propName] = propValue?.ToString();
            }

            rows.Add(dict);
        }
    }

    return rows;
}

我無法做出這種行為的頭或尾。任何幫助將不勝感激。

熱門答案

嘗試使用Dapper的.Query()擴展來返回動態對象列表。以下是一個快速測試:

[Test]
public void Test_Large_Number_of_Columns()
{
    const int n = 600;
    var cols = "";

    for (var i = 0; i < n; i++)
    {
        cols += "col" + i + " varchar(50) null,";
    }

    var create = String.Format("IF OBJECT_ID('dbo.foo', 'U') IS NOT NULL DROP TABLE dbo.foo; create table foo({0})", cols);

    using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo"))
    {
        conn.Execute(create);

        conn.Execute("insert into foo(col300) values('hello') ");

        var result = conn.Query("select * from foo").AsList();

        Assert.That(result[0].col300, Is.EqualTo("hello"));

    }
} 


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因