当我发送到数据库时,字符数增加

问题描述

编写将文档的数据发送到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 

更改后不要忘记重建项目!