C# 从SqlDataReader读取int值

C# 从SqlDataReader读取int值,c#,ado.net,C#,Ado.net,嗨,有人能帮我从数据库中提取int值吗?我提取int值有困难,它适用于varchar,但不适用于int。有人能帮我吗 if (int.TryParse(TxtFarmerCode.Text, out intValue)) { using (SqlConnection sqlConn = new SqlConnection("Data Source=TANYA-PC;Initial Catalog=biore1;Integrated Security=True")) //here goes

嗨,有人能帮我从数据库中提取int值吗?我提取int值有困难,它适用于varchar,但不适用于int。有人能帮我吗

if (int.TryParse(TxtFarmerCode.Text, out intValue))
{
   using (SqlConnection sqlConn = new SqlConnection("Data Source=TANYA-PC;Initial Catalog=biore1;Integrated Security=True")) //here goes connStrng or the variable of it
   {
      sqlConn.Open();
      string sqlQuery = @"SELECT farmername,villagename,gender,farmsize FROM cottonpurchase WHERE farmercode = @code";

      using (SqlCommand cmd = new SqlCommand(sqlQuery, sqlConn))
      {
         cmd.Parameters.Add("@code", SqlDbType.Int).Value = intValue;
         using (SqlDataReader reader = cmd.ExecuteReader())
         {;
            if (reader.Read())
            {
               TxtFarmerName.Text = (string)reader[0];
               TxtVillageName.Text = (string)reader[1];
               TxtGender.Text = (string)reader[2];
            }
            else
               MessageBox.Show("For Farmer Code " + intValue.ToString() + " there is no farmer in the database.");
         }
      }
   }
}
我想取txtfarmersize,它是int,但不知道怎么做,请帮助我?

这应该可以:

txtfarmersize = Convert.ToInt32(reader["farmsize"]);
使用GetInt方法

reader.GetInt32(3);
调用
ToString()
,而不是强制转换读取器结果

reader[0].ToString();
reader[1].ToString();
// etc...
如果要获取特定的数据类型值(
int
),请尝试以下操作:

reader.GetInt32(index);
你可以用

reader.GetInt32(3);
从数据读取器读取32位整数

如果您知道数据的类型,我认为最好使用强类型的
Get*
方法进行读取,而不仅仅是读取对象并进行强制转换

你考虑过使用吗

reader.GetInt32(reader.GetOrdinal(columnName)) 

而不是通过位置进入。这使您的代码不那么脆弱,如果您将查询更改为在现有列之前添加新列,代码也不会中断。如果要在循环中执行此操作,请先缓存序数。

根据Sam Holder的答案,您可以为此创建扩展方法

TxtFarmerSize.Text = (int)reader[3];
namespace adonet.extensions
{
  public static class AdonetExt
  {
    public static int GetInt32(this SqlDataReader reader, string columnName)
    {
      return reader.GetInt32(reader.GetOrdinal(columnName));
    }
  }
}
像这样使用它

using adonet.extensions;

//...

int farmsize = reader.GetInt32("farmsize");

假设SqlDataReader中没有GetInt32(字符串)-如果有,只需使用其他方法名即可

Does
using(SqlDataReader=cmd.ExecuteReader()){;
抛出一个语法错误?应该存在吗?;txtfarmersize是表单上字段的名称或文本框控件的ID?我觉得有义务指出,您直接从UI代码访问数据库,这是一种糟糕的做法。如果存在错误,在访问数据库时,应用程序将冻结DB错误您的整个应用程序将崩溃,如果您在那里修改DB查询,您将导致错误,除非您记得保持DataReader索引同步。如果任何人都要使用此应用程序,我可以建议您对正确的应用程序设计进行一些背景阅读吗?@Brad:正如您所知,至少在本例中,它不会导致语法错误micolon只是一个空语句。除了允许您将其用作断点之外,它实际上没有做任何特殊的事情。另一方面,如果代码与您所显示的完全相同,而没有任何其他内容,那么这将是一个语法错误(括号不匹配)@Jeff啊非常有趣。这是一个很酷的工具。谢谢。你是说强制转换字符串不会调用ToString()吗?有没有类似的方法来获取字符串(varchar)?例如reader.GetVarchar(reader.getOrdinal(columnName))刚刚找到它。reader.GetString(reader.getOrdinal(columnName))@如果值为null,您将得到一个异常。您可以使用reader.IsDBNull(reader.GetOrdinal(columnName))检查空值并采取适当行动。这是开发中真正困扰我的事情之一——我一直在做这件事——为了正确读取整数,你仍然需要跳转。是的,我知道,日期和时间更糟糕(给我一个整数,我已经结束了。很抱歉,请看我刚才添加的答案,可以使用扩展方法,如果在开箱即用的话,那就太好了。)