首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果参数为非空,ado.net ExecuteNonQuery将导致参数空异常。

如果参数为非空,ado.net ExecuteNonQuery将导致参数空异常。
EN

Stack Overflow用户
提问于 2015-08-27 10:06:16
回答 1查看 792关注 0票数 0

编辑使用实体框架/EDIT也出现问题

目前,我对ADO.Net和Sybase (16.0.0.21584版本)有一个神秘的问题。如果我试图向数据库(大约80 at )写入一个过程上的长varchar,ExecuteNonQuery会将异常The value cannot be NULL抛出参数名称desintation。问题是,没有参数为null,也没有参数命名为desintation。在执行过程之前,我已经将所有的值写到了文件系统中,为了调试系统,所有的文件都有一个内容,所以这里没有空的。

还有一件事,如果我将较小的数据写入数据库,那么每件事情都能正常工作。

程序如下:

代码语言:javascript
复制
ALTER PROCEDURE "admin"."DCS_SQLI_PARM_SetKeyValue"( 
  in @in_lvc_parmName long varchar,
  in @in_bint_workflowID bigint default null,
  in @in_bint_contentID bigint default null,
  in @in_lvc_parm_value long varchar ) 
begin
  declare @bint_id bigint;
  set @bint_id = ISNULL((select ID from DCS_INPUT_Parameter_KeyValue
      where parameter_name = @in_lvc_parmName and ISNULL(ContentID,0) = ISNULL(@in_bint_contentID,0) and WorkflowID = @in_bint_workflowID),
    GET_IDENTITY('DCS_INPUT_Parameter_KeyValue',1));
  insert 

into DCS_INPUT_Parameter_KeyValue
    ( ID,
    parameter_name,
    parameter_value,
    ContentID,
    WorkflowID ) on existing update defaults off values
    ( @bint_id,
    @in_lvc_parmName,
    @in_lvc_parm_value,
    @in_bint_contentID,
    @in_bint_workflowID ) 
end

此方法正在执行以下过程:

代码语言:javascript
复制
public static void ExecuteProcedure(string SqlStatement, string ConnectionName, params object[] Parameter)
{
    SAConnection cConnection = DAL.ConnectionManager.GetOpenPoolConnection<SAConnection>(Connection: ConnectionName);

    try
    {
        SACommand cCommand = new SACommand(SqlStatement, cConnection);
        cCommand.CommandType = CommandType.StoredProcedure;

        if (Parameter != null)
        {
            foreach (var cParam in Parameter)
            {
                cCommand.Parameters.Add(new SAParameter() { Value = cParam });
            }
        }

        cCommand.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        if (UserRightManager.UserHasRightsFrom(0))
        {
            if (System.Environment.UserInteractive)
            {
                MessageBox.Show("SQL-Text: " + SqlStatement + "\r\n" + ex.ToString(), "SQL-Error", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
        }
        else
        {
            if (System.Environment.UserInteractive)
            {
                MessageBox.Show("--- --- --- ---.", "SQL-Fehler", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
        }

        if (cConnection != null)
        {
            if (cConnection.State != ConnectionState.Closed)
            {
                cConnection.Close();
            }
        }

        Base.ExceptionHandling.Write("Error during executing a procedure", Foundation.ExceptionLevel.Error, ex, SqlStatement);

        throw new Exception("Error in ExecuteProcedure", ex);
    }

    cConnection.Close();
}

ExecuteProcedure方法非常老,必须重写,但这不应该导致当前的问题。

使用实体框架编辑会导致相同的错误:

代码语言:javascript
复制
public void SetParameter(string parameterName, object parameterValue)
{
    try
    {
        //Simplic.PlugIn.DocCenterServer.AS.Core.DB.Database.Instance.ExecuteProcedure("DCS_SQLI_PARM_SetKeyValue", new object[] { parameterName, this.wf.ID, this.ID, parameterValue }); 
        using (FrameworkDbContext dbContext = new FrameworkDbContext())
        {
            // Get Existing id
            var entry = dbContext.DCS_INPUT_Parameter_KeyValue.Where(item => item.Parameter_name == parameterName && item.WorkflowID == this.wf.ID && item.ContentID == this.ID)
                    .FirstOrDefault();

            if (entry == null)
            {
                DCS_INPUT_Parameter_KeyValue value = new DCS_INPUT_Parameter_KeyValue();
                value.Parameter_name = parameterName;
                value.Parameter_value = parameterValue == null ? "" : parameterValue.ToString();


      value.ContentID = this.ID;
                    value.WorkflowID = this.wf.ID;
                    dbContext.DCS_INPUT_Parameter_KeyValue.Add(value);

                    var size = value.Parameter_value.Length;
                    Console.WriteLine("Parameter-Size: " + size.ToString());

                    dbContext.SaveChanges();
                }
                else
                {
                    entry.Parameter_name = parameterName;
                    entry.Parameter_value = parameterValue == null ? null : parameterValue.ToString();
                    dbContext.SaveChanges();
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }

编辑2long varchar切换到long binary似乎解决了这个问题。

有谁知道这个问题会是什么吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-08-27 10:17:10

我在sybase遇到了类似的问题。数据库的驱动程序无法处理此类参数。由于一定的大小,参数会失败。

为了防止这个问题,我必须调用一个更新查询,将参数文本大小设置为临时表中的最大值。然后调用存储过程从临时表中获取参数。

希望能帮上忙..。

编辑

代码语言:javascript
复制
create table #temp (
  id int identity,
  val text null
);

insert into #temp(val) values(null);
select @@identity;

然后

代码语言:javascript
复制
set textsize 123456 --find the max size
update #temp set val = '[yourlongsizevalue]' where id = @@identity

最后,在存储过程中

代码语言:javascript
复制
select @variable = val from #temp where id = @id

对我来说效果很好。但对于实体框架我不知道

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32246451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档