在Oracle DB C中将CLOB作为JSON字符串处理#

时间:2018-01-18 22:22:47

标签: c# string oracle clob

我正在尝试将json字符串存储在我的oracle数据库中作为CLOB数据类型。我的插入语句似乎正在起作用:

if (connection.State == ConnectionState.Closed)
    {
        connection.Open();
    }

var jsonString = ...; // some json string

var jsonToBytes = Encoding.Unicode.GetBytes(jsonString);
var clob = new OracleClob(connection);
clob.Write(jsonToBytes, 0, jsonToBytes.Length);

var query = new StringBuilder($"INSERT INTO DATATABLE (ID, JSON) VALUES ");
query.Append($"(DATATABLE_SEQ.NEXTVAL, :1)");

var sqlString = query.ToString();
var command = new OracleCommand(sqlString, connection);

var jsonParam = command.Parameters.Add("JsonString", OracleDbType.Clob);
jsonParam.Direction = ParameterDirection.Input;
jsonParam.Value = jsonToBytes;

var rowsAffected = command.ExecuteNonQuery();

command.Dispose();
connection.Close();

return rowsAffected;

我的问题是将CLOB作为字符串返回。要求我一次返回多行。我想我需要将json字符串作为字节返回,然后转换为字符串,但我迷失了如何将值作为byte []返回。这就是我到目前为止所做的:

var queryString = $"SELECT * FROM DATATABLE";
var command = new OracleCommand(queryString, connection);
var reader = command.ExecuteReader();
var modelList = new List<RowModel>();

while (reader.Read())
{
    var jsonByte = reader.GetValue(reader.GetOrdinal("JSON"));

    modelList.Add(new RowModel{
        ID = reader.GetInt32(reader.GetOrdinal("ID"));
        JsonString = Encoding.Unicode.GetString((byte[])jsonByte);  // This is failing
    });
}

但是,当然,这失败了,错误是jsonByte无法从字符串转换为byte []。不过,我觉得我非常接近将clob数据作为字符串返回。插入是否不正确并影响数据检索?

非常感谢任何帮助/想法。

编辑:我正在使用Oracle.ManagedDataAccess包,如果它有帮助的话

1 个答案:

答案 0 :(得分:0)

好的,所以我终于明白了,我只是在这里回答它,因为我花了两天时间才看到提到你可以在CLOB字段中插入字符串的任何地方...就像一个字符串。 / p>

我的插入已删除所有对参数,编码等的引用:

var query = new StringBuilder($"INSERT INTO DATATABLE (ID, JSON) VALUES ");
query.Append($"(DATATABLE_SEQ.NEXTVAL, '{jsonString}')");
var sqlString = query.ToString();
var command = new OracleCommand(sqlString, connection);
var rowsAffected = command.ExecuteNonQuery();
// And so on

然后进行数据检索:

var queryString = $"SELECT * FROM DATATABLE";
var command = new OracleCommand(queryString, connection);
var reader = command.ExecuteReader();
var modelList = new List<RowModel>();

while (reader.Read())
{
    modelList.Add(new RowModel
    {
        ID = reader.GetInt32(reader.GetOrdinal("ID")),
        JsonString = (string)reader.GetOracleClob(reader.GetOrdinal("JSON")).Value
    });
}

希望这可以帮助某人。我花了太长时间才弄清楚这么简单。