簡體   English   中英

在Oracle DB C#中將CLOB處理為JSON字符串

[英]Handling CLOB as JSON String in Oracle DB C#

我正在嘗試將json字符串作為CLOB數據類型存儲在我的oracle數據庫中。 我的插入語句似乎正在工作:

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,如果有幫助的話

好的,我終於弄清楚了,我將在這里回答,因為我花了兩天的時間才能看到任何提到可以在CLOB字段中插入字符串的地方,就像字符串一樣。

我的插入內容刪除了對參數,編碼等的所有引用:

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
    });
}

希望這可以幫助某人。 我花了很長時間才弄清楚這么簡單的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM