當對 MS SQL Server 執行存盤程序時,記錄集帶有一些型別資訊。客戶端能夠檢索該型別資訊,例如像這樣(C#/.NET):
SqlCommand cmd = new SqlCommand("dbo.MyProc", conn);
SqlDataAdapter ada = new SqlDataAdapter(cmd);
ada.Fill(ds);
string ColName = ds.Tables[0].Columns[0].ColumnName;
Type ColType = ds.Tables[0].Columns[0].DataType;
這些列的可空性怎么樣?雖然在一般情況下它是不可知的,但有時它是 - 例如,當記錄集列直接來自表欄位時。如果 SQL Server 足夠聰明,它至少可以在這些情況下確定列可空性。SQL Server 是否在它與記錄集一起提供的任何元資料中向客戶端報告可空性?
特別是在 .NET 客戶端中,有AllowDBNull檢索到的列屬性,但在上面的場景中它是不可靠的 -true它既適用于來自可空欄位的列,也適用于來自非可空欄位的列。這是 .NET 客戶端的限制,還是底層協議的缺點?
uj5u.com熱心網友回復:
這是一個限制SqlDataAdapter。
正如您在規范中看到的那樣,TDS 協議確實會回傳此資訊。
反過來,SqlDataReader將通過GetSchemaTable. 但它不會進入使用DbDataAdapter.
您可以使用以下代碼看到這一點
using(var conn = new SqlConnection(YourConnectionString))
{
conn.Open();
using(var comm = new SqlCommand("select 1", conn))
using(var reader=comm.ExecuteReader())
{
reader.Read();
reader.GetSchemaTable().Dump();
}
using(var comm = new SqlCommand("select case when getdate() = 1 then 1 end", conn))
using(var reader = comm.ExecuteReader())
{
reader.Read();
reader.GetSchemaTable().Dump();
}
}
你會看到第一個有AllowDBNullasfalse和第二個 as true。
我建議您在任何情況下都避免使用SqlDataAdapter,因為它僅在資料系結 UI 場景中真正有用。在后端代碼中,只需使用SqlDataReader,甚至更好:使用諸如 Dapper 或 Entity Framework 之類的 ORM,它將為您解決所有此類問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/492711.html
標籤:sql服务器
