gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:39:32 25 4
gpt4 key购买 nike

我在一个大约有 600 列的表上运行以下查询:

SELECT * 
FROM Table
WHERE [Owner] = 1234

我正在使用 EF code-first 和 Dapper 运行此查询,我遇到了同样的问题。

特别是许多 DO 具有值的行从查询中返回为 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"));

}
}

关于C# 和 SQL Server 查询在大表上返回空列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45250737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com