如果仅仅在数据库中设置了类型为 CLOB 字段类型,使用普通的 INSERT 语句直接写入数据到数据库的话,它依然会将其视为 VARCHAR 类型数据,并最大长度为 4000 字符。超过该长度会报出字符串超长,写入数据失败的错误。
使用 Dapper 处理 CLOB 数据 INSERT
代码如下:
OracleConnection cnn = new OracleConnection("..数据库链接字符串..");
cnn.Open();
string content = "假定超过4000的超长字符串";
byte[] newValue = Encoding.Unicode.GetBytes(content); //这里一定要使用 Unicode 字符编码
OracleClob p_content = new OracleClob(cnn);
p_content.Write(newValue, 0, newValue.Length);
string sql = "INSERT INTO TABLE(CONTENT) VALUES(:content)";
DynamicParameters parameter = new DynamicParameters();
parameter.Add("content", p_content);
cnn.Execute(sql, parameter);
cnn.Close();
其实跟 Dapper 也没多大关系,在 .Net 中的 Oracle CLOB 需要以上特殊处理下,否则 Dapper 会将其视为普通字符串类型写入。
敲重点,如何 UPDATE CLOB 字段类型的数据
本来没有这一节文章内容的,我认为像 INSERT 同样的方式创建 SQL 参数传入就好了。实际上并不是,UPDATE 需要跟以往同样的方式,直接 string 传参就可以了,以下参考:
OracleConnection cnn = new OracleConnection("..数据库链接字符串..");
cnn.Open();
string content = "假定超过4000的超长字符串";
string sql = "UPDATE TABLE SET CONTENT = :content WHERE ID = :id";
DynamicParameters parameter = new DynamicParameters();
parameter.Add("id", 10001);
parameter.Add("content", content);
cnn.Execute(sql, parameter);
cnn.Close();
你没看错,它不需要再转换为 OracleClob 对象参数了,转换了反而会报错。