Ich führe die folgende Abfrage für eine Tabelle mit ungefähr 600 Spalten aus:
SELECT *
FROM Table
WHERE [Owner] = 1234
Ich führe diese Abfrage mit EF-Code-zuerst und Dapper und ich habe das gleiche Problem mit beiden.
Insbesondere viele Zeilen , die einen Wert DO haben , werden als zurück DBNull
aus der Abfrage ( überprüfte ich SQL Server Management Studio , dass die Spalten - Daten). Seltsamerweise passiert es nur, wenn Sie alle Spalten anfragen (ob Sie *
oder explizit ziehen).
Wenn beispielsweise die Spalte Status
den Wert "A"
, gibt die Abfrage DBNull
als Wert zurück. Aber wenn ich anstelle des obigen Codes (der die 600 Spalten zieht) benutze ich diese Abfrage:
SELECT [Status]
FROM Table
WHERE [Owner] = 1234
Die Spalte Status
ist korrekt ausgefüllt.
Hier ist der Dapper-Code, den ich verwende, um die Ergebnisse zu verarbeiten:
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;
}
Ich kann dieses Verhalten nicht nachvollziehen. Jede Hilfe würde sehr geschätzt werden.
Probieren Sie Dappers Erweiterung .Query () aus, um eine Liste dynamischer Objekte zurückzugeben. Unten ist ein kurzer Test:
[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"));
}
}