c# - SQL Server 2008 的 .NET 异常

标签 c# .net sql-server-2008 iis-7

此代码在 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/

相关文章:

c# - 返回字符串时 URL 帮助器方法测试失败

c# - 带有 Html.EditorFor 的表格

.net - MSChart - 在 X 轴缩放上自动缩放 Y 轴

c# - 从 ServiceHost 获取端口号

sql - 返回所有值,包括 NULL

c# - 如何使用 web api 发送和接收文件

c# - ASP.Net 双重 OWIN 身份验证 - 如何防止非 AD 用户重定向到 AzureAD 登录

c# - .NET 3.5 中的 FormsAuthentication.Timeout.TotalMinutes

sql - 如何使用 SQL Server 2008 将一行复制到同一个表中

sql-server - SQL Server 2008 中存储文档的最佳策略