[英]How to capture a null Parameter and allow Parsing with DBNull in ADO.NET
[英]ado.net ExecuteNonQuery cause parameter null exception if parameter is not null
编辑使用实体框架/ EDIT也会出现此问题
目前,我对ADO.Net和Sybase SQL Anywhere(版本16.0.0.21584)有一个神秘的问题。 如果我尝试通过过程将长varchar写入数据库(大约80MB),则ExecuteNonQuery
会引发异常The value cannot be NULL
参数名称desintation
The value cannot be NULL
。 问题在于,没有参数为null,没有参数名为desintation
。 在执行过程之前,我已将所有值写入文件系统,以调试系统,所有文件都有内容,因此此处没有任何内容为null。
还有一件事,如果我将较小的数据写入数据库,则一切正常。
该过程如下所示:
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
此方法正在执行以下过程:
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
方法非常旧,必须重写,但这不会导致当前问题。
使用实体框架进行编辑会导致相同的错误:
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());
}
}
编辑2从long varchar
切换到long binary
似乎解决了这个问题。
有谁知道可能是什么问题?
谢谢。
我在sybase中遇到类似的问题。 数据库驱动程序无法处理此类参数。 由于一定大小,参数将失败。
为避免此问题,我不得不在临时表中调用参数文本大小设置为max的更新查询。 然后调用存储过程以从临时表中获取参数。
希望能帮助到你...
[编辑]
create table #temp (
id int identity,
val text null
);
insert into #temp(val) values(null);
select @@identity;
然后
set textsize 123456 --find the max size
update #temp set val = '[yourlongsizevalue]' where id = @@identity
最后,在您的存储过程中
select @variable = val from #temp where id = @id
对我来说,这很好。 但是用实体框架我不知道
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.