【问题标题】:C# insert loop fails for cassandracassandra 的 C# 插入循环失败
【发布时间】:2015-11-28 07:19:51
【问题描述】:

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

错误:{“对象不能从 DBNull 转换为其他类型。”}

我做错了什么

--代码

        ConnectionString._SQLServerName = txtsql.Text;
        ConnectionString._DBName = "casmonitor";
        SqlConnection MyConn = ConnectionString.GetOpenedConnection();
        SqlCommand MyCommand = ConnectionString.GetOpenedConnection().CreateCommand();
        SqlDataReader SqlReader;

        string sqltext = ("select * from DBAdmin..[stockhist1] (nolock)");
        MyCommand.CommandText = sqltext;
        SqlReader = MyCommand.ExecuteReader();
        while (SqlReader.Read())
        {
            ISession CluSession = cluster2.Connect("dbs");
            var ps = CluSession.Prepare("insert into stocks (id,name,price1,price2,price3,price4) values (?,?,?,?,?,?)");

            //  var dbstring= "insert into stocks (id,name,price1,price2,price3,price4) values (" + SqlReader["id"].ToString() + ",'" + SqlReader["name"].ToString() + "'," + Convert.ToUInt64(SqlReader["price1"].ToString()) + "," + Convert.ToUInt64(SqlReader["price2"]) + "," + Convert.ToUInt64(SqlReader["price3"]) + "," + Convert.ToUInt64(SqlReader["price4"]) + ");";
            // CluSession.Execute(dbstring);
            //  CluSession.Execute("insert into stocks (id,name,price1,price2,price3,price4) values (" + SqlReader["id"].ToString() + ",'" + SqlReader["name"].ToString() + "'," + Convert.ToUInt64(SqlReader["price1"].ToString()) + "," + Convert.ToUInt64(SqlReader["price2"]) + "," +Convert.ToUInt64(SqlReader["price3"]) + "," +Convert.ToUInt64(SqlReader["price4"]) + ")");

           // var ps = CluSession.Prepare("insert into Product(id,name,p_image) values (?,?,?)");
            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"]));
            CluSession.Execute(statement);

            cluster2.Shutdown();
            CluSession.Dispose();


        }
        SqlReader.Close();
        MyConn.Close();

【问题讨论】:

  • 请忽略问题。我已解决问题

标签: c# cassandra cql cassandra-2.0


【解决方案1】:

其中一个值(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 转换为小数或整数。

我建议您创建一个函数,您可以将其中的每一个都传递到其中,然后返回 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 创建一个(在上面没有为你这样做)

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2013-02-25
    • 2017-02-03
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多