我正在尝试使用C#datareader循环将行插入cassandra表中,在插入一条记录后,它会给我以下错误
错误:{"无法将对象从DBNull强制转换为其他类型。"}
我做错了什么
- 代码
var tuples =
doc.Root.Descendants("server")
.Select(x => Tuple.Create(x.Element("name").Value, x.Element("ip").Value))
.ToList();
答案 0 :(得分:2)
其中一个值(Convert.To....()
)从数据库返回null
var statement = ps.Bind(Convert.ToInt32(SqlReader["id"]),SqlReader["name"].ToString() ,Convert.ToDecimal(SqlReader["price1"]) ,Convert.ToDecimal(SqlReader["price2"]) ,Convert.ToDecimal(SqlReader["price3"]),Convert.ToDecimal(SqlReader["price4"]));
例如,您不能将DBNull转换为小数或int。
我建议你创建一个函数,你可以将每个函数传递给,然后返回0(其中DBNull)或值
像这样的东西(没有测试,只是快速和肮脏):
public static decimal GetDecimalValue(SqlDataReader reader, string fieldName)
{
if (!reader.IsDBNull(reader[fieldName])))
return reader.GetDecimal(reader[fieldName]);
else
return 0;
}
然后将您的陈述调整为:
var statement = ps.Bind(Convert.ToInt32(SqlReader["id"]),
SqlReader["name"].ToString() ,
GetDecimalValue(SqlReader, "price1"),
GetDecimalValue(SqlReader, "price2"),
GetDecimalValue(SqlReader, "price3"),
GetDecimalValue(SqlReader, "price4"));`
也为int创建一个(在上面没有为你做过)