CSharp - 在sql_variant列的表值參數中,傳遞'object'的參數

  显示原文与译文双语对照的内容
0 0

我有一個table-valued參數 SQL Server 2012定義為:


CREATE TYPE [dbo].[TVP] AS TABLE (
 [Id] [int] NOT NULL,
 [FieldName] [nvarchar](100) NOT NULL,
 [Value] [sql_variant] NOT NULL
)

我在 C# 中調用它,代碼看起來類似於 LIKE:


var mdItems = new DataTable();
mdItems.Columns.Add("Id", typeof(int));
mdItems.Columns.Add("FieldName", typeof(string));
mdItems.Columns.Add("Value", typeof(object));
mdItems.Rows.Add(new object[] {2,"blah","value"});//'value' is usually a string
SqlCommand sqlCommand = conn.CreateCommand();
sqlCommand.CommandText ="[WriteFieldValues]";
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@FieldValues", mdItems);
sqlCommand.ExecuteNonQuery();

然後我得到以下錯誤從 SQL Server ExecuteNonQuery 電話:

不支持列'值'的類型。 類型是'對象'

我發現有人在 3年前遇到了同樣的問題,它被識別為一個已知的微軟 Bug 。 到 Bug的鏈接已經斷開,儘管。 是否有人知道 Bug的狀態或者潛在的解決辦法有更新的信息? 就像這樣,這個 Bug 真的殺死了 sql_variant 欄位的值。

时间: 原作者:

0 0

希望你對這個"一個大小適合所有"數據模型有一個很好的使用。 通常,當你試圖對基於集合的關係代數和sargeability的誤解進行縮放時,它會在你的臉上爆炸。 也許你已經給了一些想法。 我不想在這裡模型上開發 web logic或者報告。

請記住,你試圖將一個對象插入到資料庫引擎中,而資料庫引擎不知道底層結構。 對象是如此的通用,以至於對象的接收者不知道如何解釋它。 對象具有屬性,但是你只能訪問這些屬性,如果你有明確的指示或者使用反射來識別unpackage中的基礎類型,那麼該對象就可以了。 只有通過使用反射,( 我知道) 才能可靠地將對象轉換為基礎類型,而不需要了解任何內容。 也許. NET的一些高手會給我其他的方法。

無法將通用對象類型存儲為 sql_variant LIKE 。 甚至sql_variant需要有一些強類型的值。 SQL Server 不會隱式地使用反射來嘗試找出數據類型( 然後是基礎數據的值) 是什麼。

可以使用 system 。reflection方法的GetType,然後在插入之前拋出一個大小寫語句,以便進行相應的轉換。

原作者:
0 0

不幸的是,我現在沒有時間完全回答這個問題,但是我可以讓你走上正確的道路。

我在過去所做的是,使用一個XML參數,將數據集序列化為 XML,將數據集( 或者任何 POCO,比如) 作為XML傳遞到過程中,然後將該XML變數的". nodes"屬性( 和其他成員) 提取到臨時表local本地表 var 。"工作表"等等 中。

這很模糊,但是如果你序列化了該數據集,並檢查了創建的XML,並在聯機叢書中讀取了XML數據類型,你可能會發現如何完成你的任務。

如果這沒有幫助,我將嘗試把一個實際的解決方案放在明天,就像我在今天離開時遇到的這個問題一樣。

乾杯 !

...