.NET exception with SQL Server 2008
本文关键字:Server 2008 SQL with exception NET | 更新日期: 2023-09-27 18:18:30
此代码运行ASP。. NET on IIS.7在windows server 2008 R2和SQL server 2008 R2 Express上运行
这是一个简单的函数,它根据3个参数从数据库中进行选择,并返回包含所选行的对象。
这段代码在大多数时间正常运行,但在某些情况下,我得到一个名为serial_number
的异常,这是数据库表中的列名。
这是完全的例外:
[IndexOutOfRangeException serial_number):
System.Data.ProviderBase.FieldNameLookup。GetOrdinal(String fieldName) +2674398
System.Data.SqlClient.SqlDataReader。GetOrdinal(String name) +249
System.Data.SqlClient.SqlDataReader。get_Item(String name) +23
PhoneSerialNumber。GetByPhoneNumber(字符串phoneNumber,字符串国家,字符串应用)+423
UpdateMeClass。GenereteVersionTag(String Version, String PhoneNumber, String appName) +534
UpdateMe。c:'inetpub'wwwroot'me'Handlers'UpdateMe.ashx:63
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute ()+ 599
System.Web.HttpApplication。ExecuteStep(IExecutionStep step, Boolean&completedSynchronously) + 171
虽然我在异常情况下记录了3个参数,它们不是空的,但请注意,当我在同一台服务器上用相同的参数模拟相同的请求时,它正常运行。
我认为在异常的情况下,查询运行良好,但当通过此异常获取列的值时,我可能错了。
SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["meConnectionString"].ConnectionString);
connection.Open();
SqlCommand cmd;
using (connection)
{
cmd = new SqlCommand("select * from serialnumber_table join countries on country_id=countryid join applications on ApplicationID=App_ID where phone_number= @phoneNumber and country_name=@Country and app_name=@app", connection);
cmd.Parameters.AddWithValue("@phoneNumber", phoneNumber);
cmd.Parameters.AddWithValue("@Country", Country);
cmd.Parameters.AddWithValue("@app", app);
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
sn = new PhoneSerialNumber();
sn.SerialNumber = rdr["serial_number"].ToString();
sn.PhoneNumber = rdr["phone_Number"].ToString();
sn.PhoneLang = rdr["Lang"].ToString();
sn.PhoneModel = rdr["ModelName"].ToString();
sn.ApplicationVersion = rdr["App_Version"].ToString();
sn.DealerCode = rdr["dealer_code"].ToString();
sn.Size = rdr["size"].ToString();
TimeSpan Time = DateTime.Parse(rdr["Renewal_Date"].ToString()) - new DateTime(1970, 1, 1, 0, 0, 0);
sn._renewal_Date = (long)(Time.TotalMilliseconds);
rdr.Dispose();
connection.Dispose();
return sn;
}
}
sn = new PhoneSerialNumber();
sn.SerialNumber = null;
sn.PhoneNumber = null;
sn.PhoneModel = null;
sn.PhoneLang = null;
sn.ApplicationVersion = null;
sn.DealerCode = null;
connection.Dispose();
return sn;
}
唯一想到的是,由于某种原因,当您运行查询时,没有返回serial_number
列。而不是做一个SELECT *
,试着在你试图返回的每个单独的列上做一个选择。
您的序列号列是否在任何其他表中重复?有任何源视图吗?!如果serial_number
来自视图,并且更改了底层表,则可能需要重新构建它,以便为视图显示适当的列。
我唯一一次看到异常作为列名是当指定的列在当前数据阅读器中不存在时,比如它一开始就没有被选中或根本不存在
这只是一个猜测,但也有可能您将rdr处理了两次。一次使用using语句,它转换成try/finally块,一次显式地在return语句之前使用PhoneSerialNumber。net在你处置已经在处置的东西时抛出异常。
考虑到您只提供了"serial_number"作为异常的原因(它不可能是异常本身),我认为罪魁祸首是这一行:
sn.SerialNumber = rdr["serial_number"].ToString();
这个值很有可能为空。
如果问题是列实际上不存在,我会问这个表是否是动态生成的,并且有人没有正确地完成他们的工作。
serial_number包含null的可能性是好的,它返回为DBNull.Value。尝试使用rdr["serial_number"]代替rdr["serial_number"]. tostring ().
同时,避免使用SELECT *。它返回的数据比需要的多,这会增加网络流量,并且SELECT中的命名列会产生更好的错误消息。
TimeSpan Time "时间是一个关键字,使用更有意义的变量名,你是否使用所有字段从选择查询..?Select *