在我使用EF Core 1.1的ASP.NET Core 1.1项目中,我尝试按照official MSDN article和this post调用SQL Server存储过程。但我在以下代码中的While loop
内收到了上述错误。
我已经使用SQL Server Profiler验证了在
处成功调用存储过程DbDataReader oReader = await cmd.ExecuteReaderAsync();
行,当我在SSMS中运行捕获的SQL调用时,它确实返回正确数量的记录。
那么为什么我会收到错误以及如何解决?由于此错误,应用无法在视图中返回结果。
注意:您可能已经注意到我使用ADO.NET与EF提供的数据库连接[参考:上述MSDN文章]
public async Task<List<CustOrderViewModel>> getOrderReport(int SelectedYear, byte SelectedOrderType)
{
List<CustOrderViewModel> lstOrderReport = new List<CustOrderViewModel>();
using (SqlConnection conn = (SqlConnection)_context.Database.GetDbConnection())
{
await conn.OpenAsync();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "getOrderReport_SP";
cmd.Parameters.AddWithValue("@year", SelectedYear);
cmd.Parameters.AddWithValue("@orDerType", SelectedProjType);
DbDataReader oReader = await cmd.ExecuteReaderAsync();
if (oReader.HasRows)
{
while (await oReader.ReadAsync())
{
var row = new CustOrderViewModel
{
SelectedOrderYr = oReader.GetInt32(0),
OrderNumber = oReader.GetString(1),
OrderDesctiption = oReader.GetString(3),
OrderType = oReader.GetByte(8)
};
lstOrderReport.Add(row);
}
}
oReader.Dispose();
}
}
return lstOrderReport;
}
答案 0 :(得分:2)
ORM和Micro ORM的一个好处是它们通常会为您处理可空数据。
但是,在低级别工作时(直接使用ADO.NET),您需要自己处理所有事情。使用<script>
$(document).ready(function(){
$("#client-list").on('change', function postinput(){
var matchvalue = $(this).val(); // this.value
$.ajax({
url: 'sql/client-to-property.php',
data: { matchvalue: matchvalue },
type: 'post'
}).done(function(responseData) {
console.log('Done: ', responseData);
}).fail(function() {
console.log('Failed');
});
});
});
</script>
<div class="input-group mb-3">
<span class="input-group-addon gi data-gi-size gi-user-add"></span>
<select id="client-list" name="client-list">
<?php
$sql = "SELECT `id`, `email`
FROM `clients` ORDER BY `id` ASC";
$result = $DB_CON_C->query($sql);
if($result !== false) {
$data_row = '<option>New Client</option>' . "\n";
foreach($result as $row) {
$data_row .= '<option>' .$row['email'] . '</option>' . "\n";
}
}
unset($row);
echo $data_row;
?>
</select>
</div>
<select class="form-control" name="property_list">
*insert output javascript here
</select>
表示在调用具体的DbDataReader
方法之前应使用IsDBNull
方法。
因此,如果GetXXX
列可以为空,为避免异常,您应该使用类似这样的内容
OrderDesctiption
与任何其他可空类型列类似。
由于在很多地方这样做很烦人,我宁愿创建一个这样的小帮助扩展方法实用程序:
OrderDesctiption = !oReader.IsDBNull(3) ? oReader.GetString(3) : null,
并在需要时使用public static class DataReaderExtenstions
{
public static string GetNString(this DbDataReader reader, int ordinal)
{
return !reader.IsDBNull(ordinal) ? reader.GetString(ordinal) : null;
}
public static int? GetNInt32(this DbDataReader reader, int ordinal)
{
return !reader.IsDBNull(ordinal) ? reader.GetInt32(ordinal) : (int?)null;
}
// Similar for Int16, Byte, Decimal, Double, DateTime etc.
}
(可空)版本:
N