我正在尝试将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包,如果它有帮助的话
答案 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
});
}
希望这可以帮助某人。我花了太长时间才弄清楚这么简单。