问题描述
编写将文档的数据发送到Oracle中的DOCUMENT表的程序。 表格中的列为:id,名称,(文档/图片的)URL,所有者。 NAME col被定义为VARCHAR2(20),实际上我发送的字符数少于20, 但令人失望的是服务器的响应是:
ORA-12899:该列的值太大(实际:58,最大值:20)。
我不知道是什么原因导致文件名中的char数增加。 我很高兴听到任何建议。
我检查到达服务器(.Net)的数据,这些数据正是我在客户端(Angular)中发送的数据。
这是我在服务器端的代码:
namespace DrawingApp.Controllers.docsControllers
{
[Route("api/[controller]/")]
[ApiController]
public class CreateDocCtrl : ControllerBase
{
ICreateDocService _service;
public CreateDocCtrl(ICreateDocService service)
{
_service = service;
}
[HttpPost]
public Response CreateDoc([FromBody] CreateDocsRequest request)
{
return _service.createDoc(request);
}
}
}
namespace DocumentsService
{
[Register(Policy.Transient,typeof(ICreateDocService))]
public class CreateDocService : ICreateDocService
{
IDocsDal _dal;
public CreateDocService(IDocsDal dal)
{
_dal = dal;
}
public Response createDoc(CreateDocsRequest request)
{
Response retval = null;
try
{
_dal.CreateDoc(request);
//check if doc created:
var newDoc = _dal.GetDoc(request.DocData.DocId).Tables[0].Rows;
if (newDoc.Count == 1)
{
retval = new CreateDocResponSEOk("Document was created!");
}
}
catch (Exception ex)
{
retval = new CreateDocResponseErr(ex.Message);
}
return retval;
}
}
}
public DataSet CreateDoc(CreateDocsRequest request)
{
IDBParameter p_owner = _dalinfra.getParameter("Owner",OracleDbType.Varchar2,request.DocData.Owner);
IDBParameter p_docId = _dalinfra.getParameter("DocId",request.DocData.DocId);
IDBParameter p_docUrl = _dalinfra.getParameter("DocUrl",request.DocData.DocUrl);
IDBParameter p_docName = _dalinfra.getParameter("DocName",request.DocData.DocName);
return _dalinfra.ExecuteSPQuery(_conn,"CREATE_DOC",p_owner,p_docId,p_docUrl,p_docName);
}
解决方法
VARCHAR2(20)
表示20个字节而不是20个字符
1 byte
并不总是等于1 char
(例如非英语字符)。
尝试将db varchar2类型的字节更新为char或增加字节来解决。
,我了解出了什么问题, 当我将参数发送到Stroe Prodedure CREATE_DOC时, 我在参数docUrl的位置(长度为58)和docName的位置之间切换:
return _dalInfra.ExecuteSPQuery(_conn,"CREATE_DOC",p_owner,p_docId,p_docUrl,p_docName);
在sql开发人员中,顺序相反:
create or replace PROCEDURE CREATE_DOC
(
P_OWNER IN VARCHAR2,P_DOCID IN VARCHAR2,P_DOCNAME IN VARCHAR2,P_DOCURL IN VARCHAR2
更改后不要忘记重建项目!