是否有從DataColumn.DataType轉換爲SqlDbType的轉換器?或者我必須寫一個方法來做到這一點?將DataColumn.DataType轉換爲SqlDbType
回答
我在Dot Net Pulse和CodeProject找到了幾個選項。我最終與CodeProject上的代碼轉換,從VB.NET到C#去:
private SqlDbType GetDBType(System.Type theType)
{
System.Data.SqlClient.SqlParameter p1;
System.ComponentModel.TypeConverter tc;
p1 = new System.Data.SqlClient.SqlParameter();
tc = System.ComponentModel.TypeDescriptor.GetConverter(p1.DbType);
if (tc.CanConvertFrom(theType)) {
p1.DbType = (DbType)tc.ConvertFrom(theType.Name);
} else {
//Try brute force
try {
p1.DbType = (DbType)tc.ConvertFrom(theType.Name);
}
catch (Exception) {
//Do Nothing; will return NVarChar as default
}
}
return p1.SqlDbType;
}
我真的很希望能找到,有一些不可告人的祕密System.Data.SqlClient的方法來進行轉換,我只是失蹤了。
沒有現成的方法來做到這一點 - 您需要滾動功能來執行此操作,或者緩存Dictionary<Type, SqlDbType>
以進行查找。
您可以複製的數據表像
DataTable newdt = DataTable.Copy();
並與不同數據類型中刪除列,並將它們添加到您的newdt。
只是我過去一直在解決它的一種方法。
像這樣的東西可能是一個好的開始。這是不全面的,但讓我的地方,我需要去:
Dictionary<Type, SqlDbType> GetSQLTypeConversionMap()
{
var result = new Dictionary<Type, SqlDbType>();
result.Add(typeof(string), SqlDbType.VarChar);
result.Add(typeof(Int16), SqlDbType.Int);
result.Add(typeof(Int32), SqlDbType.Int);
result.Add(typeof(DateTime), SqlDbType.DateTime2);
return result;
}
這裏是我的解決方案,它使用內置的.NET功能:
/// <summary>
/// Get the equivalent SQL data type of the given type.
/// </summary>
/// <param name="type">Type to get the SQL type equivalent of</param>
public static SqlDbType GetSqlType(Type type)
{
if (type == typeof(string))
return SqlDbType.NVarChar;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
type = Nullable.GetUnderlyingType(type);
var param = new SqlParameter("", Activator.CreateInstance(type));
return param.SqlDbType;
}
當心,這將始終設置字符串爲nvarchar (這個問題的任何通用解決方案都會有相同的問題,因爲無法知道正確的SqlDbType)。當將這個參數化的SELECT或UPDATE查詢用於不是NVarChar的列時,SqlServer的性能在比較NChar/NVarChar和Char/VarChar類型時會拖延,因爲它正在爲每次比較轉換值。最近這讓我感到困難(一個過程從花費4分鐘到140+分鐘),所以當你可以的時候,一定要明確你的char參數類型!我會想象其他類似的類型可能會有同樣的問題,但沒有任何問題導致我(還)。
編輯刪除我的一小時後被鎖定的意外downvote。 – 2017-04-25 19:22:59
回答this thread,但它是非常簡短,所以我會在這裏重新報價是:
可以使用方法ConvertTypeCodeToDbType
轉換TypeCode
到DbType
在System.Web.UI.WebControls.Parameter
類:Parameter.ConvertTypeCodeToDbType方法。要獲得TypeCode,您可以使用方法Type.GetTypeCode(Type type)
。
- 1. 將數字字符串轉換爲sqldbtype
- 2. 將字符串轉換爲SqlDbType
- 3. SqlDbType在Oracle中轉換爲什麼?
- 4. 轉換字符串值SqlDbType
- 5. 將字符串從PowerShell轉換爲sqldbtype。 datetime
- 6. NET系統類型爲SqlDbType
- 7. SqlDbType和地理
- 8. 將MS Access.adp轉換爲ASP.Net轉換:DLookup轉換爲SQL
- 9. 將值轉換爲%
- 10. 將PeriodIndex轉換爲
- 11. 將ISML PAC轉換爲XForm轉換
- 12. 將VB6代碼轉換爲PHP轉換
- 13. 將3D轉換轉換爲2D
- 14. 將XML轉換,轉換爲屬性
- 15. 將HTML轉換爲Google文檔轉換
- 16. 將VB轉換爲C#類型轉換
- 17. 將DataRow []轉換爲DataTable的ASP.NET轉換
- 18. 將數據轉換爲數字轉換
- 19. 將json轉換爲數組php將數組轉換爲字符串轉換
- 20. 將表格轉換爲html並將其轉換爲div
- 21. FLEX XMLDecoder將`09.00`轉換爲「09.00」,但將`10.00`轉換爲10
- 22. 將XML轉換爲XML,將屬性轉換爲元素
- 23. 將OCaml轉換爲F#:將OCaml open_box和close_box轉換爲F#
- 24. 將NSData轉換爲base64encoded並將字節數組轉換爲C#
- 25. *將char轉換爲main並將* char轉換爲struct
- 26. 將C++轉換爲python - 將memcpy uchar轉換爲int64
- 27. 爲什麼DBNull.Value需要適當的SqlDbType?
- 28. SqlDBtype問題與ASp.net
- 29. 有沒有辦法將一個類型參數約束爲SqlDbType?
- 30. 將字母不是7位ASCII轉換爲ASCII(如將n轉換爲n並將其轉換爲±)
任何人得到這個編譯?由於tc.ConvertFrom返回一個對象,我得到「不能隱式轉換類型'對象'到'System.Data.DbType'。存在明確的轉換(你是否缺少一個轉換?)」 – 2016-01-28 14:59:45
@AlanMacdonald:對不起 - 看到我的編輯, – 2016-01-28 15:34:07
謝謝。我擔心這可能表明這個成員沒有得到很好的測試,所以我現在已經去了馬特米勒的回答 – 2016-01-28 16:08:01