Есть ли способ сделать что-то вроде этого:C# Анализировать SqlDbType Convertion
(SqlDbType.Int).Parse(dtbDataTable.Rows[0]["Id"])
ТКС
Есть ли способ сделать что-то вроде этого:C# Анализировать SqlDbType Convertion
(SqlDbType.Int).Parse(dtbDataTable.Rows[0]["Id"])
ТКС
Проводка назад мой обходной путь:
public static string ParseValue(SqlDbType psdtParameter, string pstrValue, string pstrDateFormat = null)
{
object objReturn = new object();
if (pstrValue != "")
{
switch (psdtParameter.ToString())
{
case "BigInt":
objReturn = TypeDescriptor.GetConverter(typeof(Int64)).ConvertFromString(pstrValue);
break;
case "Bit":
objReturn = TypeDescriptor.GetConverter(typeof(Boolean)).ConvertFromString(pstrValue);
break;
case "NText":
case "NVarChar":
case "VarChar":
case "NChar":
case "Text":
case "Char":
objReturn = TypeDescriptor.GetConverter(typeof(String)).ConvertFromString(pstrValue);
break;
case "SmallDateTime":
case "DateTime":
objReturn = DateTime.ParseExact(pstrValue, pstrDateFormat, CultureInfo.InvariantCulture);
//TypeDescriptor.GetConverter(typeof(DateTime)).ConvertFromString(pstrValue);
break;
case "Money":
case "SmallMoney":
case "Decimal":
objReturn = TypeDescriptor.GetConverter(typeof(Decimal)).ConvertFromString(null, CultureInfo.InvariantCulture, pstrValue);
break;
case "Float":
objReturn = TypeDescriptor.GetConverter(typeof(Double)).ConvertFromString(pstrValue);
break;
case "Binary":
case "VarBinary":
case "Timestamp":
case "Image":
objReturn = TypeDescriptor.GetConverter(typeof(Byte[])).ConvertFromString(pstrValue);
break;
case "Int":
objReturn = TypeDescriptor.GetConverter(typeof(Int32)).ConvertFromString(pstrValue);
break;
case "Real":
objReturn = TypeDescriptor.GetConverter(typeof(Single)).ConvertFromString(pstrValue);
break;
case "SmallInt":
objReturn = TypeDescriptor.GetConverter(typeof(Int16)).ConvertFromString(pstrValue);
break;
case "TinyInt":
objReturn = TypeDescriptor.GetConverter(typeof(Byte)).ConvertFromString(pstrValue);
break;
}
return objReturn.ToString();
}
else
{
return null;
}
}
Tks!
Прохладный, но я не понимаю, почему вам нужно преобразовать psdtParameter в строку ... – Antonio
К сожалению, нет. SqlDbType - это перечисление, поэтому (SqlDbType.Int)
фактически сводится к целочисленному значению, а не типу. Единственный способ, которым я могу думать, чтобы сделать это своего рода переключатель заявление:
switch (SqlDbType dbType)
{
case SqlDbType.Int:
int value = Int32.Parse(dtbDataTable.Rows[0]["Id"]);
//Do stuff with this value
//repeat for other types
}
Это хороший способ решить мою проблему @Omada, я использую ее внутри своей Framework для других вещей, но она немного снижает производительность из-за существующего множества параметров. – raddesso
Если существует какой-то способ не выполнять синтаксический анализ и переключатель будет выглядеть лучше – raddesso
Я думаю, что будет трудно сделать, и это не самый читаемый способ. Я обрабатываю это с помощью методов расширения, чтобы помочь с TinyInt, SmallInt и значениями, допускающими значение NULL по всей доске. Например .:
using (var dr = new SafeDataReader(cmd.ExecuteReader()) {
while (dr.Read()) {
int? id = dr.GetNullableIntFromSqlTinyInt(0);
// Other stuff like that to handle type conversions
}
}
SafeDataReader является частью структуры бизнес-объекта CSLA, но вы могли бы реализовать свой собственный DataReader, если вы хотите. Это гораздо более разборчиво и инкапсулирует всю логику синтаксического анализа за кулисами в метод расширения.
Каково значение 'dtbDataTable.Rows [0] [" Id "]'? – manji
Действительно ли «Идентификатор» является идентификатором типа данных, или вы пытаетесь выяснить данные идентификатора столбца? – vcsjones
Можете ли вы объяснить, почему вы хотите вывести поле ["Id"] в перечисление типа SqlDbType? Не хотите делать Int.Parse (dtbDataTable.Rows [0] ["Id"]. ToString()) или просто (int) dtbDataTable.Rows [0] ["Id"], если это уже целое число ? – saamorim