将变量传递到 Dapper 是查询参数..."发送或接收数据的请求被禁止,因为套接字未连接



好的,我"我正在做一个看起来像简单的Dapper查询

但是,如果我传入studId参数,它就会出现这个低级别的网络异常:

{"发送或接收数据的请求被禁止,因为套接字没有连接并且(当使用sendto调用在数据报套接字上发送时(没有提供地址。"}

如果我注释掉使用它的sql行,修复where子句,并注释掉它添加parameters对象的行。它按预期检索行。

在过去的2.5天里,我尝试了我能想到的一切,更改名称以匹配常见的命名模式,将类型更改为字符串(只是在将字符串转换为数字时出错(,yadda yadda。。

我完全不知道为什么它不喜欢这个参数,我查看了其他有效的代码,它们通过了Id。这很好。。。

在这一点上,我认为它一定是一个ID-10-t盯着我的脸,我只是假设我的路正好经过它,而没有看到它。

感谢提供的任何帮助

public List<StudDistLearnSchedRawResponse> GetStudDistanceLearningScheduleRaw( StudDistLearnSchedQueryParam inputs )
{
var aseSqlConnectionString = Configuration.GetConnectionString( "SybaseDBDapper" );
string mainSql = " SELECT " +
" enrollment.stud_id,  " +
" sched_start_dt,  " +
" sched_end_dt,   " +
" code.code_desc, " +
" student_schedule_dl.enrtype_id,     " +
" student_schedule_dl.stud_sched_dl_id,   " +
" dl_correspond_cd,  " +
" course.course_name,   " +
" stud_course_sched_dl.sched_hours,    " +
" actual_hours,  " +
" course_comments as staff_remarks,  " + // note this column rename - EWB
" stud_course_sched_dl.sched_item_id ,  " +
" stud_course_sched_dl.stud_course_sched_dl_id " +
"  from stud_course_sched_dl     " +
"     join student_schedule_dl on student_schedule_dl.stud_sched_dl_id           = stud_course_sched_dl.stud_sched_dl_id  " +
"     join course on stud_course_sched_dl.sched_item_id      = course.sched_item_id  " +
"     left join code on student_schedule_dl.dl_correspond_cd = code.code_id " +
"     join enrollment_type on student_schedule_dl.enrtype_id = enrollment_type.enrtype_id " +
"     join enrollment on enrollment_type.enr_id              = enrollment.enr_id " +
"   where enrollment.stud_id = @studId " +
"     and sched_start_dt >= @startOfWeek" +
"     and sched_end_dt <= @startOfNextWeek";

DapperTools.DapperCustomMapping<StudDistLearnSchedRawResponse>();
//string sql = query.ToString();
DateTime? startOfWeek     = StartOfWeek( inputs.weekStartDateTime, DayOfWeek.Monday );
DateTime? startOfNextWeek = StartOfWeek( inputs.weekStartDateTime.Value.AddDays( 7 ) , DayOfWeek.Monday );
try
{
using ( IDbConnection db = new AseConnection( aseSqlConnectionString ) )
{
db.Open();
var arguments = new
{
studId = inputs.StudId, //  it chokes and gives a low level networking error - EWB
startOfWeek = startOfWeek.Value.ToShortDateString(),
startOfNextWeek  = startOfNextWeek.Value.ToShortDateString(),
};
List<StudDistLearnSchedRawResponse> list = new List<StudDistLearnSchedRawResponse>();

list = db.Query<StudDistLearnSchedRawResponse>( mainSql, arguments ).ToList();

return list;
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.ToString());
return null;
}
}

这是输入对象

public class StudDistLearnSchedQueryParam
{
public Int64 StudId;
public DateTime? weekStartDateTime;
}

这里是dapper-tools对象,它只是抽象了一些丑陋的代码以使其看起来更好。

namespace EricSandboxVue.Utilities
{
public interface IDapperTools
{
string        ASEConnectionString { get; }
AseConnection _aseconnection      { get; }
void          ReportSqlError( ILogger DalLog, string sql, Exception errorFound );
void          DapperCustomMapping< T >( );
}
public class DapperTools : IDapperTools
{
public readonly string _aseconnectionString;
public string ASEConnectionString => _aseconnectionString;
public AseConnection _aseconnection
{
get
{
return new AseConnection( _aseconnectionString );
}
}
public DapperTools( )
{
_aseconnectionString = Environment.GetEnvironmentVariable( "EIS_ASESQL_CONNECTIONSTRING" );
}
public void ReportSqlError( ILogger DalLog, string sql, Exception errorFound )
{
DalLog.LogError( "Error in Sql" );
DalLog.LogError( errorFound.Message );
//if (env.IsDevelopment())
//{
DalLog.LogError( sql );
//}
throw errorFound;
}
public void DapperCustomMapping< T >( )
{
// custom mapping
var map = new CustomPropertyTypeMap(
typeof( T ),
( type, columnName ) => type.GetProperties( ).FirstOrDefault( prop => GetDescriptionFromAttribute( prop ) == columnName )
);
SqlMapper.SetTypeMap( typeof( T ), map );
}
private string GetDescriptionFromAttribute( System.Reflection.MemberInfo member )
{
if ( member == null ) return null;
var attrib = (Dapper.ColumnAttribute) Attribute.GetCustomAttribute( member, typeof(Dapper.ColumnAttribute), false );
return attrib == null ? null : attrib.Name;
}
}
}

如果我将SQL字符串构建更改为这个(如下(,但其他内容保持不变(包括args结构中的StudId(。。。它不会崩溃并检索行,所以它显然是关于@studId的替换。。。

// "   where enrollment.stud_id = @studId " +
"     where sched_start_dt >= @startOfWeek" +
"     and sched_end_dt <= @startOfNextWeek";

您对数据成员的命名错误。我不知道用@开头的变量名是可能的。

问题就在这里:

var arguments = new
{
@studId = inputs.StudId, //  it chokes and gives a low level networking error - EWB
@startOfWeek = startOfWeek.Value.ToShortDateString(),
@startOfNextWeek  = startOfNextWeek.Value.ToShortDateString(),
};

应该是:

var arguments = new
{
studId = inputs.StudId, //  it chokes and gives a low level networking error - EWB
startOfWeek = startOfWeek.Value.ToShortDateString(),
startOfNextWeek  = startOfNextWeek.Value.ToShortDateString(),
};

@只是对Dapper的一个提示,它应该替换为相应的成员名称。@@在某些SQL方言中具有特殊含义,这可能是造成问题的原因。

以下是我的发现。

Sybase实现在Arguments方面遇到了困难。

它尤其难以处理int64类型的参数(这在NetCore之前就已经存在(

因此,如果您将传入参数的类型从int64更改为int32,一切都会正常工作。

您可以强制转换它,或者只更改方法参数的类型

最新更新