数据库存储字符超过2000处理办法;
今天与其他公司程序员连调接口;需要将请求参数入库,平时运行正常,今天这个接口却报 “ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值” ,当时以为是字符串超过了数据库设定的长度,检查下果然超出了长度,将数据库varchar2长度由2000改为3000,再次调用结果依然报着个错误;上网上查资料发现;如果是varchar2类型的,当长度超过2000,--4000(最大值)之间的时候,oracle会自动将该字段值转为long型的,然后,插入操作失败;网上给的解决方案是 ”解决办法是:将此字段的类型改为clob或者blob类型”;我将类型装换为Clob类型后;程序运行依然报“ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误”;
我在次上网上查信息发现,DbType并没有CLOB这种类型:
序号 |
Oracle数据类型 |
.NET类型 |
GetOracleValue类型 |
DbType |
OracleType |
1 |
BFILE |
byte[] |
OracleBFile |
|
BFile |
2 |
BLOB |
byte[] |
OracleLob |
|
Blob |
3 |
CHAR |
string |
OracleString |
AnsiStringFixedLength |
Char |
4 |
CLOB |
string |
OracleLob |
|
Clob |
5 |
DATE |
DateTime |
OracleDateTime |
DateTime |
DateTime |
6 |
FLOAT |
Decimal |
OracleNumber |
Single、Double、Decimal |
Float、Double、Number |
7 |
INTEGER |
Decimal |
OracleNumber |
SByte、Int16、Int32、Int64、Decimal |
SByte、Int16、Int32、Number |
8 |
INTERVAL YEAR TO MONTH |
Int32 |
OracleMonthSpan |
Int32 |
IntervalYearToMonth |
9 |
INTERVAL DAY TO SECOND |
TimeSpan |
OracleTimeSpan |
Object |
IntervalDayToSecond |
10 |
LONG |
string |
OracleString |
AnsiString |
LongVarChar |
11 |
LONG RAW |
byte[] |
OracleBinary |
Binary |
LongRaw |
12 |
NCHAR |
string |
OracleString |
StringFixedLength |
NChar |
13 |
NCLOB |
string |
OracleLob |
|
NClob |
14 |
NUMBER |
Decimal |
OracleNumber |
VarNumeric |
Number |
15 |
NVARCHAR2 |
string |
OracleString |
String |
NVarChar |
16 |
RAW |
byte[] |
OracleBinary |
Binary |
RAW |
17 |
ROWID |
string |
OracleString |
AnsiString |
Rowid |
18 |
TIMESTAMP |
DateTime |
OracleDateTime |
DateTime |
Timestamp |
19 |
VARCHAR2 |
string |
OracleString |
AnsiString |
VarChar |
在网上查新后解决办法是:借用OracleParameter来处理该类型;代码如下;
/// <summary>
/// 为指定查询对象增加一个clob类型参数并赋值
/// </summary>
/// <param name="command">查询对象</param>
/// <param name="paranme">参数名</param>
/// <param name="data">参数值</param>
public void AddInClobParameter(DbCommand command, string paranme, string data)
{
OracleParameter p = new OracleParameter(paranme, OracleType.Clob);
p.Direction = ParameterDirection.Input;
p.Value = data;
command.Parameters.Add(p);
}
问题得以初步解决;但是当程序在次运行是报错误 “ORA-01084: OCI 调用中的参数无效” 再次上网查询发现要将空字符串插入CLOB类型中报改错误;将代码更改为
/// <summary>
/// 为指定查询对象增加一个clob类型参数并赋值
/// </summary>
/// <param name="command">查询对象</param>
/// <param name="paranme">参数名</param>
/// <param name="data">参数值</param>
public void AddInClobParameter(DbCommand command, string paranme, string data)
{
OracleParameter p = new OracleParameter(paranme, OracleType.Clob);
p.Direction = ParameterDirection.Input;
if (string.IsNullOrEmpty(data))
{
data = " ";
}
p.Value = data;
command.Parameters.Add(p);
}
问题圆满解决;
参考地址:http://blog.163.com/zhchf_52@yeah/blog/static/67822974201081710812218/;
http://youzhangcai.blog.163.com/blog/static/166848184201011781538102/;
http://blog.csdn.net/ansontang1217/article/details/6367099
http://blog.csdn.net/liubing5188666/article/details/5663833