Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server 2008的.NET异常_C#_.net_Sql Server 2008_Iis 7 - Fatal编程技术网

C# SQL Server 2008的.NET异常

C# SQL Server 2008的.NET异常,c#,.net,sql-server-2008,iis-7,C#,.net,Sql Server 2008,Iis 7,此代码在windows server 2008 R2和SQL server 2008 R2 Express中的IIS.7上运行ASP.NET 这是一个简单的函数,它根据3个参数从数据库中进行选择,并返回包含所选行的对象 这段代码大部分时间都正常运行,但在某些情况下,我会遇到一个名为serial\u number的异常,它是数据库表中的一个列名 这是一个完全例外: [索引自动失效例外:序列号] System.Data.ProviderBase.FieldNameLookup.GetOrdinal(

此代码在windows server 2008 R2和SQL server 2008 R2 Express中的IIS.7上运行ASP.NET

这是一个简单的函数,它根据3个参数从数据库中进行选择,并返回包含所选行的对象

这段代码大部分时间都正常运行,但在某些情况下,我会遇到一个名为
serial\u number
的异常,它是数据库表中的一个列名

这是一个完全例外:

[索引自动失效例外:序列号]
System.Data.ProviderBase.FieldNameLookup.GetOrdinal(字符串字段名)+2674398
System.Data.SqlClient.SqlDataReader.GetOrdinal(字符串名)+249
System.Data.SqlClient.SqlDataReader.get_项(字符串名)+23
PhoneSerialNumber.GetByPhoneNumber(字符串phoneNumber、字符串国家/地区、字符串应用)+423
UpdateMeClass.GeneretVersionTag(字符串版本、字符串电话号码、字符串appName)+534
c:\inetpub\wwwroot\me\Handlers\UpdateMe.ashx中的UpdateMe.ProcessRequest(HttpContext上下文):63
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +599
System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)+171

尽管我在异常情况下记录了3个参数,并且它们不为null,但请注意,当我在同一服务器上用相同的参数模拟相同的请求时,它会正常运行

我认为在这个异常的情况下,查询可以正常运行,但是当通过这个异常获取列的值时,我可能错了

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\u number
列不会被返回。不要执行
SELECT*
,而是尝试对要返回的每个列执行SELECT

序列号列是否在任何其他表中重复?有没有任何来源的观点?!如果序列号来自某个视图,并且您已更改了基础表,则可能需要重新生成该表,以便为该视图显示正确的列


我唯一一次将异常视为列名是当指定的列在当前数据读取器中不存在时,就像它不是在第一个位置被选中或根本不存在一样。我唯一想到的是,出于某种原因,当您运行查询时,未返回
序列号
列。不要执行
SELECT*
,而是尝试对要返回的每个列执行SELECT

序列号列是否在任何其他表中重复?有没有任何来源的观点?!如果序列号来自某个视图,并且您已更改了基础表,则可能需要重新生成该表,以便为该视图显示正确的列


我唯一一次看到作为列名的异常是当指定的列在当前数据读取器中不存在时,比如它不是在第一个位置被选中的,或者根本不存在,因为您只提供了“序列号”作为异常的原因(它不可能是异常本身),我相信罪魁祸首是这样的:

sn.SerialNumber = rdr["serial_number"].ToString(); 
这个值很可能为空


如果问题是该列实际上不存在,我会询问该表是否是动态生成的,是否有人工作不正常。

鉴于您只提供了“序列号”作为异常的原因(不可能是异常本身),我相信罪魁祸首是这一行:

sn.SerialNumber = rdr["serial_number"].ToString(); 
这个值很可能为空


如果问题是该列实际上不存在,我会询问该表是否是动态生成的,是否有人工作不正常。

很可能序列号包含一个null,返回为DBNull.Value。尝试使用rdr[“序列号”]作为字符串,而不是rdr[“序列号”]。ToString()


另外,避免使用SELECT*。它返回的数据比需要的多,这会增加网络流量,并且SELECT中的命名列会生成更好的错误消息。

很可能序列号包含一个返回为DBNull.Value的null。尝试使用rdr[“序列号”]作为字符串,而不是rdr[“序列号”]。ToString()


另外,避免使用SELECT*。它返回的数据比需要的要多,这会增加网络流量,并且SELECT中的命名列会生成更好的错误消息。

这只是猜测,但也有可能您两次处理rdr。一次是using语句,它转换为try/finally块,一次是在带有PhoneSerialNumber的return语句之前显式执行。当您处理已经在处理的东西时,NET抛出异常。由于没有发布任何异常,我在这里只是猜测。

这只是猜测,但也有可能您处理rdr两次。一次是using语句,它转换为try/finally块,一次是在带有PhoneSerialNumber的return语句之前显式执行。当您处理已经在处理的东西时,NET抛出异常。由于没有发布任何异常,我只是在这里猜测。

TimeSpan Time“时间是一个关键字使用更有意义的变量名也使用Select查询中的所有字段..?如果没有,请选择*

TimeSpan Time”时间是一个关键字使用更有意义的变量名也使用Select查询中的所有字段。。?如果没有,请选择*

没有称为
序列号的异常,那么您真正得到的异常是什么?您可能希望对数据库运行此查询,并确保您读取的数据不为空。rdr[“serial_number”]可能为空,对其调用.ToString()将导致与您的任何其他值一样的问题。serial_number是从我们获得的列和t