此代码在 Windows Server 2008 R2 和 SQL Server 2008 R2 Express 中的 IIS.7 上运行 ASP.NET。
这是一个简单的函数,它根据 3 个参数从数据库中进行选择,并返回包含所选行的对象。
此代码在大多数情况下运行正常,但在某些情况下,我会遇到名为 serial_number
的异常,它是数据库表中的列名。
这是一个完整的异常(exception):
[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(String phoneNumber, String Country, String app) +423
UpdateMeClass.GenereteVersionTag(String Version, String PhoneNumber, String appName) +534
UpdateMe.ProcessRequest(HttpContext context) in 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
来自 View 并且您更改了基础表,则可能需要重建它以便为 View 显示正确的列。
我唯一一次看到列名异常是当前数据读取器中指定的列不存在,就像它一开始就没有被选中或者根本不存在一样
关于c# - SQL Server 2008 的 .NET 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8580181/