cassandra的C#插入循环失败

时间:2015-09-02 16:58:42

标签: c# cassandra cql cassandra-2.0

我正在尝试使用C#datareader循环将行插入cassandra表中,在插入一条记录后,它会给我以下错误

错误:{"无法将对象从DBNull强制转换为其他类型。"}

我做错了什么

- 代码

var tuples =
    doc.Root.Descendants("server")
        .Select(x => Tuple.Create(x.Element("name").Value, x.Element("ip").Value))
        .ToList();

1 个答案:

答案 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创建一个(在上面没有为你做过)